2013-10-08 118 views
2

我正在嘗試使用自定義小部件構建接口,並遇到以下問題。如何在創建父項後動態添加小部件

我有一個小部件Rectangle,我想用它作爲我的界面中的交互元素。要定義一個矩形,我只需要給它一個父對象,這樣它就知道自己在哪個窗口中繪製,並且定義了一個位置和大小的位置[x,y, width, height]。 (我知道你們中的一些人會說:「你應該使用佈局而不是絕對定位」,但我100%肯定我需要絕對定位這個特定的應用程序)。

from PySide.QtCore import * 
from PySide.QtGui import * 
import sys 

class Rectangle(QWidget): 

    def __init__(self, parent, *args): 
     super(self.__class__,self).__init__(parent) 

     print parent, args 
     #expect args[0] is a list in the form [x,y,width,height] 
     self.setGeometry(*args[0]) 

    def enterEvent(self, e): 
     print 'Enter' 

    def leaveEvent(self, e): 
     print 'Leave' 

    def paintEvent(self, e): 

     print 'Painted: ',self.pos 
     painter = QPainter(self) 
     painter.setPen(Qt.NoPen) 
     painter.setBrush(QColor(200,100,100)) 
     painter.drawRect(0,0,self.width()-1, self.height()-1) 
     painter.end() 

我也有一個Window小部件,它是我的可視化繪製的畫布。在Window__init__()定義中,我創建了一個矩形A at 20,40。

class Window(QWidget): 

    def __init__(self): 
     super(self.__class__, self).__init__() 


     self.widgets = [Rectangle(self,[20,40,100,80])] 
     self.setMouseTracking(True) 
     self.setGeometry(300,300,800,600) 
     self.setWindowTitle('Window') 
     self.show() 

    def addWidget(self,Widget, *args): 
     self.widgets += [Widget(self, *args)] 
     self.update() 

    def mousePressEvent(self, e): 
     for widget in self.widgets: 
      print widget.geometry() 

因爲我建立一個可視化的,我要創造我Window,然後添加小工具,它後記,所以我創建一個實例mWindow,這應該已經有矩形A定義。然後我用我的窗口的addWidget()方法在200,200處添加第二個矩形 - 稱之爲矩形B

if __name__ == "__main__": 
    app= QApplication(sys.argv) 

    mWindow = Window() 
    mWindow.addWidget(Rectangle, [200,200,200,80]) 
    sys.exit(app.exec_()) 

我的問題是,只有矩形中的實際上被繪製。

我知道,無論矩形A和**矩形乙越來越實例化,並都有myWindow作爲它們的父窗口小部件,因爲print parent在構造爲Rectangle輸出。

然而,當我調整窗口的大小,以迫使它重新繪製本身,paintEvent()方法只要求矩形A,不矩形乙。我錯過了什麼?

回答

2

你只是忘了顯示矩形。在addWidgetself.update()前補充一點:

self.widgets[-1].show() 

爲什麼你不需要show第一個矩形對象的原因是因爲它是在窗口構造函數創建 。然後,Qt本身正在確保顯示的對象正確 (這是誤導,我同意...)。

+0

嗯,這固定它。爲了更深入地理解這個問題,當在父窗口小部件的構造函數中創建它們時,如何調用「.show()」窗口小部件?如果我在調用父窗口小部件上的self.show()後創建了第三個矩形,它不會出現,所以這讓我覺得當你在父窗口調用'.show()'時,它會被調用孩子也是如此。但是,如果我將'self.show()'調用放在'addWidget()'而不是'self.widgets [-1] .show()'中,則什麼都不會發生。 – AnjoMan

相關問題