Modal QMessageBox的行为与本机Windows对话框不同

时间:2012-10-29 09:33:11

标签: c++ qt modal-dialog messagebox

我的应用程序有一个对话框,通过QMessageBox询问用户是否要放弃他所做的或想要继续编辑的所有更改。我希望这个对话框是整个应用程序的模态。

我在某处读到这是QMessageBox的标准行为,所以我不必明确地用以下内容设置它:

mbox.setWindowModality(Qt::ApplicationModal);

我想知道为什么它的行为与操作系统中的其他模态对话框不同(在我的例子中是Windows 7)。一方面,它的功能就像它应该的那样,即应用程序中的所有其他输入方法都被阻止,直到用户回答对话框为止。但是,如果用户单击应用程序的任何其他窗口,它不会“闪烁”*。有没有办法让Qt像原生的Windows对话框一样?

提前致谢!


* 如果你不知道这个'闪烁'是什么意思:只需在Windows操作系统上打开记事本,输入一些文字然后尝试关闭它。弹出一个对话框,要求保存,放弃或继续编辑。现在单击编辑器窗口中的某个位置 - >对话框的边框和标题栏会闪烁/闪烁几次。

2 个答案:

答案 0 :(得分:5)

当消息框没有父项时,会出现问题。这对我来说很好:

QMessageBox box(this);
box.setStandardButtons(QMessageBox::Close);
box.exec();

但这不是:

QMessageBox box;
box.setStandardButtons(QMessageBox::Close);
box.exec();

这是有道理的......消息框不能闪烁,除非它知道它的父节点已被点击。

答案 1 :(得分:1)

我想到了一个简单的解决方案,如果您只想在Windows上部署应用程序,则应#include <windows.h>并使用 MessageBoxA API。

除此之外,这在Windows和ubuntu

中对我很有用
if (QMessageBox::question(this,"Close?","Close this dialog?",QMessageBox::Yes,QMessageBox::No) == QMessageBox::Yes)
{
    this->close();
}