1

QGraphicsItemsqlalchemy を使用して 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

ありがとう、リチャード

4

1 に答える 1

1

同様の質問が以前に尋ねられました、そしてそれへの答えは私があなたのために可能な解決策を作るのを助けました。

class CommonMetaclass(type(QtCore.Qt), type(Base)):
    pass

class MarketItem(QtGui.QGraphicsEllipseItem, QtGui.QListWidgetItem, Base):
    __metaclass__ = CommonMetaclass
    __tablename__ = "marketitem"
    ...

このようにクラスを宣言することができましたが、実際に使用できるかどうかはわかりません。

何かが正しくない場合は、これらのクラス定義の両方で親クラスの順序を変更してみてください。

Python 3の場合、このスニペットを少し変更する必要がありますが、Python 3については何も言わず、残念ながら、バージョン2は現在「デフォルト」です...

于 2012-07-22T22:43:19.827 に答える