12

我目前正在尝试将我的 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();
}

预期的行为如下:如果单击“Abort”,则忽略该事件并且窗口保持打开状态。这在 Linux 和 Windows 上按预期工作。然而,在 OSX 上,该窗口是隐藏的,但在后台仍处于活动状态。我在这里想念什么?如何确保窗户保持打开状态?

更新: 我不知何故认为这是 Qt5 的问题。如果该closeEvent方法不包含任何内容,但event->ignore();窗口仍处于关闭状态。我不认为这是预期的行为。也许我应该将此问题发布到 Qt 邮件列表...</p>

更新:这是 Qt 中的一个错误,自 5.1 版起已解决。

4

5 回答 5

1

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

Qt Creator 中的 windowModality

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

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

于 2013-02-05T19:55:59.160 回答
1

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

我相信每次你忽略应该做的伎俩时,只需在宏show()之间放置。像这样的东西:Q_OS_MACevent

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

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

于 2013-02-05T20:16:46.713 回答
1

代替

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

尝试做

case QMessageBox::Abort:
                       event->ignore();
                       return;
 default:
         break
于 2013-02-06T06:24:49.413 回答
0

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

于 2013-04-27T09:57:52.857 回答
0

丑陋的解决方法(经过测试和工作),在 event->ignore() 之后添加:

QTimer::singleShot(0,this,SLOT(hide()));
QTimer::singleShot(100,this,SLOT(show()));
于 2013-04-27T16:31:49.507 回答