我不明白为QMessageBox
设置parent有什么好处,例如在下面的代码中:
void mainWindow::showMessage(QString msg) {
QMesageBox::information(this, "title", msg); //'this' is parent
}
谁能帮帮我?
可能有几件事。首先,QMessageBox
继承自QDialog
。因为QDialog
有父节点的概念,QMessageBox
也应该有一致性。
具体来说,文档说:
parent被传递给QDialog构造函数。
至少,一个新对话框通常会显示在其父对话框的上方。
然而,还有更多!
根据文档,它可以影响实际功能。例如:
在Mac OS X上,如果你想让你的消息框显示为Qt::Sheet的它的父,将消息框的窗口模式设置为Qt::WindowModal或者使用open()。否则,消息框将是一个标准的对话框。
还有一个"窗口模式"one_answers"应用模式"的概念,前者只阻止父窗口的输入,后者阻止整个应用程序的输入。这显然需要知道父节点的概念。
最后,对于某些static
函数,例如::about(...)
,它首先查找要使用的图标是parent->icon()
。
所以,如果你想要得到很好的平台特定的行为,让你的代码是跨平台的,你最好传递一个相同的父级给它。
对话框的父子层次结构定义了不同平台中的窗口堆叠行为。如果你传递对话框P作为对话框C的父级,那么在所有(桌面)平台上,C都会出现在P的上方。如果你传递0,窗口的堆叠将会不同,并且通常不会像想要的那样表现。我在OS X上见过的最糟糕的问题是,一些消息框出现在主窗口后面,由于消息框是模态的,它被禁用了,没有任何方法可以到达消息框(无论是快捷键还是通过鼠标移动窗口都没有帮助)。总之,我的建议是:总是传递一个明智的父级。
其他答案可能更好,但我自己的小原因是它将消息框放在父元素的中心,而不是屏幕的中心…
不要忘记提到QMessageBox
将继承调色板和其父的样式表。相信我,当你使用自定义复杂样式表时,你不会希望你的消息看起来不属于你的应用程序…
如果您不使用静态函数,而是实际创建QMessageBox的实例,那么它对于内存管理也很有用。当父实例被删除时,您的实例也将被删除。