Qt MainWindow CloseEvent Mac Cmd + Q.

Nik*_*mel 6 c++ macos qt

在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(); }
Run Code Online (Sandbox Code Playgroud)

MyWindow派生QMainWindow和覆盖closeEvent(QCloseEvent*)方法的地方,当我关闭应用程序窗口时调用此方法(例如,单击windows(x)关闭按钮),但是当我通过主菜单关闭应用程序时,不会调用它 - >"退出"或通过"CMD + Q"键快捷键.

通过浏览网页和众多问题,我得到的结论是关闭应用程序应调用所有顶级窗口的closeEvent.这不是这种情况,或者这里出了什么问题?

编辑:除了上面关闭应用程序的方法之外,还有其他我一般应该处理的实例,QApplication::quit而不是调用窗口的close事件吗?例如系统关闭怎么样?

在处理close事件时,我确认用户确实想要退出,我确保清理就像写回更改的设置一样.我是否可以将清理/保存设置移到析构函数中并执行确认查询closeEvent

Lin*_*lle 9

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

在你的用户界面中,你应该添加一个名为Exit的菜单项(在Mac上它将自动重命名为Quit),在MyWindow类构造函数中你应该将该动作连接到close()插槽(继承自QWidget).

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