J'utilise la classe Qt QGraphicsScene
, en ajoutant des éléments prédéfinis tels que QGraphicsRectItem
, QGraphicsLineItem
, etc. et je souhaite sérialiser le contenu de la scène sur le disque. Cependant, la classe de base QGraphicsItem
(que les autres éléments que j'utilise) ne supporte pas la sérialisation, donc j'ai besoin de rouler mon propre code. Le problème est que tous les accès à ces objets se fait par un pointeur de base QGraphicsItem
, de sorte que le code de sérialisation j'est horrible:Sérialisation du contenu de QGraphicsScene
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
}
...
}
Ce n'est pas bon à mon humble avis de code. Ainsi, au lieu que je pourrais créer un comme cette classe ABC:
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
}
...
};
Je peux alors ajouter des objets à l'aide Rect QGraphicsScene::addItem(new Rect(,,,));
Mais cela ne me permet pas vraiment comme nous allons planter:
QList<QGraphicsItem*> list = scene->items();
foreach (QGraphicsItem* item, items)
{
Item* myitem = reinterpret_class<Item*>(item);
myitem->serialize(...) // FAIL
}
De toute façon je peux faire ce travail?
Pourquoi 'myitem-> serialize()' plante-t-il?Je ne le vois pas? –