PySide 多重继承:继承QWidget和混合类
我正在尝试创建一组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
调用。这样可以确保 Mixin
和 QWidget
的 __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__