4

親の中央に 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のドキュメントによると:

親がある場合、そのデフォルトの位置は親の上に中央揃えされます

何が間違っているのか、何が欠けているのかわかりません。どんな助けでも大歓迎です。ありがとう。

4

1 に答える 1

2

段落の残りの部分をチェックしてください:

QDialog (Qt::Dialog 型を持つその他のウィジェット) は、親ウィジェットを Qt の他のクラスとは少し異なる方法で使用することに注意してください。ダイアログは常にトップレベルのウィジェットですが、親がある場合、そのデフォルトの位置は、親のトップレベルのウィジェット (それ自体がトップレベルでない場合) の上に中央揃えされます。また、親のタスクバー エントリも共有します。

あなたの場合、は にsenderなり、親のトップレベルのウィジェットは次のように定義されたウィジェットになりますw

于 2013-02-21T06:28:58.627 に答える