Ошибка метакласса при объединении Qgraphics и sqlalchemy

Я хочу сделать QGraphicsItems постоянным, используя sqlalchemy. Простое объединение класса Base с классами PySide дает ошибку о метаклассах. Тема метаклассов — это магия 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

Спасибо, Ричард


person Richard    schedule 18.07.2012    source источник
comment
Это похоже на простой случай необходимости указать метакласс, как описано здесь., но я недостаточно уверен, чтобы назвать это ответом.   -  person khoxsey    schedule 19.07.2012


Ответы (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 сейчас является «по умолчанию»...

person Oleh Prypin    schedule 22.07.2012
comment
Объясните, пожалуйста, подробнее: что такое метаклассы базовых классов и класса MarketItem в данном случае? (класс Qt является расширением, оболочкой библиотеки Qt языка C. Класс «Base» — это класс, созданный модулем sqlalchemy посредством вызова метода declarative_base(). Вопрос не показывает метакласс< /b> атрибут, объявленный для производного класса MarketItem, так что это метакласс какой?) - person bootchk; 13.11.2012
comment
Требуется ли сообщение об ошибке, чтобы метакласс производного класса был подмножеством набора метаклассов всех базовых классов или просто конечными базовыми классами (для классов Qt, «тип» и для классов sqlalchemy что?)? - person bootchk; 13.11.2012