2012-07-18 25 views
1

我想使用sqlalchemy使QGraphicsItem持久。輕鬆地將Base類與PySide類組合會給出一個關於元類的錯誤。 metaclbs主題是Python的魔力,我不想在不需要的時候深入研究。 有沒有簡單的方法來解決這個元類衝突?組合Qgraphics和sqlalchemy時出現Metaclass錯誤

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 

謝謝,理查德

+1

它看起來就像需要以一個簡單的情況下, [指定這裏描述的元類](http://code.activestate.com/recipes/204197-solving-the-metaclass-conflict/),但我沒有足夠的信心稱這是一個答案。 – khoxsey 2012-07-19 18:54:08

回答

1

類似的問題在前面已經問及the answer它幫助我做一個可能的解決方案爲您服務。

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

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

我能夠像這樣聲明類,不知道它是否實際可用。

如果有什麼不對,請嘗試在這兩個類定義中更改父類的順序。

對於Python 3這個段已稍微修改,但你什麼也沒有說關於Python 3,可悲的是,第2版是「默認」現在...

+0

請詳細解釋:在這種情況下,基類和MarketItem類的元類是什麼? (Qt類是一個擴展,是C語言Qt庫的一個包裝器,'Base'類是由sqlalchemy模塊通過調用declarative_base()方法生成的類,該問題沒有顯示聲明的__metaclass__屬性派生類MarketItem,所以它的元類是什麼?) – bootchk 2012-11-13 16:01:07

+0

錯誤消息是否希望派生類的元類是所有基類的元類集合的一個子集,或者只是最終的基類(對於Qt類,「類型」和sqlalchemy類什麼?)? – bootchk 2012-11-13 16:07:36