【问题标题】:Quit application call twice the closeevent两次关闭事件退出应用程序调用
【发布时间】:2015-07-16 02:47:09
【问题描述】:

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

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 DE 也支持扩展坞。
  • @cmannett85 这是 OSX
  • @Seb 如果取消第一个对话框而不是接受,是否会出现第二个对话框

标签: c++ macos qt qdialog


【解决方案1】:

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

在使用 qt-5.6_4 时也遇到了这个问题,
就我而言,它在使用 CMD+Q 时发生,但在使用红色 x 按钮时没有发生。

使用了类似的补丁。
我避免了 acceptignore,因为这是一个错误,我认为我们不应该“与之交谈”:-)

相反,我只是在多次调用时返回。

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

【讨论】:

    【解决方案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 就发现了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多