addWidget()问题之后的setGeometry()

时间:2012-11-22 09:12:54

标签: python qt python-2.7 pyqt pyqt4

在将父级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()如何影响跟随编码器或执行时间的内容都会非常感激!

1 个答案:

答案 0 :(得分: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_())