【发布时间】:2013-01-16 23:03:18
【问题描述】:
我目前正在尝试将我的 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 版起已解决。
【问题讨论】:
-
如果你有时间,试试这个看看我能不能回答这个问题:调用`event->accept();`作为第一个函数(禁用完全关闭应用程序),看看窗口是否尽管单击关闭按钮,仍将保持可见。
-
我不确定我是否理解正确:我只是用
event->accept();和event->ignore();替换了函数体。在这两种情况下,窗口都关闭了,但在后一种情况下,它在后台保持活动状态。 -
出于好奇,做 QTimer::singleShot(0, this, SLOT(show()) 有什么效果吗?
-
哪个版本的 Qt?我在 Mac OX 10.8.2 上使用 4.8.1,它工作正常。
-
我在 Snow Leopard 上使用 Qt 5.0.0。同样的影响也发生在最近的一只山狮身上。