0

在我的应用程序是用 Qt 编写的,我有一个 QGraphicsScene。在这个 QgraphicsScene 中有一个图像和一些用户绘制的项目。我想保存这个 QgraphicsScene,上面有很多东西。

例如我有这个东西:

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

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

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

但我不想为 QGraphicsPixmapItem 重载 operator>>,我真的不知道怎么做。

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

任何想法都值得赞赏。

4

1 回答 1

4

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, 等...),请以相同的方式进行。

于 2013-08-30T02:46:48.687 回答