我正在学习使用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)
)这是一个看似无处可来的争论。有人能说出我错的原因吗?
答案 0 :(得分:2)
两种情况之间继承绝对没有区别。在这两种情况下,您都说class PaintWidget(QWidget)
,因此您继承了QWidget
。
区别在于您绘制的位置。在构造函数(__init__
)中,窗口小部件尚未映射到屏幕,因此如果您尝试在那里绘制,它将无法生效。
当小部件实际显示在屏幕上时,系统将调用paintEvent
,这是QWidget
的虚拟方法,您必须在此处绘制内容。您只能在第二个示例中定义该方法。
请注意,在QPainter
的每次调用中都需要新的paintEvent
。在构造函数中创建一个然后在paintEvent
中使用它将无法正常工作。
此外,大多数窗口系统都不记得窗口小部件的内容,当它在屏幕上实际不可见时,并且只要窗口小部件变得可见,就可以调用paintEvent
再次。因此该方法很可能会被调用多次。相反,构造函数__init__
仅在创建对象时被调用一次。