从ABC和QMainWindow继承的抽象类

2024-05-20 02:31:50 发布

您现在位置:Python中文网/ 问答频道 /正文

from abc import ABC, abstractmethod
from PyQt5.QtWidgets import QMainWindow


class _ControlGUI(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

我的目标是用强制结构/属性定义基类_ControlGUI;然后定义从中继承的多个具体类,以及附加的功能/属性。所有这些具体类都是小型GUI,因此从QMainWindow继承,因此我认为最好让抽象类直接从QMainWindow继承。然而,这似乎是不可能的

这个问题的最佳设计和解决方案是什么?我目前的想法是定义没有QMainWindow的抽象类,并让所有具体类从_ControlGUIQMainWindow继承


Tags: ofthefromimport属性定义抽象类pyqt5
1条回答
网友
1楼 · 发布于 2024-05-20 02:31:50

正如错误所说,您必须创建一个元类,它是所涉及类的每个元类的子类

PyQT小部件的元类可能不是设计用来与其他元类协同工作的——这将是运气的问题。ABC的元类abc.ABCMeta(为了便于说明,我在下面将其称为type(ABC))如果更适合协同继承,som,那么在派生元类时将其放在首位将使您有更好的机会使事情实际工作。(即,除其他外,它将在其方法中使用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开始继承相比,您可能会有一个更好的旅程

相关问题 更多 >