关闭应用程序调用两次closeevent

7

我在Mac OS X上使用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();
        }
    }
}

当使用红色十字或菜单“退出”关闭时,对话框正确显示。

但是,当我使用在dock中图标上右击关闭应用程序时,对话框会出现两次,并且关闭事件被调用两次。

有任何想法为什么会这样?


什么操作系统?许多Linux桌面环境也支持Dock。 - cmannett85
@cmannett85 这是OSX。 - Seb
@Seb 如果您取消第一个对话框而不是接受它,第二个对话框会出现吗? - adnan kamili
2个回答

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。这样第二次就不会做任何事情(处理将被跳过)。这对我很有效。


你有没有找到关于这种问题的其他解决方案或解释?我只是在使用 Command + Q 时遇到了这个问题。 - htzfun

2
看起来这是QT的一个bug: 请参见: https://bugreports.qt.io/browse/QTBUG-43344 在使用qt-5.6_4时也遇到了这个问题, 在我的情况下,使用CMD+Q时会出现这个问题,但是使用红色x按钮时不会出现。
我使用了类似的补丁。 我避免使用acceptignore,因为这是一个bug,我认为我们不应该“与之交谈” :-)
相反,当被调用超过一次时,我只需返回即可。
static int numCalled = 0;
if (numCalled++ >= 1)
    return;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接