2012-11-22 32 views
2

我有麻煩設置一個child-QWidget在添加到parent-QWidget之後的維度。 問題是,它根本不設置幾何圖形:setGeometry()緊跟在addWidget()問題

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([...])行時,該控件重新繪製其默認位置。

儘管這是純粹的推測,但如何影響下面的編碼器或執行時機會受到很大的影響!

+1

佈局管理部件的定位。通常情況下,您不要將小部件放置到佈局中並手動放置它們。你想做什麼?也許你想''QLayout'的alignment/setAlignment'? – Avaris

+0

爲什麼'self.GL.myWidget2'而不是'self.myWidget2'? – 2012-12-22 03:58:09

+0

我很抱歉遲到的迴應。 @Avaris:我還沒有意識到小部件可以直接用於其他小部件,並且總是需要佈局。我的目標是實現下面的答案。 X.Jacobs:這是爲了保持關係層次的清晰原因。直接將小部件添加到另一個小部件正是我的意圖 - 謝謝。 – bossi

回答

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_()) 
+0

這澄清了一些事情,很有幫助,謝謝! – bossi