我正在嘗試使用自定義小部件構建接口,並遇到以下問題。如何在創建父項後動態添加小部件
我有一個小部件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,不矩形乙。我錯過了什麼?
嗯,這固定它。爲了更深入地理解這個問題,當在父窗口小部件的構造函數中創建它們時,如何調用「.show()」窗口小部件?如果我在調用父窗口小部件上的self.show()後創建了第三個矩形,它不會出現,所以這讓我覺得當你在父窗口調用'.show()'時,它會被調用孩子也是如此。但是,如果我將'self.show()'調用放在'addWidget()'而不是'self.widgets [-1] .show()'中,則什麼都不會發生。 – AnjoMan