gpt4 book ai didi

c++ - 读写 QGraphicsScene 到二进制文件

转载 作者:行者123 更新时间:2023-11-27 23:13:23 30 4
gpt4 key购买 nike

在我的应用程序中是用 Qt 编写的,我有一个 QGraphicsScene。在这个 QgraphicsScene 中有一个图像和一些由用户绘制的项目。我想保存这个包含所有内容的 QgraphicsScene。

例如我有这个东西:

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

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

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

但我不想为 QGraphicsPixmapItem 重载运算符>>,我真的不知道该怎么做。

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

非常感谢任何想法。

最佳答案

Qt 不提供从二进制文件读取和写入 QGraphicsScene,如果您不习惯使用抽象类和树层次结构进行序列化,那么您自己将非常冗长且难以完成。 This如果您想尝试一下,它将是您最好的 friend 。对于 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, etc...), 以同样的方式进行。

关于c++ - 读写 QGraphicsScene 到二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18521779/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com