首页 > 解决方案 > 在派生类中执行基类重写方法

问题描述

我有一个 PyQt5 应用程序,该应用程序有一个 QToolBox,它由 2 个不同用户界面的页面组成。

因此,对于 MainWindow 本身,我创建了一个名为BPAPOIAppclass 的基类来执行可能直接对 MainWindow 执行的任何操作。

我还创建了另一个派生类,它BPAPOIApp为每个 QToolBox 页面继承了该类,因为它们中的每一个都有要完成的单独操作。

在基类中,我有一个方法调用def init_signals来启动与基类相关的所有动作信号,同时我想def init_signals在两个派生类中都有另一个(QToolBox 中的 2 页),这意味着该方法将被覆盖。是否有适当的方法来启动init_signals所有类(基类和派生类)的方法,因为它们都在等待不同的事件发生。

下面是一些相关的代码。

class BPAPOIApp(QWidget):

def __init__(self):
    super(BPAPOIApp, self).__init__()
    self._widget = QWidget()
    self._ui = Ui_Form()
    self._widget.setWindowFlag(Qt.FramelessWindowHint)
    self._ui.setupUi(self._widget)
    self._ui.label.hide()

    self.init_signals()
    
def init_signals(self):
    self._ui.close_tbtn.clicked.connect(lambda: self._widget.hide())
    self._ui.information.clicked.connect(self.information_display)
    self._ui.toolBox.currentChanged.connect(self.reset_info)

def information_display(self):
    self._ui.label.setText('Test text')
    self._ui.label.show()

下面是BPAApp课程。

class BPAApp(BPAPOIApp):

def __init__(self):
    super(BPAApp, self).__init__()

    self.init_signals()

def init_signals(self):
    super().init_signals()        # try to instantiate base class signals here
    self._ui.radio_btn1.toggled.connect(self.option_selected)
    self._ui.radio_btn2.toggled.connect(self.option_selected)

if __name__ == '__main__':
    bpa = BPAApp()

当我触发information按钮(self._ui.information)时,标签没有显示在界面中,这里可能有什么问题?

标签: pythonpyqt5

解决方案


无需self.init_signals()在派生类中调用,BPAApp.__init__()因为它已经在父类中被调用BPAPOIApp.__init__()。当父类调用它时,MRO会将它指向最派生的实现,即派生的BPAApp.init_signals()(反过来又调用父类BPAPOIApp.init_signals())。


推荐阅读