结合 Qgraphics 和 sqlalchemy 时出现元类错误
Posted
技术标签:
【中文标题】结合 Qgraphics 和 sqlalchemy 时出现元类错误【英文标题】:Metaclass error when combining Qgraphics and sqlalchemy 【发布时间】:2012-07-17 05:54:24 【问题描述】:我想使用 sqlalchemy 使 QGraphicsItem
s 持久化。轻松将 Base 类与 PySide 类结合起来会产生关于元类的错误。 metaclsses 主题是 Python 的魔力,我不想在不需要时深入研究它。
有没有简单的方法来解决这个元类冲突?
class MarketItem(Base, QtGui.QGraphicsEllipseItem, QtGui.QListWidgetItem):
"""
"""
__tablename__ = "marketitem"
Id = Column(Integer(4), primary_key=True)
name = Column(String(40))
x_pos = Column(Integer(4))
y_pos = Column(Integer(4))
def __init__(self, x_pos, y_pos, scene, name, style=QtCore.Qt.SolidLine,
rect=None, matrix=QtGui.QTransform(), cat = None):
super(MarketItem, self).__init__()
self.setFlags(QtGui.QGraphicsItem.ItemIsSelectable|
QtGui.QGraphicsItem.ItemIsMovable|
QtGui.QGraphicsItem.ItemIsFocusable)
self.pos = QtCore.QPoint(x_pos, y_pos)
self.x_pos = x_pos
self.y_pos = y_pos
self.name = name
给出错误:
File "C:\Users\Richard\Documents\manAmpl\aptana\mampl\pm15ConeModel.py", line 47, in <module>
class MarketItem(Base, QtGui.QGraphicsEllipseItem, QtGui.QListWidgetItem):
TypeError: Error when calling the metaclass bases
metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
谢谢,理查德
【问题讨论】:
这看起来像是一个需要specify the metaclass as described here 的简单案例,但我没有足够的信心将此称为答案。 【参考方案1】:之前有人问过类似的问题,the answer 帮助我为您找到了可能的解决方案。
class CommonMetaclass(type(QtCore.Qt), type(Base)):
pass
class MarketItem(QtGui.QGraphicsEllipseItem, QtGui.QListWidgetItem, Base):
__metaclass__ = CommonMetaclass
__tablename__ = "marketitem"
...
我能够像这样声明这个类,不确定它是否真的可用。
如果有问题,请尝试在这两个类定义中更改父类的顺序。
对于 Python 3,此 sn-p 必须稍作修改,但您对 Python 3 只字未提,遗憾的是,版本 2 现在是“默认”...
【讨论】:
请解释一下:在这种情况下,基类和 MarketItem 类的元类是什么? (Qt 类是扩展,是 C 语言 Qt 库的包装。“Base”类是 sqlalchemy 模块通过调用 declarative_base() 方法生成的类。问题没有显示 metaclass 为派生类MarketItem声明的属性,那么它的元类是什么?) 错误消息是否希望派生类的元类是所有基类的元类集的子集,或者只是最终的基类(对于 Qt 类,'type' 和 sqlalchemy 类是什么?)?以上是关于结合 Qgraphics 和 sqlalchemy 时出现元类错误的主要内容,如果未能解决你的问题,请参考以下文章
Qt - 使用 QTransform(或类似的),将内部 QRect 缩放到 QGraphics/从 QGraphics