2

親 QWidget に追加された直後に、子 QWidget の寸法を設定するのに問題があります。問題は、単にジオメトリを設定しないことです:

from PyQt4 import QtCore, QtGui

class MyWidget(QtGui.QWidget):

    def __init__(self):

        super(MyWidget, self).__init__()

        self.initUI()


    def initUI(self):

        # setting up parent QWidget
        self.setMinimumSize(256, 256)
        self.setMaximumSize(256, 256)
        self.GL = QtGui.QGridLayout(self)
        self.GL.setMargin(0)

        # setting up child QWidget
        self.GL.myWidget2 = QtGui.QFrame()
        self.GL.myWidget2.setMinimumSize(128, 128)
        self.GL.myWidget2.setMaximumSize(128, 128)
        self.GL.myWidget2.setStyleSheet("background: orange")

        # attaching child to parent
        self.GL.addWidget(self.GL.myWidget2)

        # trying to reposition child in parent's local space
        self.GL.myWidget2.setGeometry(QtCore.QRect(0, 128, self.width(), self.height()))



if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    widget = MyWidget()
    widget.show()
    app.exec_()

短い遅延の後にジオメトリを設定するタイマーを追加しても機能します... (置き換えself.GL.myWidget2.setGeometry([...])):

        timer = QtCore.QTimer()
        timer.singleShot(10, self.updatePosition)

    def updatePosition(self):

        self.GL.myWidget2.setGeometry(QtCore.QRect(0, 128, self.width(), self.height()))

...だから私は addWidget(...) メソッドがコールバックを行っていると思われます。例えば、メインスレッドがすでにself.GL.myWidget2.setGeometry([...])行を通過している間にウィジェットをデフォルトの位置に再描画します。

これは純粋に憶測ですが、次のコーダーまたは実行タイミングにどのようaddWidget()に影響するかについての内部情報は大歓迎です!

4

1 に答える 1

3

ウィジェットを手動で配置したい場合、レイアウトは必要ありません:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from PyQt4.QtCore import *
from PyQt4.QtGui import *

class orange(QWidget):
    def __init__(self, parent=None):
        super(orange, self).__init__(parent)

        self.setMinimumSize(256, 256)
        self.setMaximumSize(256, 256)

        self.frame = QFrame(self)
        self.frame.setMinimumSize(128, 128)
        self.frame.setMaximumSize(128, 128)
        self.frame.setGeometry(QRect(0, 128, self.width(), self.height()))
        self.frame.setStyleSheet("background: orange")

if __name__ == "__main__":
    import  sys

    app = QApplication(sys.argv)
    main = orange()
    main.show()
    sys.exit(app.exec_())
于 2012-12-22T04:01:16.037 に答える