【问题标题】:In Qt app how to capture "Cmd-Q" or "Quit" menu click在 Qt 应用程序中如何捕获“Cmd-Q”或“退出”菜单点击
【发布时间】:2013-11-23 00:21:01
【问题描述】:

在我的 Qt 应用程序中,我有一个退出例程,它在最终退出之前优雅地清理所有内容,否则可能会在某处发生崩溃。该应用程序在系统托盘中运行,并且为系统托盘图标定义了一个“退出”菜单。在 quitAction 上,我设置了菜单角色,以便它与 Mac 的应用程序菜单合并,但我没有看到我的插槽被调用。代码如下:

QAction *quitAction = new QAction(tr("&Quit"), this);
quitAction->setMenuRole(QAction::QuitRole);
connect(quitAction, SIGNAL(triggered()), this, SLOT(quittingApp()));

我也尝试在 QApplication 上捕获 QCloseEvent,但即使这样似乎也不起作用。

bool MyApplication::event(QEvent *ev)
{
    bool eaten = false;
    switch (ev->type())
    {
    case QEvent::Close:
    {
        quittingApp(); //My quit cleanup routine
        eaten = true;
        break;
    }
    default:
        eaten = QApplication::event(ev);
        break;
    }
    return eaten;
}

我在这里遗漏了什么吗?在退出期间调用我自己的清理例程的最佳方法是什么?

【问题讨论】:

    标签: macos qt qmenu qevent qaction


    【解决方案1】:

    连接到QCoreApplication::aboutToQuit 信号是执行最后一秒清理的最佳方式。

    【讨论】:

    • 该信号发出后,事件循环将立即退出。但在这种情况下,我的清理过程不会真正完成,因为它是一个逐步清理过程,需要运行事件循环。
    • @SoumyaDas:您总是可以旋转本地事件循环 :)
    • 无论如何,我什至没有看到连接到 QCoreApplication::aboutToQuit 信号的插槽被调用,所以当用户点击 Cmd-Q 时,我真的不知道如何进行自己的清理退出。
    • 这确实不能回答问题。一个具体如何捕获菜单退出命令来对其进行分类 - 也许一个人不应该退出或其他事情需要处理,因此退出需要被取消。例如:捕获菜单退出而不是从属窗口关闭按钮?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 2019-03-12
    • 2011-12-30
    • 2019-01-19
    • 1970-01-01
    • 2019-11-24
    相关资源
    最近更新 更多