2

在将子 QWidget 添加到父 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 回答