Używam klasy Qt QGraphicsScene
, dodając predefiniowane elementy, takie jak QGraphicsRectItem
, QGraphicsLineItem
itd. I chcę serializować zawartość sceny na dysku. Jednak podstawowa klasa QGraphicsItem
(z której wywodzą się inne elementy) nie obsługuje serializacji, więc muszę przetworzyć własny kod. Problemem jest to, że dostęp do tych obiektów odbywa się za pomocą wskaźnika bazowego QGraphicsItem
, więc kod serializacji mam to straszne:Serializacja QGraphicsScene zawartość
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
}
...
}
To nie jest dobry kod IMHO. Tak więc, zamiast mogę utworzyć klasę ABC takiego:
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
}
...
};
mogę następnie dodać Rect obiektów za pomocą QGraphicsScene::addItem(new Rect(,,,));
Ale to naprawdę nie pomaga mi jak dodaje padnie:
QList<QGraphicsItem*> list = scene->items();
foreach (QGraphicsItem* item, items)
{
Item* myitem = reinterpret_class<Item*>(item);
myitem->serialize(...) // FAIL
}
W jaki sposób mogę to wykonać?
Dlaczego 'myitem-> serialize()' crash.Nie widzę tego? –