在我的应用程序中用Qt编写,我有一个QGraphicsScene。在这个QgraphicsScene中有一个Image和一些由用户绘制的项目。我想把这个QgraphicsScene全部保存在其上。
例如我有这个东西:
QGraphicsPixmapItem* image;
QPointF point;
ChromosomeShape::type pointType;
QGraphicsItem *item;
当我将这些保存到文件时,似乎没有问题
但是当我想加载(datastream >> image;
)时,我收到了一些关于"no match 'operator >>', qdatastream and QGraphicsPixmapItem*"
的错误
但我不想重载operaptor>>对于QGraphicsPixmapItem,我真的不知道如何。
问:我有什么方法可以做到这一点吗?任何想法都很受欢迎。
答案 0 :(得分:4)
Qt不提供从二进制文件读取和写入QGraphicsScene,如果您不习惯使用抽象类和树层次结构进行序列化,那么这将非常漫长且难以自行完成。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
等等......),以同样的方式进行。