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...
我想创建一个新的 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...