为什么我的python类继承不正确?

时间:2017-05-24 07:30:10

标签: python inheritance pyqt pyqt5

我正在学习使用PyQt5并遇到问题。我的代码试图通过编写继承自QMainWindow的第二个类PaintWidget来在QWidget对象中绘制一个简单的黑盒子。我先发布了我的代码,下面是正确的代码。

class PaintWidget(QWidget):

    def __init__(self):
        super().__init__()
        self.qp = QPainter()
        self.initUI()

    def initUI(self):
        self.qp.fillRect(1,1,100,100, Qt.black)

正确:

class PaintWidget(QWidget):
    def paintEvent(self, event):
        qp = QPainter(self)
        qp.fillRect(1, 1, 100, 100, Qt.black)

这让我很困惑。为了创建这个类,我们需要从超类QWidget继承,为了做到这一点,我们使用super().__init__()下的函数__init__(self)。然后,我们设置QPaint对象,我们将在方法initUI()中使用它实际完成工作。现在,当我运行它时,这不起作用。

第二个正确的类似乎不是固有的,因为它没有super().__init__(),更糟糕的是,它正在设置一个永远不会被调用的方法(paintevent(self, event))这是一个看似无处可来的争论。有人能说出我错的原因吗?

1 个答案:

答案 0 :(得分:2)

两种情况之间继承绝对没有区别。在这两种情况下,您都说class PaintWidget(QWidget),因此您继承了QWidget

区别在于您绘制的位置。在构造函数(__init__)中,窗口小部件尚未映射到屏幕,因此如果您尝试在那里绘制,它将无法生效。

当小部件实际显示在屏幕上时,系统将调用paintEvent,这是QWidget的虚拟方法,您必须在此处绘制内容。您只能在第二个示例中定义该方法。

请注意,QPainter 的每次调用中都需要新的paintEvent。在构造函数中创建一个然后在paintEvent中使用它将无法正常工作

此外,大多数窗口系统都不记得窗口小部件的内容,当它在屏幕上实际不可见时,并且只要窗口小部件变得可见,就可以调用paintEvent再次。因此该方法很可能会被调用多次。相反,构造函数__init__仅在创建对象时被调用一次。