2016-05-01 60 views
-1

私はQtでC++アプリケーションを作成していますが、特定の関数の実行が終了した後で、コードでダイアログウィンドウを閉じます(this->exec();で開く)。Qt:exec()で開いたダイアログウィンドウを閉じる方法は?

私はQt 5.6を使用しています。

ありがとうございます!ここで

は(Worker、ダイアログクラスである)は動作しません私のコードの例です。

void MainWindow::on_pushButton_2_clicked() 
{ 
    //When Start button clicked: 
    Worker worker; 
    worker.exec(); 
    //worker.run(1); 
    worker.accept(); 
} 

pushButton_2がクリックされたときに、私はダイアログはそれが現在の進行状況を示します開きたいですそれが終わったら、私はそれを閉じたい。

+0

http://doc.qt.io/qt-4.8/qwidget.html#close – LogicStuff

+0

@LogicStuff私は 'close()'を使用しましたが、動作しませんでした。 –

答えて

4

は今、あなたはより多くのコードを投稿....

worker.exec(); 
worker.accept(); // or worker.close(); 

exec()開始QDialogイベントループを処理し、完了した場合にのみ返されます(accept()reject()またはdone(int)が呼び出された後) 。したがってworker.accept()には届きません(デバッガを使用している場合は表示されます)。ユーザーアクション(ボタンをクリックしてインスタンス)後には、workerによって呼び出されなければなりません。あなたがする何を意味するのか

は次のとおりです。

worker.show(); 
QThread::sleep(2); // wait for 2 seconds 
worker.accept(); 

その後、worker.accept()がある時点で実行されます。ダイアログが表示されますが、モーダルです。


(編集前の)古いポストに:

ユーザがCancelをクリックしたかのようにやってOKまたはreject()をクリックしたかのようにあなたがするaccept()を呼び出すことができます。

slotsであることに注意してください。signalを接続して起動することができます(たとえば、機能の実行が完了したときに放出される信号)。

例:

void MyDialog::doSomethingAndClose() 
{ 
    // do your stuff here 
    accept(); // will close the dialog 
} 

か:

void MyDialog::doSomethingAndClose() 
{ 
    // do your stuff here 
    emit weAreDone(); 
} 

以前(例えばMyDialogコンストラクタで)接続している場合:

connect(this, SIGNAL(weAreDone()), this, SLOT(accept())); 
+0

@FlareCat:何か問題があった場合を除いて、これはすべきです。私はあなたが 'this-> exec()'をして驚いています。あなたはクラスのコンストラクタから呼び出すのではないですか?クラスの外から 'exec()'を呼び出そうとしましたか(エンティティにダイアログ呼び出しの作成方法を伝えさせてください)。 – jpo38

+1

@FlareCat:もっとコードを投稿する必要があります。私たちが助けるために十分なコードを投稿していませんでした。あなたは何も投稿していません。一般的なルールは 'accept()'、 'reject()'または 'done()'を呼び出してダイアログの 'exec()'ループを中断させることです。 – jpo38

+0

[OK]を私のコードの一部を追加する私の質問を編集しました。与えられたコードは私の 'mainwindow.cpp'にあります。 –

0

カスタム信号をQDialog::done(int)に接続して、関数の実行が完了した後に信号を出力するだけです。

編集
+0

簡単な例がありますか?私はQtを少し新しくしており、これが何を意味するのかについては必ずしも確かではありません。 (私はシグナルとスロットを認識しています) –

0

私が学んだように、問題自動的に更新されないguiによって引き起こされます。

Hereは、この問題を解決するSOの質問へのリンクです。

関連する問題