如何在PyQt4中将QMessageBox居中显示在其父窗口上?
我想让一个消息框(QMessageBox)在它的父窗口正中间显示,但它却总是在父窗口的父窗口上面显示。下面的代码会生成四个按钮,排列成2x2的网格。当我点击某个按钮时,我希望对应的消息框能在被点击的按钮正中间显示(也就是在它的父窗口上)。可是,它总是出现在包含这个按钮的窗口的中间。
from PyQt4 import QtCore, QtGui
class ClickHandler(QtCore.QObject):
def __init__(self, parent=None):
super(ClickHandler, self).__init__(parent)
def onClicked(self):
sender = self.sender()
print sender
QtGui.QMessageBox.information(sender, 'onClicked', 'Using static method')
mb = QtGui.QMessageBox(sender)
mb.setWindowTitle('onClicked')
mb.setText('Using object and exec')
mb.exec_()
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
ch = ClickHandler()
layout = QtGui.QGridLayout()
for i in xrange(4):
pb = QtGui.QPushButton('button %d' % i)
pb.clicked.connect(ch.onClicked)
layout.addWidget(pb, i // 2, i % 2)
w = QtGui.QWidget()
w.setLayout(layout)
w.resize(600, 600)
w.show()
sys.exit(app.exec_())
根据QMessageBox的文档:
父窗口会传递给QDialog的构造函数
根据QDialog的文档:
如果有父窗口,它的默认位置是居中在父窗口上方
我不太确定自己哪里做错了,或者遗漏了什么。任何帮助都非常感谢。谢谢。
1 个回答
2
看看这段内容:
要注意,QDialog(还有其他类型为Qt::Dialog的组件)在使用父组件时和Qt中的其他类有点不同。对话框总是一个顶层组件,但如果它有父组件,它的默认位置会在父组件的顶层组件正中间(如果它本身不是顶层组件的话)。它还会和父组件共享任务栏的入口。
在你的例子中,父组件就是sender
,而父组件的顶层组件就是定义为w
的那个组件。