退出应用程序调用两次closeevent

时间:2015-05-06 06:01:33

标签: c++ macos qt qdialog

我在OSX上用Qt / c ++编写了一个应用程序。退出应用程序时,我正在捕捉closeevent以显示对话框

void MainUI::closeEvent (QCloseEvent *event)
{
    if( DeviceUnplugged == false) {
        ExitDialog = new DialogExit;
        ExitDialog->exec();
        if(ExitDialog->result() == QDialog::Accepted) {
            m_device.CloseDevice();
            event->accept();
        }
        else {
            event->ignore();
        }
    }
}

使用红叉或使用菜单"退出"关闭时,对话框会正确显示。

但是当我通过右键单击停靠栏中的图标关闭应用程序时,对话框会出现两次,关闭事件被调用两次。

知道为什么吗?

2 个答案:

答案 0 :(得分:2)

是的,我认为这对Mac来说是正常的,至少我在我的Qt应用程序中也有这个(仅限Mac)。

我使用了以下解决方法:

void MainUI::closeEvent (QCloseEvent *event)
{
    if (m_closing)
    {
        event->accept();
        return;
    }
    if( DeviceUnplugged == false) {
        ExitDialog = new DialogExit;
        ExitDialog->exec();
        if(ExitDialog->result() == QDialog::Accepted) {
            m_device.CloseDevice();
            m_closing = true;
            event->accept();
        }
        else {
            event->ignore();
        }
    }
}

默认情况下,布尔变量m _ closing当然应该由false初始化。这样第二次什么都不做(处理将被跳过)。这对我有用。

答案 1 :(得分:2)

看起来这是一个QT错误: 请参阅:https://bugreports.qt.io/browse/QTBUG-43344

使用qt-5.6_4时,也遇到此问题,
在我的情况下,它发生在使用CMD + Q时,但在使用红色x按钮时没有发生。

使用类似的补丁 我避免接受忽略,因为这是一个错误,我认为我们不应该“与它交谈”:-)

相反,我只是在被召唤一次时返回。

static int numCalled = 0;
if (numCalled++ >= 1)
    return;