pyqt5和多重继承

pyqt5 and multiple inheritance

我想创建一个新的 class 来继承 QWidget 的两个子class。我知道在 pyqt 中多重继承是不可能的,但是我怎么能在一个子 class 中同时拥有两个父 classes 的属性?

我希望我能做的是:

class A(QWidget):

    def __init__(self, widget, parent=None):
        widget.destroyed.connect(self.destroy_handler)

    @pyqtSlot()
    def destroy_handler(self):
        pass

class B (A, QStatusBar):
    def __init__(self, widget, parent=None):
        A.__init__(self, widget)
        QStatusBar.__init__(self, parent)

    @pyqtSlot()
    def destroyed_handler(self):
        print("Destroyed")

终于找到方法了:首先问题出在A和继承QWidget的QStatusBar。我们不能改变 QStatusBar,所以我们必须改变 A。 A不应该继承QWidget:所以让我们创建另一个class,AInterface,像这样:

class AInterface(QObject):
    def __init__(self, a, parent=None)
        super().__init__(parent=parent)
        self.a = a
        self.connect_signal()

    def connect_signal(self, widget):
        widget.destroyed.connect(self.handler)

    @pyqtSlot()
    def handler(self):
        self.a.handler()

A 现在有以下实现:

class A:
    def __init__(self, widget):
        a.widget = widget
        a.interface = AInterface(self)

    def handler(self):
        pass

因此,现在我们可以创建不仅继承 A 还继承任何 QObject 的子classes,如下所示:

class B(QStatusBar, A):
    def __init__(self, widget, parent=None):
        QStatusBar.__init__(self, parent=parent, wiget=widget)
        A.__init__(self, widget)

    def handler(self):
        self.show('Destroyed', 3000)

注意 QStatusBar 构造函数中的 widget=widget:如果我们不指定它,则会抛出 TypeError...