从和qmainwindow继承的抽象类

zd287kbt  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(458)

这个问题在这里已经有了答案

如何对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 .

mutmk8jj

mutmk8jj1#

正如错误所说,您必须创建一个元类,它是所涉及类的每个元类的子类。
pyqt小部件的元类可能不是设计用来与其他元类协同工作的——这将是运气的问题。的元类, .ABCMeta (以下我称之为 type(ABC) 为了便于说明)如果更适合协同继承,那么som,在派生元类时将其放在第一位将使您有更好的机会让事情实际工作(i、 例如,除其他外,它将使用 super() 调用其方法,而不是硬编码对 type.<method> ).
一旦获得了派生元类,只需在继承基类上使用它。由于所有示例都是一行代码,检查结果很有趣,因此我只在交互式环境中编写了一些东西:

In [1]: from PyQt5.QtWidgets import QMainWindow

In [2]: from abc import ABC, ABCMeta

In [3]: class A(QMainWindow, ABC): pass
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-86552c93e708> in <module>
----> 1 class A(QMainWindow, ABC): pass

TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

In [4]: class Meta(type(ABC), type(QMainWindow)): pass

In [5]: class B(QMainWindow, ABC, metaclass=Meta): pass

作为旁注,不管qt文档怎么说(以及其他图形工具包),使用小部件的子类来创建应用程序可能是一大难题。如果您只是示例化这些小部件,并将它们作为一个普通类中的属性引用,该类只继承与您的项目相关的内容,那么与从 QMainWindow 开始。

相关问题