4

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

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

mbox.setWindowModality(Qt::ApplicationModal);

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

提前致谢!


*如果您不知道我所说的“闪烁”是什么意思:只需在 Windows 操作系统上打开记事本,输入一些文本并尝试关闭它。弹出一个对话框,要求保存、丢弃或继续编辑。现在单击编辑器窗口上的某处-> 对话框的边框和标题栏闪烁/闪烁几次。

4

2 回答 2

7

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

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

但这不会:

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

这是有道理的……消息框不能闪烁,除非它知道它的父级被点击了。

于 2012-10-29T10:57:44.667 回答
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();
}
于 2012-10-29T09:44:47.227 回答