我正在开发一个涉及 PyQt5 的项目,并且正在努力管理小部件之间的继承。
我有一个继承 QtWidgets.QWidget 的 QWidget 屏幕和由 QtDesigner 生成的另一个类。它的内容是这样的:
class a(QtWidgets.QWidget, Ui_a):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
self.setupUi(self)
<some attributes>
<some functions
在这里,我继承了 Ui_a
,一个存储在生成文件中的单独类,并且我可以调用 setupUi
(Ui_a
的方法) )很好。
我现在想创建另一个类b
,它也是一个需要显示的QWidget。此类b
需要使用类a
中的一些函数和属性。我可以轻松地复制粘贴所需的内容,但这是不好的做法,所以我正在寻找一个更简洁的解决方案。如果我执行代码:
class b(QtWidgets.QWidget, Ui_b, a):
def __init__(self, parent=None):
QtWidgets.QWidget.__init(self, parent)
self.setupUi(self)
然后崩溃,并显示一条错误消息,指出它无法创建一致的方法解析顺序。
我的第一个问题是 - 我知道我需要调用类 a
的 init 方法,因为 a
的属性是在那里创建的,但我不知道如何.
我的第二个问题是 - 如何修复此 MRO 错误并成功创建可以使用 a
的属性和函数的新类 b
?
最佳答案
您试图在派生类之前混合父类。没有必要,直接继承 a
和新的 Ui_b
就行了:
class b(a, Ui_b):
# *no* __init__ needed either
a
已引入 QtWidgets.QWidget
。
现在,Ui_a
和 Ui_b
可能无法很好地协同工作。您可能必须同时调用 Ui_a.setupUi()
和 Ui_b.setupUi()
。您可以明确地这样做:
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
Ui_a
和 Ui_b
可能根本无法混合。。在这种情况下,您应该将想要重用的所有方法提取到单独的基类中,并让 a
和 b
继承自该基类:
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)
关于Python - 如何让多重继承发挥作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41397134/