Python - 如何让多重继承发挥作用?

标签 python class pyqt multiple-inheritance

我正在开发一个涉及 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_aUi_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_aUi_b 可能根本无法混合。。在这种情况下,您应该将想要重用的所有方法提取到单独的基类中,并让 ab 继承自该基类:

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/

相关文章:

python - PyQt5 使用 runJavaScript 检索表单值

python - PyQt:获取当前标签号

python - python中的命令行工具位于固定根目录中

文件名的 Python 专用类

python - Pandas 中的 Joint_first 和 null 值

Java:使用类作为 hashmap 中的值

java - 创建自定义类! java

python - PyQt:WAITING小部件关闭

python - 为什么 dataframe.appy 花费太多时间

Python:从两个列表构建字典