Pyside6多继承的坑(继承QWidget)

发布时间 2023-10-07 15:54:53作者: 凡璞

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类继承QWidgetFrameBase,按照上面的例子应该写成如下即可:

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论坛中大佬推荐的写法。