【问题标题】:Qt MainWindow CloseEvent Mac Cmd+QQt MainWindow CloseEvent Mac Cmd+Q
【发布时间】:2021-12-23 14:24:09
【问题描述】:

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

通过浏览网络和众多问题,我得到的印象是关闭应用程序应该为所有顶级窗口调用 closeEvent。是不是这样,还是这里出了什么问题?

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

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

【问题讨论】:

    标签: c++ macos qt


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您快速而正确的回复,完美回答了最初的问题。我将我的问题编辑得更笼统一些,也许你可以发表评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多