從Qt中讀取QGraphicsScene並將其寫入二進制文件不是由Qt提供的,如果您不習慣使用抽象類和樹層次結構進行序列化,它將會非常漫長而且很難自行完成。如果你想嘗試一下,This將是你最好的朋友。在QGraphicsScene的情況下,你在this situation
在你的情況,你可能只想讀/寫你預先知道的一小部分QGraphicsScene,所以可能是可行的。例如,剛開始時您嘗試讀取/寫入QGraphicsPixmapItem
。因此,您必須實施兩種方法:
QDataStream &operator<<(QDataStream &, const QGraphicsPixmapItem &);
QDataStream &operator>>(QDataStream &, QGraphicsPixmapItem &);
那還不存在。當你說「當我將這些文件保存到文件中,看起來沒有問題」時,你可能寫過的只是QGraphicsPixmapItem的地址,即只是一個32或64位的數字,它無法讀取再次;-)更具體地說,你可能做的事:而不是
datastream << image; // writing a QGraphicsPixmapItem*, useless
:
datastream << *image; // writing a QGraphicsPixmapItem, useful but not provided by Qt
但願,這應該不會太複雜寫,因爲Qt的已經提供的QPixmap和QTransform序列化功能。嘗試是這樣的:
QDataStream &operator<<(QDataStream & out, const QGraphicsPixmapItem & item)
{
out << item.transform() << item.pixmap();
return out;
}
QDataStream &operator>>(QDataStream & in, QGraphicsPixmapItem & item)
{
QTransform t;
QPixmap p;
in >> t >> p;
item.setTransform(t);
item.setPixmap(p);
return in;
}
然後你就可以保存你QGraphicsPixmapItem *
有:
datastream << *image;
而且隨着加載:
QGraphicsPixmapItem * image = new QGraphicsPixmapItem();
datastream >> *image;
如果您需要保存的其他屬性您QGraphicsPixmapItem
(如isActive
,isVisible
,acceptDrop
,offset
,shapeMode
, transformationMode
等等),就按照相同的方式進行。