读取和写入QGraphicsScene到二进制文件

时间:2013-08-29 22:10:26

标签: c++ qt qgraphicsitem qfile

在我的应用程序中用Qt编写,我有一个QGraphicsScene。在这个QgraphicsScene中有一个Image和一些由用户绘制的项目。我想把这个QgraphicsScene全部保存在其上。

例如我有这个东西:

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

当我将这些保存到文件时,似乎没有问题

但是当我想加载(datastream >> image;)时,我收到了一些关于"no match 'operator >>', qdatastream and QGraphicsPixmapItem*"的错误

但我不想重载operaptor>>对于QGraphicsPixmapItem,我真的不知道如何。

问:我有什么方法可以做到这一点吗?

任何想法都很受欢迎。

1 个答案:

答案 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的其他属性(例如isActiveisVisibleacceptDropoffsetshapeModetransformationMode等等......),以同样的方式进行。