親 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()
に影響するかについての内部情報は大歓迎です!