Python - how to get this multiple inheritance to work?
我正在处理一个涉及pyqt5的项目,我正在努力管理小部件之间的继承。
我有一个qwidget屏幕继承了qtwidgets.qwidget,还有一个由qtdesigner生成的类。它的内容如下:
1 2 3 4 5 6 7 8 | class a(QtWidgets.QWidget, Ui_a): def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) self.setupUi(self) <some attributes> <some functions |
这里,我继承了
我现在想创建另一个类
1 2 3 4 | class b(QtWidgets.QWidget, Ui_b, a): def __init__(self, parent=None): QtWidgets.QWidget.__init(self, parent) self.setupUi(self) |
号
然后,它会崩溃,并显示一条错误消息,说明它无法创建一致的方法解析顺序。
我的第一个问题是-我知道我需要调用类
我的第二个问题是-如何修复这个MRO错误,并成功地创建新的类
您试图在派生类之前混入父类。无需直接继承
1 2 | class b(a, Ui_b): # *no* __init__ needed either |
现在,
1 2 3 4 5 6 | class b(a, Ui_b): def __init__(self, parent=None): super().__init__(parent) # Ui_b.setupUi would have shadowed Ui_a.setupUi, so # call the latter explicitly Ui_a.setupUi(self, self) # unbound |
号
可能是
1 2 3 4 5 6 7 8 9 10 11 12 | class SharedStuff: # ... class a(QtWidgets.QWidget, SharedStuff, Ui_a): def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) self.setupUi(self) class b(QtWidgets.QWidget, SharedStuff, Ui_b): def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) self.setupUi(self) |
你的问题有点不清楚,但我假设
我猜你目前的课程相当于:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class A(QtWidgets.QWidget, Ui_FromQtDesigner): def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) self.setupUi(self) def methodA(self): print('A:', self.windowTitle()) class B(QtWidgets.QWidget): def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) def methodB(self): print('B:', self.windowTitle()) |
。
您需要一个类
现在,qt几乎只使用单一继承。从两个
在您的例子中,最好使用一个简单的mixin类。类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class WidgetA(QtWidgets.QWidget, Ui_FromQtDesigner): def __init__(self, parent=None): super(WidgetA, self).__init__(parent) self.setupUi(self) def methodA(self): print('A:', self.windowTitle()) class WidgetMixinB(object): def methodB(self): print('B:', self.windowTitle()) class WidgetC(WidgetA, WidgetMixinB): pass |
如果您还想将
1 2 | class WidgetB(QtWidgets.QWidget, WidgetMixinB): pass |
。