【问题标题】:HowTo correctly close QDialog when main windows is hidden?隐藏主窗口时如何正确关闭对话框?
【发布时间】:2015-08-13 08:20:11
【问题描述】:

我遇到了一些难题。

我正在使用:

  • MSVS 2008
  • Qt 4.7.3(带有 Qt VS 插件 1.1.9)

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

MainWindow w;
//w.show();

return app.exec();

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

这里是动作槽:

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

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

我做错了什么?

谢谢!

【问题讨论】:

  • 什么是“解决方案没有帮助” - 应用程序还在关闭吗?你能展示拒绝()的实现吗?您不是偶然调用那里的基本实现吗?
  • 你有信号QApplication::lastWindowClosed() (doc.trolltech.com/4.7/qapplication.html#lastWindowClosed)的连接吗?

标签: c++ qt


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    刚刚发现另一个似乎更好的选项是覆盖 QDialog 的 closeEvent 以仅隐藏它。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-21
      • 1970-01-01
      • 2017-06-07
      相关资源
      最近更新 更多