如何在创建父项后动态添加窗口小部件

时间:2013-10-08 22:05:39

标签: python user-interface pyqt4 pyside

我正在尝试使用自定义小部件构建界面,并遇到了以下问题。

我有一个小部件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 上调用。我错过了什么?

1 个答案:

答案 0 :(得分:2)

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

之前添加此内容
self.widgets[-1].show()

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