这个问题在这里已经有了答案:
如何对pyqt子类使用泛型类型而不产生元类冲突((1个答案)
两天前关门了。
from abc import ABC, abstractmethod
from PyQt5.QtWidgets import QMainWindow
class _ControlGUI(QMainWindow, ABC):
pass
上面非常简单的代码引发了一个我不太清楚的错误。
typeerror:元类冲突:派生类的元类必须是其所有基元类的(非严格)子类
我的目标是定义一个基类 _ControlGUI
具有强制性结构/属性;然后定义从中继承的多个具体类,以及附加的功能/属性。所有这些具体类都是小型GUI,因此继承自 QMainWindow
,因此我认为最好让抽象类从 QMainWindow
直接的。然而,这似乎是不可能的。
这个问题的最佳设计和解决方案是什么?我目前的想法是定义抽象类而不使用 QMainWindow
让所有的具体类继承自 _ControlGUI
来自 QMainWindow
.
1条答案
按热度按时间mutmk8jj1#
正如错误所说,您必须创建一个元类,它是所涉及类的每个元类的子类。
pyqt小部件的元类可能不是设计用来与其他元类协同工作的——这将是运气的问题。的元类,
.ABCMeta
(以下我称之为type(ABC)
为了便于说明)如果更适合协同继承,那么som,在派生元类时将其放在第一位将使您有更好的机会让事情实际工作(i、 例如,除其他外,它将使用super()
调用其方法,而不是硬编码对type.<method>
).一旦获得了派生元类,只需在继承基类上使用它。由于所有示例都是一行代码,检查结果很有趣,因此我只在交互式环境中编写了一些东西:
作为旁注,不管qt文档怎么说(以及其他图形工具包),使用小部件的子类来创建应用程序可能是一大难题。如果您只是示例化这些小部件,并将它们作为一个普通类中的属性引用,该类只继承与您的项目相关的内容,那么与从
QMainWindow
开始。