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的定义中,我在 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上调用。我错过了什么?

4

1 回答 1

3

你只是忘了显示矩形。在addWidget中,在之前添加self.update()

self.widgets[-1].show()

不需要show第一个矩形对象的原因是因为它是在 Window 构造函数中创建的。然后,Qt 本身正在确保正确显示对象(这是误导,我同意......)。

于 2013-10-09T06:14:46.287 回答