Pyside6多继承的坑(继承QWidget)
python中支持多继承,并且可以针对不同父类传入不同的参数进行初始化:
class A:
def __init__(self, text):
print(text)
class B:
def __init__(self, text):
print(text)
pass
class C(B, A):
def __init__(self):
B.__init__(self, "Hello")
A.__init__(self, "World")
===========================================
Hello
World
但是当我继承的父类中包含QWidget
时则会出现参数缺失的问题。
具体情景是,我通过Designer设计了一个窗口,这个窗口会被复用,并且不同实例还会进行一些改变。所以我写了一个类叫做FrameBase
,这个类中实现了不同实例相同相同操作的部分,但是需要传入一个QTextEdit
作为操作对象。
然后写了一个Instance
类继承QWidget
和FrameBase
,按照上面的例子应该写成如下即可:
class FrameBase(Ui_Form):
def __init__(self, textEdit: QTextEdit):
self.tgtEdit = textEdit
...
class Instance(QWdiget, FrameBase):
def __init__(self, textEdit: QTextEdit):
QWidget.__init__(self)
FrameBase.__init__(self, textEdit)
...
但是上述这么写会报错:TypeError: FrameBase.__init__() missing 1 required positional argument: 'textEdit'
如果把参数删除,写成如下:
class FrameBase(Ui_Form):
def __init__(self):
pass
...
class Instance(QWdiget, FrameBase):
def __init__(self, textEdit: QTextEdit):
QWidget.__init__(self)
FrameBase.__init__(self)
这样是不会报错的,所以类名.__init__()
的写法按道理应该可以。但实际就是不行,不知道为什么,有大佬知道评论区求告诉!
后面通过另一种写法实现了:
class FrameBase(Ui_Form):
def __init__(self, textEdit: QTextEdit):
self.tgtEdit = textEdit
...
class Instance(QWdiget, FrameBase):
def __init__(self, textEdit: QTextEdit):
super().__init__(textEdit=textEdit)
...
使用super().__init__()
的方式代替,这也是Qt论坛中大佬推荐的写法。