9

作为一个非常简单的示例,我想在按下按钮时在 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 窗体(并且因为我不需要从类中的其他地方访问该对象),我更熟悉以下模式:

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

局部变量意味着我没有另一个实例字段,而且窗口不会在内存中停留比必要的时间更长的时间。将其直接翻译成 C++ 会有点难看,因为事后没人会澄清。我尝试了以下事情:

  1. shared_ptr. 不走运,delete只要方法结​​束,窗口就会 d,这意味着新窗口会出现一瞬间然后又消失了。不太好。

  2. exec()而不是show(). 这适用于模态对话框,但文档似乎暗示它也会停止事件循环,QApplication::processEvents()如果仍需要更新,您应该定期调用。我在这里了解得很少,但我想这也不太好。

  3. deleteLater(). 可悲的是,仅显示一个窗口并不会阻塞deleteLater,因此它一出现就消失了。

关闭窗口后是否有一个不错的选择来清理它?

4

2 回答 2

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

另请注意,调用exec()将阻止调用事件循环的执行,但会产生自己的事件循环,因此不需要调用processEvents()

于 2013-04-04T14:58:00.913 回答
3

您可以将finished()对话框的信号连接到其deleteLater插槽:

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

delete这样,一旦您关闭对话框,它将立即变为d。

于 2013-04-04T14:52:37.057 回答