我正在尝试使用自定义小部件构建界面,并遇到了以下问题。
我有一个小部件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
的{{1}}定义中,我在20,40创建了一个矩形A 。
__init__()
由于我正在构建可视化,我想创建我的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
,它应该已经有矩形A 定义。然后我使用我的窗口的mWindow
方法在200,200处添加第二个矩形 - 称之为矩形B 。
addWidget()
我遇到的问题是实际上只绘制了矩形A 。
我知道矩形A和**矩形B 正在实例化,并且两者都有if __name__ == "__main__":
app= QApplication(sys.argv)
mWindow = Window()
mWindow.addWidget(Rectangle, [200,200,200,80])
sys.exit(app.exec_())
作为其父窗口小部件,因为构造函数中myWindow
的输出print parent
。
但是,当我调整窗口大小以强制它重新绘制时,Rectangle
方法仅在矩形A 上调用,而不是在矩形B 上调用。我错过了什么?
答案 0 :(得分:2)
你只是忘了显示矩形。在addWidget
中,在self.update()
:
self.widgets[-1].show()
第一个矩形对象不需要show
的原因是因为它
在Window构造函数中创建。然后,Qt本身确保对象正确
显示(这是误导,我同意......)。