2013-04-04 26 views
7

作爲一個非常簡單的例子,我想在按下按鈕時在Qt中顯示一個對話框。這樣做的通常模式(以我目前工作的應用程序)似乎是如下:如何在Qt中顯示窗口並在關閉時立即刪除它?

class MainWindow { 
    ... 
private slots: 
    buttonClicked(); 
    ... 
private: 
    ChildWindow * childWindow; 
} 

MainWindow::MainWindow(QWidget * parent) : QWidget(parent) { 
    ... 
    childWindow = new ChildWindow(this); 
    ... 
} 

MainWindow::buttonClicked() { 
    childWindow.show(); 
} 

從.NET和Windows Forms(即將因爲我並不需要從其他地方訪問該對象在類)下面的模式是比較熟悉的對我說:

button1_Clicked(object sender, EventArgs e) { 
    ChildWindow f = new ChildWindow(); 
    f.Show(); 
} 

局部變量意味着我不必又一實例字段,並在內存中的窗口不會縈繞超過必要的時間長得多。直接把它翻譯成C++會有點難看,因爲之後沒有人會清理。我嘗試了以下東西:

  1. shared_ptr。沒有運氣,只要方法結​​束,窗口即爲deleted,這意味着新窗口出現一瞬間並再次消失。不太好。

  2. exec(),而不是show()。這將工作模態對話框,但文檔似乎意味着它也停止事件循環,您應該定期調用QApplication::processEvents()如果仍然需要更新。我在這裏理解得不多,但我想這也不算太好。

  3. deleteLater()。不幸的是,只是顯示一個窗口並不會阻止deleteLater,所以它一出現就消失。

是否有一個很好的選擇,當我關閉它後清理窗口?

回答

12
childWindow->setAttribute(Qt::WA_DeleteOnClose); 

另外請注意,調用exec()將阻止調用事件循環的執行,但將產生自己的事件循環,所以processEvents()沒有調用應該是必要的。

+0

我找不到'exec'這一建議在文檔的任何地方再次,可能是因爲它只是對可疑值的一些隨機博客。並感謝這個屬性。我搜索了至少一個小時(+實驗的編譯時間),直到我偶然發現只連接完成的信號(這不是最佳的但足夠用於我的目的)。 – Joey 2013-04-04 15:07:12

+0

它在這個.cpp文件http://qt.gitorious.org/qt/qt/blobs/4.8/src/gui/dialogs/qdialog.cpp#line562實際上記載很清楚;) – Chris 2013-04-04 15:12:21

+0

我指的是我寫的在關於'processEvents'的問題中。 'exec'停止父事件循環相當明顯,因爲它阻塞了;還必須爲對話創建一個新的。 – Joey 2013-04-04 15:17:58

2

您可以日對話框finished()信號連接到其deleteLater插槽:

ChildWindow * d = new ChildWindow(this); 
connect(d, SIGNAL(finished(int)), d, SLOT(deleteLater())); 
d->show(); 

這樣,這將是deleteð只要你關閉對話框。

+0

注:本作品在不需要對話結果的情況下。如果你仍然需要'finished()'的參數,那麼我不知道會發生什麼。但對於我的問題,這已經足夠了。 – Joey 2013-04-04 14:55:32

相關問題