【发布时间】:2011-10-08 21:40:58
【问题描述】:
我不明白为QMessageBox 设置父级有什么好处,例如在以下代码中:
void mainWindow::showMessage(QString msg) {
QMesageBox::information(this, "title", msg); //'this' is parent
}
有人可以帮帮我吗?
【问题讨论】:
标签: c++ qt qmessagebox
我不明白为QMessageBox 设置父级有什么好处,例如在以下代码中:
void mainWindow::showMessage(QString msg) {
QMesageBox::information(this, "title", msg); //'this' is parent
}
有人可以帮帮我吗?
【问题讨论】:
标签: c++ qt qmessagebox
可能有几件事。首先QMessageBox继承自QDialog。由于QDialog 有父级的概念,所以QMessageBox 也应该保持一致。
具体来说,文档说:
parent 被传递给 QDialog 构造函数。
至少,一个新对话框通常会显示在其父对话框的中心位置。
但是,还有更多!
根据文档,它可以影响实际功能。例如:
在 Mac OS X 上,如果您希望消息框显示为 Qt::Sheet 它的parent,将消息框的窗口模式设置为Qt::WindowModal 或使用 open()。否则,消息框将是标准对话框。
此外,还有“Window Modality”和“Application Modality”的概念,前者只阻止父窗口中的输入,后者阻止整个应用程序的输入。这显然需要知道父母的概念。
最后,对于某些static 函数,例如::about(...),它首先查找要使用的图标的位置是parent->icon()。
因此,如果您想获得良好的平台特定行为并让您的代码跨平台,您最好将理智的父级传递给它。
【讨论】:
对话框的父子层次结构定义了各种平台中的窗口堆叠行为。如果您将对话框 P 作为对话框 C 的父级传递,则 C 将出现在所有(桌面)平台上的 P 上方。如果您传递 0,则窗口堆叠会有所不同,并且通常不会按预期运行。我在 OS X 上看到的最糟糕的此类问题,其中一些消息框出现在主窗口后面,由于消息框处于模态状态而被禁用,没有任何方法可以进入消息框(快捷方式或通过鼠标移动窗口帮助)。 简而言之,我的建议是:总是传递一个明智的父母。
【讨论】:
HWND_TOPMOST(带有SetWindowPos)并且在没有父窗口的情况下显示模态QMessageBox时,我们遇到了类似的问题。然后主窗口被禁用,您无法看到/获取消息框...
其他答案可能更好,但我自己的小理由是它将消息框放在父级的中心而不是屏幕的中心......
【讨论】:
别忘了提到QMessageBox 将继承调色板和其父级的样式表。相信我,当您使用自定义复杂样式表时,您不希望您的消息像它们不属于您的应用程序一样弹出...
【讨论】:
QMessageBox::question(this, "Window confirmation", "Do you want to save changes?", QMessageBox::Yes|QMessageBox::No); 但我的问题是,虽然this 是主窗口,拥有自己的QPalette,但QMessageBox 没有继承调色板。你知道为什么吗?。谢谢!
如果您不使用静态函数,而是实际创建 QMessageBox 的实例,它对于内存管理也很有用。当父级被删除时,您的实例也将被删除。
【讨论】: