Qt MainWindow CloseEvent Mac Cmd+Q

Posted

技术标签:

【中文标题】Qt MainWindow CloseEvent Mac Cmd+Q【英文标题】: 【发布时间】:2014-04-24 16:44:41 【问题描述】:

在带有 Qt 5.2 和以下应用程序代码的 OS X 10.9 上

#include "mywindow.h"
#include <QApplication>

int main(int argc, char *argv[]) 
    QApplication a(argc, argv);
    MyWindow w();
    w.show();
    return a.exec(); 

其中MyWindow 派生自QMainWindow 并覆盖closeEvent(QCloseEvent*) 方法,当我关闭应用程序窗口时会调用此方法(例如单击窗口(x)关闭按钮),但在我关闭时不会调用它应用程序通过主菜单 -> “退出”或通过“CMD + Q”快捷键。

通过浏览网络和众多问题,我得到的印象是关闭应用程序应该为所有***窗口调用 closeEvent。是不是这样,还是这里出了什么问题?

编辑:除了上述关闭应用程序的方法之外,我通常应该处理的任何其他实例会导致QApplication::quit,而不是调用窗口的close 事件?例如,系统关闭会怎样?

在处理close 事件时,我确认用户确实想要退出,并且我确保正在进行清理,例如写回更改的设置。我是否应该将清理/保存设置移动到析构函数并在closeEvent 中进行确认查询?

【问题讨论】:

【参考方案1】:

在 Mac 上默认为Qt will create an Apple Menu | Quit if a menubar doesn't exist with either quit or exit entry。默认创建的条目将调用QApplication::quit(),这不会触发您的MyWindow::closeEvent()

在您的 UI 中,您应该添加一个名为 Exit 的菜单项(在 Mac 上,它会自动重命名为 Quit)并在 MyWindow 类构造函数中,您应该将该操作连接到 close() 插槽(继承自QWidget)。

更新- 为了解决您的其他问题,析构函数可能只用于释放内存(释放文件锁等)。任何可能涉及用户交互的内容(例如提示文件位置或通过 QMessageBox 提醒用户某事失败)都需要进入closeEvent 方法。保存窗口几何图形(以及使用QSettings 的其他简单项目)也应该通过closeEvent 完成(不过,我已经看到在析构函数工作中保存几何图形的代码,可能存在一些边缘情况,它会做意想不到的事情)。

【讨论】:

感谢您快速而正确的回复,完美回答了最初的问题。我将我的问题编辑得更笼统一些,也许你可以发表评论。

以上是关于Qt MainWindow CloseEvent Mac Cmd+Q的主要内容,如果未能解决你的问题,请参考以下文章

Qt closeEvent的使用

Qt Designer PyQt5 覆盖 CloseEvent 子窗口不起作用

PyQt 的 QMainWindow closeEvent 永远不会被调用

如何从 closeEvent 处理使用 PyQt4 检测注销/关闭?

qt里closeevent是私有还是公有

QWidget closeEvent(...) 没有被 QProcess::terminate() 调用