pyqt5 和多重继承

Spi*_*ine 3 pyqt multiple-inheritance python-3.x

我想创建一个继承 QWidget 的两个子类的新类。我知道在 pyqt 中不可能进行多继承,但是我怎么能设法在一个子类中拥有两个父类的属性?

我希望我能做的如下:

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")
Run Code Online (Sandbox Code Playgroud)

Spi*_*ine 5

我终于找到了怎么做:首先,问题来自A和QStatusBar继承QWidget。我们不能改变 QStatusBar,所以我们必须改变 A。A 不应该继承 QWidget:所以让我们创建另一个类,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()
Run Code Online (Sandbox Code Playgroud)

A 现在具有以下实现:

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

    def handler(self):
        pass
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

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