作爲一個非常簡單的例子,我想在按下按鈕時在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++會有點難看,因爲之後沒有人會清理。我嘗試了以下東西:
shared_ptr
。沒有運氣,只要方法結束,窗口即爲delete
d,這意味着新窗口出現一瞬間並再次消失。不太好。exec()
,而不是show()
。這將工作模態對話框,但文檔似乎意味着它也停止事件循環,您應該定期調用QApplication::processEvents()
如果仍然需要更新。我在這裏理解得不多,但我想這也不算太好。deleteLater()
。不幸的是,只是顯示一個窗口並不會阻止deleteLater
,所以它一出現就消失。
是否有一個很好的選擇,當我關閉它後清理窗口?
我找不到'exec'這一建議在文檔的任何地方再次,可能是因爲它只是對可疑值的一些隨機博客。並感謝這個屬性。我搜索了至少一個小時(+實驗的編譯時間),直到我偶然發現只連接完成的信號(這不是最佳的但足夠用於我的目的)。 – Joey 2013-04-04 15:07:12
它在這個.cpp文件http://qt.gitorious.org/qt/qt/blobs/4.8/src/gui/dialogs/qdialog.cpp#line562實際上記載很清楚;) – Chris 2013-04-04 15:12:21
我指的是我寫的在關於'processEvents'的問題中。 'exec'停止父事件循環相當明顯,因爲它阻塞了;還必須爲對話創建一個新的。 – Joey 2013-04-04 15:17:58