如何在PyQt4中将QMessageBox居中显示在其父窗口上?

4 投票
1 回答
5591 浏览
提问于 2025-04-17 16:33

我想让一个消息框(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的那个组件。

撰写回答