2016-05-01 120 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()會在某個時候被執行。顯示對話框,但它是模態的。


舊後(前編輯):

您可以撥打accept()做,因爲如果用戶點擊OKreject()做,因爲如果用戶點擊Cancel

請注意,這些是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:它應該,除非你做錯了什麼。我很驚訝你做這個 - > exec()'。你不是從類構造函數中調用它的,是嗎?你有沒有嘗試從類的外部調用exec()(有實體如何創建對話框調用它)。 – jpo38

+1

@FlareCat:然後你需要發佈更多的代碼。你沒有發佈足夠的代碼來幫助我們。你沒有發佈任何內容。一般規則是調用accept(),reject()或done()來中斷對話的exec()循環。 – jpo38

+0

好吧,我編輯了我的問題來添加我的代碼的一部分。給出的代碼在我的'mainwindow.cpp'中。 –

0

只需將您的自定義信號與QDialog::done(int)連接起來,並在您的功能完成執行後發出信號。

+0

請問我能舉個簡單的例子嗎?我對Qt有點新鮮,對於這意味着什麼也沒有把握。 (我知道信號和插槽。) –

0

正如我剛剛瞭解到,這個問題是由gui沒有自動更新引起的。

Here是修復此問題的SO問題的鏈接。