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

Abu*_*akr 12 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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

asc*_*pix 1

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

Qt Creator 中的窗口模式

我认为这个问题是由 Mac OS X UI 和其他 UI 之间的差异引起的。也许 Qt 上的一些额外工作将使他们能够解决这个问题。

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