Estoy usando la clase Qt QGraphicsScene
, agregando elementos predefinidos como QGraphicsRectItem
, QGraphicsLineItem
, etc. y deseo serializar el contenido de la escena en el disco. Sin embargo, la clase base QGraphicsItem
(de la que derivan los otros elementos que utilizo) no es compatible con la serialización, por lo que necesito transferir mi propio código. El problema es que todo el acceso a estos objetos es a través de un puntero QGraphicsItem
base, por lo que el código de serialización que tengo es horrible:Serialización QGraphicsScene contents
QGraphicsScene* scene = new QGraphicsScene;
scene->addRect(QRectF(0, 0, 100, 100));
scene->addLine(QLineF(0, 0, 100, 100));
...
QList<QGraphicsItem*> list = scene->items();
foreach (QGraphicsItem* item, items)
{
if (item->type() == QGraphicsRectItem::Type)
{
QGraphicsRectItem* rect = qgraphicsitem_cast<QGraphicsRectItem*>(item);
// Access QGraphicsRectItem members here
}
else if (item->type() == QGraphicsLineItem::Type)
{
QGraphicsLineItem* line = qgraphicsitem_cast<QGraphicsLineItem*>(item);
// Access QGraphicsLineItem members here
}
...
}
Esto no es bueno en mi humilde opinión código. Así, en lugar que podría crear una clase ABC como esto:
class Item
{
public:
virtual void serialize(QDataStream& strm, int version) = 0;
};
class Rect : public QGraphicsRectItem, public Item
{
public:
void serialize(QDataStream& strm, int version)
{
// Serialize this object
}
...
};
puedo continuación, añadir objetos Rect usando QGraphicsScene::addItem(new Rect(,,,));
Pero esto realmente no me ayuda como el siguiente se colgará:
QList<QGraphicsItem*> list = scene->items();
foreach (QGraphicsItem* item, items)
{
Item* myitem = reinterpret_class<Item*>(item);
myitem->serialize(...) // FAIL
}
¿De alguna manera puedo hacer que esto funcione?
¿Por qué 'myitem-> serialize()' falla.No lo estoy viendo? –