2013-08-29 15 views
0

在我的應用程序是用Qt編寫的,我有一個QGraphicsScene。在這個QgraphicsScene中有一個圖像和一些用戶繪製的項目。我想把這個QgraphicsScene保存在它上面。讀寫QGraphicsScene到一個二進制文件

,比如我有這個東西:

QGraphicsPixmapItem* image; 
QPointF point; 
ChromosomeShape::type pointType; 
QGraphicsItem *item; 

當我保存這些到文件,這似乎是沒有問題的

但是當我想要加載(datastream >> image;),我得到了一些錯誤有關"no match 'operator >>', qdatastream and QGraphicsPixmapItem*"

但我不想超載operaptor >> for QGraphicsPixmapItem,真的我不知道如何。

問:有沒有什麼辦法可以做到這一點?

任何想法是很好的讚賞。

回答

4

從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(如isActiveisVisible,acceptDrop,offset,shapeMode, transformationMode等等),就按照相同的方式進行。