我正在学习使用 PyQt5 并遇到了问题。我的代码试图通过编写继承自 QWidget
的第二个类 PaintWidget
在 QMainWindow
对象中绘制一个简单的黑框。我首先发布了我的代码,下面是正确的代码。
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)
这就是我困惑的地方。为了创建这个类,我们需要继承父类(super class)QWidget
,为此我们使用下的函数
。然后,我们设置 super().__init__()
__init__(自身)QPaint
对象,我们将在实际完成工作的 initUI()
方法中使用该对象。现在,当我运行它时,这不起作用。
第二个正确的类似乎不是固有的,因为它没有 super().__init__() ,更糟糕的是,它正在设置一个从未被调用的方法(paintevent(self, event)
),它接受一个看似无中生有的参数。有人能指出我为什么错吗?
最佳答案
两种情况之间的继承完全没有区别。在这两种情况下,您都说class PaintWidget(QWidget)
,因此您继承了QWidget
。
区别在于您绘制的位置。在构造函数(__init__
)中,小部件尚未映射到屏幕,因此如果您尝试在那里绘制,它将不会产生任何效果。
当小部件实际显示在屏幕上时,系统将调用paintEvent
,它是QWidget
的虚拟方法,您必须在其中绘制小部件内容。您只需在第二个示例中定义该方法。
请注意,在每次调用paintEvent
时都需要新鲜的QPainter
。在构造函数中创建一个,然后在 paintEvent
中使用它不起作用。
此外,大多数窗口系统不记得小部件的内容(当小部件在屏幕上实际不可见时),并且依赖于能够在任何时候调用 paintEvent
小部件再次变得可见。因此该方法可能会被调用多次。相反,构造函数 __init__
在创建对象时仅调用一次。
关于python - 为什么我的 python 类继承不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44151782/