Qt主窗口关闭事件Mac Cmd+Q

8
在OS X 10.9上,使用Qt 5.2和以下应用程序代码:
#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个回答

10
默认情况下,在Mac上,如果没有菜单栏中的退出或关闭项,Qt将创建一个苹果菜单 | 退出。这个默认创建的条目将调用 QApplication::quit() ,这不会触发 MyWindow::closeEvent()
在您的UI中,应添加一个名为“Exit”的菜单项(在Mac上,它将被自动重命名为Quit),并在MyWindow类构造函数中将该操作连接到close()槽(它从QWidget继承)。
更新-对于您的其他问题,析构函数可能仅用于释放内存(释放文件锁等)。任何可能涉及用户交互的东西(如提示文件位置或通过QMessageBox向用户警告失败)都需要放在closeEvent方法中。保存窗口几何图形(以及使用QSettings保存的其他简单项目)也应通过closeEvent完成(尽管我看过将几何图形保存在析构函数中的代码,但可能会有一些边缘情况导致它做出意外的事情)。

感谢您的快速和正确的回复,完美地回答了最初的问题。我编辑了我的问题,使其更加通用,也许您可以发表评论。 - Nikolaus Demmel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接