【问题标题】:When and where to call super().__init__() when overriding QT methods?覆盖 QT 方法时何时何地调用 super().__init__()?
【发布时间】:2022-11-25 20:48:09
【问题描述】:

覆盖virtual functions of QtWidgets时,在什么情况下我应该调用super().__init__()?在哪些情况下它的立场会产生影响?

例子:

class Window(QtWidgets.QMainWindow):

   def keyPressEvent(self, event: QtGui.QKeyEvent) -> None:
        """Variant A: Top"""
        super().__init__(event)
        # my code

    def mousePressEvent(self, event: QtGui.QMouseEvent) -> None:
        """Variant B: Bottom"""
        # my code
        super().__init__(event)

    def showEvent(self, event: QtGui.QShowEvent) -> None:
        """Variant C: Without"""
        # my code
        ...

我在问这个,因为我注意到在我成长的代码中我有所有三个变体,而且我没有注意到任何不起作用或有任何区别。是否有任何我可以/应该遵循的一般规则或最佳实践?

【问题讨论】:

  • @Alexander,这基本上是我的问题。我可以/应该删除它们吗?这是真的吗全部事件方法?非事件方法呢?
  • @Alexander,老实说,我不记得我为什么把它们放在那里。大概我在哪里见过它。这是我的第一个 Qt 项目。对我来说,回答似乎也不是微不足道的。例如。如果父类方法对事件做了一些有用/重要的事情怎么办?我怎么会知道呢?
  • 如果它像这样简单:“构造函数尽早需要它,将它留在所有其他方法中”,那对我来说将是一个很好的答案!

标签: python pyqt pyside


【解决方案1】:

当您调用super().__init__(...) 时,实际上是在调用父类的构造方法。这通常只应该在它自己的构造函数(aka __init__)方法中为子小部件的每个实例执行一次,并且应该是第一次调用。

例如:

class MyWidget(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        # ....... everything else

根据我的经验,除了构造函数之外,不需要在任何其他方法中调用它。

由于您的示例都在处理事件,因此您实际上可能指的是其他超类方法。例如,如果您的小部件处理一个事件,但您仍然希望将 even 传播给它的父级,那么您可以调用 super().eventmethodname(args)

例如:

def mousePressEvent(self, event: QtGui.QMouseEvent) -> None:
        """Variant B: Bottom"""
        # ...  your code here
        super().mousePressEvent(event)

【讨论】:

    猜你喜欢
    • 2012-05-01
    • 2020-09-20
    • 2012-08-09
    • 1970-01-01
    • 2023-01-07
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多