PyQt5和多重继承

3
我希望创建一个继承自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")
1个回答

7

我终于找到了如何做到这一点:首先,问题来自于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()

A现在有以下实现:

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

    def handler(self):
        pass

因此,现在我们可以创建继承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)

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


我有一个稍微不同的情况,看起来似乎是在使用多重继承时Qt对象吞噬了所有同级类别的参数的问题。编辑:这似乎是有意的:http://pyqt.sourceforge.net/Docs/PyQt5/multiinheritance.html - krassowski
我也遇到了这个问题。我正在扩展一个基本的小部件:class SpecialLabel(QLabel, OtherClass),但一直收到缺少参数的错误。原来是QLabel试图调用OtherClass的构造函数。通过跟进并命名参数来解决它。在SpecialLabel.__init__中:super().__init__(other_arg=other_arg, *args, **kwargs)。这将正确调用QLabel.__init__和OtherClass.__init__。 - Roberto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接