sam*_*999 2 python class pyqt multiple-inheritance
我正在开发一个涉及PyQt5的项目,我正在努力管理小部件之间的继承.
我有一个QWidget屏幕继承了QtWidgets.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
Run Code Online (Sandbox Code Playgroud)
在这里,我继承了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)
Run Code Online (Sandbox Code Playgroud)
然后崩溃并显示一条错误消息,指出它无法创建一致的方法解析顺序.
我的第一个问题是 - 我知道我需要调用类的init方法,a
因为a
那里创建了属性,但我不知道如何.
我的第二个问题是 - 如何修复此MRO错误并成功创建b
可以使用其a
属性和函数的新类?
您试图在派生类之前混合父类.没有必要,只是直接继承a
和新的Ui_b
,没有别的:
class b(a, Ui_b):
# *no* __init__ needed either
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
这可能是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)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
257 次 |
最近记录: |