将QGraphicsScene读取并写入二进制文件
read and write QGraphicsScene to a binary file
在我的应用程序是用Qt编写的,我有一个QGraphicsScene。在这个QgraphicsScene中有一个图像和一些由用户绘制的项目。我想保存这个QgraphicsScene上的所有东西。
例如,我有这样的东西:
QGraphicsPixmapItem* image;
QPointF point;
ChromosomeShape::type pointType;
QGraphicsItem *item;
当我把这些保存到文件中时,似乎没有问题
但是当我想加载(datastream >> image;
)时,我得到了一些关于"no match 'operator >>', qdatastream and QGraphicsPixmapItem*"
的错误
但我不想为QGraphicsPixmapItem重载操作器>>,而且我真的不知道怎么做。
Q: 有什么办法我能做到这一点吗?
任何想法都值得赞赏。
Qt不提供从二进制文件读取和向二进制文件写入QGraphicsScene的功能,如果您不习惯使用抽象类和树层次结构进行序列化,那么它将非常长,而且很难自己完成。如果你想试一试,这将是你最好的朋友。在QGraphicsScene的情况下,您处于这种情况
在您的情况下,您可能只想读/写预先知道的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
等),只需按照相同的方式进行即可。
- 正在读取二进制文件(is_open)
- 在C++中将类(带有Vector成员)保存为二进制文件
- 如何从二进制文件中读取字符串
- 保存/加载大量短数组到二进制文件
- 从二进制文件中读取整数数组
- Android 在编译二进制文件时重建静态库
- 在 C++ 中将双精度变量写入二进制文件
- clang 的 libFuzzer 可以在同一二进制文件中测试超过 1 个 API 吗?
- C++:实际上不是从二进制文件中读取
- 如何从二进制文件中的给定符号中获取调用程序图
- 将内部带有矢量的结构保存/读取到二进制文件中
- 编译多个C++文件.调用二进制文件以运行代码
- 如何使用位字段将数据从二进制文件复制到结构中?
- uint8_t同一二进制文件的不同十进制值
- C++单个生成文件多个二进制文件
- 尝试将数字写入二进制文件时引发异常
- C++中读/写二进制文件
- 如何忽略某些二进制文件的执行?
- 对在不同二进制文件中创建的对象文件的依赖关系
- 我的 SDL2 程序需要哪些二进制文件,以便它在另一台未安装 SDL2 的计算机中工作