【问题标题】:pyqt5 and multiple inheritancepyqt5和多重继承
【发布时间】:2015-06-26 03:09:12
【问题描述】:

我想创建一个继承 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")

【问题讨论】:

    标签: python-3.x pyqt multiple-inheritance


    【解决方案1】:

    我终于找到了怎么做:首先,问题来自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...

    【讨论】:

    • 我的情况略有不同,在使用多重继承时,QtObjects 吞下所有兄弟类的参数似乎有些问题。编辑:这似乎是有意的:pyqt.sourceforge.net/Docs/PyQt5/multiinheritance.html
    • 也遇到了这个问题。我正在扩展一个基本小部件:class SpecialLabel(QLabel, OtherClass),并不断收到缺少参数的错误。原来QLabel 试图调用OtherClass 的构造函数。通过跟随它并命名参数来修复它。在SpecialLabel.__init__super().__init__(other_arg=other_arg, *args, **kwargs)。这正确调用了 QLabel.__init__ 和 OtherClass.__init__。
    猜你喜欢
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 2011-12-02
    • 2021-06-25
    • 2014-10-04
    相关资源
    最近更新 更多