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

标签 python inheritance pyqt pyqt5

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

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/

相关文章:

python - DRF : only Author can create or update the book permission

python - 解析xml文件并输出到文本文件

python - 使用其他包扩展 pip 包

python - 删除列表中的重复数据框

C# 遍历子类

使用工厂的 C++ 接口(interface)继承

Powershell 类继承行为

colors - PyQt 组合框中单行中的不同颜色

python - 隐藏操作而不禁用它

python - PyQt:退出时没有错误消息(回溯)