在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
中执行确认查询?
答案 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
完成(但是,我已经看到了在析构函数中保存几何的代码,可能会出现一些边缘情况意外的事情。)