Qt MainWindow CloseEvent Mac Cmd + Q.

时间:2014-04-24 16:44:42

标签: 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(); }

其中MyWindow派生自QMainWindow并覆盖closeEvent(QCloseEvent*)方法,当我关闭应用程序窗口时调用此方法(例如,单击windows(x)关闭按钮),但它我通过主菜单关闭应用程序时未调用 - &gt; &#34;退出&#34;或通过&#34; CMD + Q&#34;关键捷径。

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

编辑:除了上述关闭应用程序的方法外,是否还有其他我应该处理的实例,这些实例会导致QApplication::quit而不是调用窗口&#39 ; close事件?例如系统关闭怎么样?

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

1 个答案:

答案 0 :(得分:9)

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

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

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