如何在PyQt4中显示以其父级为中心的QMessageBox?

时间:2013-02-20 22:14:58

标签: python qt pyqt pyqt4 pyside

我正在尝试显示以其父级为中心的QMessageBox,但它似乎显示在其父级的父级上。以下代码在2x2网格中生成4个按钮。单击一个按钮时,我希望相应的消息框以单击的按钮为中心显示(即父项)。但是,它始终显示在包含小部件的中间。

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 个答案:

答案 0 :(得分:1)

查看paragraph的其余部分:

  

请注意,QDialog(具有Qt :: Dialog类型的任何其他窗口小部件)都使用   父窗口小部件与Qt中的其他类略有不同。一个   对话框始终是顶级窗口小部件,但如果它具有父级,则为   默认位置位于父级的顶级窗口小部件之上   (如果它本身不是顶级的)。它也将分享父母的   任务栏条目。

在您的情况下,将是sender,而父级的顶级小部件将是定义为w的小部件