我正在尝试使用自定义小部件构建界面,并遇到了以下问题。
我有一个小部件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
的定义中,我在 20,40__init__()
创建了一个矩形 A。
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被绘制。
我知道矩形 A 和 **rectangle B都被实例化并且都myWindow
作为它们的父小部件,因为print parent
在构造函数中的输出为Rectangle
.
但是,当我调整窗口大小以强制它重新绘制自身时,该paintEvent()
方法仅在矩形 A上调用,而不是在矩形 B上调用。我错过了什么?