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

Qt MainWindow CloseEvent Mac Cmd+Q

本文关键字:事件 Mac Cmd+Q 窗口 Qt      更新时间:2023-10-16

在带有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*)方法,当我关闭应用程序窗口时(例如单击windows(x)关闭按钮)会调用此方法,但当我通过主菜单->"退出"或"CMD+Q"快捷键关闭应用程序时不会调用此方法。

从浏览网页和众多问题中,我得到的印象是关闭应用程序应该调用所有顶级窗口的closeEvent。事实并非如此,还是这里出了问题?

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

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

默认情况下,在Mac上,如果不存在包含退出或退出项的菜单栏,Qt将创建一个Apple菜单|退出。默认创建的条目将调用QApplication::quit(),而不会触发您的MyWindow::closeEvent()

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

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