PySide 多重继承:继承QWidget和混合类

1 投票
1 回答
2402 浏览
提问于 2025-04-18 17:43

我正在尝试创建一组PySide类,这些类要继承自QWidget、QMainWindow和QDialog。同时,我还想继承另一个类,以重写一些函数,并设置这个小部件的布局。

举个例子:

混合类:

class Mixin(object):
    def __init__(self, parent, arg):
        self.arg = arg
        self.parent = parent

        # Setup the UI from QDesigner
        ui = Ui_widget()
        ui.setupUi(self.parent)

    def setLayout(self, layout, title):
        self.parent.setWindowTitle(title)
        self.parent.setLayout(layout)

    def doSomething(self):
        # Do something awesome.
        pass

小部件:

class Widget(Mixin, QtGui.QWidget):
    def __init__(self, parent, arg):
        super(Widget, self).__init__(parent=parent, arg=arg)

这样做是行不通的,但通过组合的方式可以实现。

小部件(组合):

class Widget(QtGui.QWidget):
    def __init__(self, parent, arg):
        super(Widget, self).__init__(parent=parent)
        mixin = Mixin(parent=self, arg=arg)

        self.setLayout = mixin.setLayout
        self.doSomething = mixin.doSomething

我希望能让这个小部件完全继承所有功能,而不是部分通过组合来实现。谢谢!

1 个回答

3

保持 class Widget(Mixin, QtGui.Widget): 这个写法,但在 Mixin.__init__ 中添加一个 super 调用。这样可以确保 MixinQWidget__init__ 方法都会被调用,并且在查找 Widget 的方法时,Mixin 中的 setLayout 方法会优先被找到。

class Mixin(object):
    def __init__(self, parent=None, arg=None):
        super(Mixin, self).__init__(parent=parent)  # This will call QWidget.__init__
        self.arg = arg
        self.parent = parent

        # Setup the UI from QDesigner
        ui = Ui_widget()
        ui.setupUi(self.parent)

    def setLayout(self, layout, title):
        self.parent.setWindowTitle(title)
        self.parent.setLayout(layout)

    def doSomething(self):
        # Do something awesome.
        pass


class Widget(Mixin, QtGui.QWidget):
    def __init__(self, parent, arg):
        super(Widget, self).__init__(parent=parent, arg=arg)  # Calls Mixin.__init__

撰写回答