如何隐藏主窗口时正确关闭QDialog?

时间:2011-11-02 10:58:57

标签: c++ qt

我有某种困境。

我正在使用:

  • MSVS 2008
  • Qt 4.7.3(使用Qt VS Add-in 1.1.9)

我写了一个基于QMainWindow类的小型Qt应用程序,其中还存在 settings 对话框(QDialog)。每个在GUI模式下都能正常工作。之后我开始更改我的项目,使其仅在托盘中可见。只需在main.cpp show()方法中发表评论,如下所示:

MainWindow w;
//w.show();

return app.exec();

但是从托盘中,我需要启动 settings 对话框,该对话框在mainwindow.h / .cpp文件中实现。我添加到托盘菜单操作(QAction),它启动了设置对话框。这出现了意想不到的问题:当我尝试使用[X]关闭按钮(在右上角)关闭此设置对话框时,我的应用已关闭

以下是操作槽:

void MainWindow::onOpenSettingsDlgClicked()
{
     SettingsDlg dlg( this );
     dlg.exec();
}

我尝试为设置对话框类重新实现virtual reject()方法,并且只设置hide()函数,但该解决方案没有帮助。

我做错了什么?

谢谢!

2 个答案:

答案 0 :(得分:5)

您应该关闭默认启用的quitOnLastWindowClosed属性,如文档中所定义(http://doc.qt.nokia.com/latest/qapplication.html#quitOnLastWindowClosed-prop)

这就是说,您必须自己处理QApplication的终止,也可以在托盘菜单中输入[quit]条目。

答案 1 :(得分:0)

刚刚找到另一个看起来更好的选项是覆盖QDialog的closeEvent以仅隐藏它。

void PrefDialog::closeEvent(QCloseEvent *event) {
    this->hide();
    event->ignore();
}

我发现这似乎更好,因为它不会改变全局应用程序行为。