即使忽略QCloseEvent,也会隐藏窗口

时间:2013-02-01 15:29:17

标签: c++ macos qt qt5

我目前正在尝试将我的Qt应用程序移植到Mac OSX,并且遇到了以下问题:

我的一个窗口类(派生自QMainWindow)在按下关闭按钮时会显示一个对话框,您可以在其中保存/放弃更改或中止。这是通过重新实现closeEvent来完成的,如下所示:

void ResultsWindow::closeEvent(QCloseEvent* event)
{
    if (isWindowModified())
    {
        activateWindow();
        QMessageBox::StandardButton button = QMessageBox::warning(
                this,
                APPLICATION_NAME,
                "Warning: data have been modified. Do you want to save the "
                    "changes?",
                QMessageBox::Save | QMessageBox::Discard | QMessageBox::Abort,
                QMessageBox::Abort);
        switch (button)
        {
            case QMessageBox::Save:
                if (!Save())
                {
                    event->ignore();
                    return;
                }
                break;
            case QMessageBox::Discard:
                break;
            case QMessageBox::Abort:
            default:
                event->ignore();
                return;
        }
    }
    event->accept();
}

预期的行为如下:如果单击“中止”,则忽略该事件并且窗口保持打开状态。这在Linux和Windows上按预期工作。但是,在OSX上,窗口是隐藏的,但在后台仍然有效。我在这里错过了什么?如何确保窗口保持打开状态?

更新 我不知何故认为这是Qt5的一个问题。如果closeEvent方法只包含event->ignore();,则窗口仍然关闭。我不认为这是预期的行为。也许我应该把这个问题发布到Qt邮件列表......

更新: 这是Qt中的一个错误,自5.1版本开始解决。

5 个答案:

答案 0 :(得分:1)

与Qt 5.0.0或Qt 5.0.1相同。 但是,如果将WindowModality设置为ApplicationModal或WindowModal,则它可以正常工作。按Cmd + Q退出并获取消息框。

windowModality in Qt Creator

我认为问题源于Mac OS X UI与其他UI之间的差异。也许关于Qt的一些额外工作将使他们能够解决问题。

即使您重新实现QMainWindow :: event(),您也会获得相同的结果。

答案 1 :(得分:1)

我在Mac 10.7上安装了Qt 4.7,但我无法重现此错误。

我相信每次忽略show()时,只需将Q_OS_MAC放在event宏之间即可。像这样:

event->ignore();
#ifdef Q_OS_MAC
     show();
#endif

这可能不是一个完美的解决方案,但肯定能解决这个问题。

答案 2 :(得分:1)

而不是

case QMessageBox::Abort:
                default:
                        event->ignore();
                        return;

尝试做

case QMessageBox::Abort:
                       event->ignore();
                       return;
 default:
         break

答案 3 :(得分:0)

当我也遇到这个错误时,我在这里创建了一个错误报告:https://bugreports.qt-project.org/browse/QTBUG-30899

答案 4 :(得分:0)

丑陋的解决方法(已测试并正常工作),在事件后添加此项 - > ignore():

QTimer::singleShot(0,this,SLOT(hide()));
QTimer::singleShot(100,this,SLOT(show()));