QVariant item_to_variant(QGraphicsItem* item) {
QVariantHash data;
//save all needed attributes
data["pos"] = item->pos();
data["rotation"] = item->rotation();
if(QGraphicsPixmapItem* pixmap_item = dynamic_cast<QGraphicsPixmapItem*>(item)) {
data["type"] = "pixmap";
data["pixmap"] = pixmap_item->pixmap();
} else { /*...*/ }
//...
return data;
}
QGraphicsItem* item_from_variant(QVariant v) {
QVariantHash data = v.toHash();
QGraphicsItem* result;
if (data["type"].toString() == "pixmap") {
result = new QGraphicsPixmapItem();
result->setPixmap(data["pixmap"].value<QPixmap>());
} else { /*...*/ }
result->setPos(data["pos"].toPointf());
result->setRotation(data["rotation"].toDouble());
//...
return result;
}
void save_state() {
QVariantList data_list;
foreach(QGraphicsItem* item, items_list) {
data_list << item_to_variant(item);
}
QSettings settings;
settings.setValue("items", data_list);
}
void restore_state() {
QSettings settings;
foreach(QVariant data, settings.value("items").toList()) {
QGraphicsItem* item = item_from_variant(data);
scene->addItem(item);
items_list << item;
}
}