【问题标题】:How to display a QMessageBox centered over its parent in PyQt4?如何在 PyQt4 中显示以其父级为中心的 QMessageBox?
【发布时间】:2013-02-20 22:14:58
【问题描述】:

我试图显示一个 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 文档:

parent 被传递给 QDialog 构造函数

根据 QDialog 文档:

如果它有一个父节点,它的默认位置是在父节点的顶部居中

不知道我做错了什么或我错过了什么。任何帮助,将不胜感激。 谢谢。

【问题讨论】:

    标签: python qt pyqt pyqt4 pyside


    【解决方案1】:

    查看paragraph的其余部分:

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

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

    【讨论】:

    • 谢谢。该声明在“详细说明”中,但在构造函数文档中没有重复,这是我复制我的报价的地方。下次需要阅读所有手册。我想我需要编写自定义代码来处理这种情况。
    猜你喜欢
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多