序列化形状以保存和重新绘制

时间:2017-04-17 18:09:48

标签: c++ qt qdatastream

我有一个QGraphicsScene,我正在绘制一个QPainterPath,我需要能够保存形状,并在应用程序再次运行时重绘它。以下是我绘制形状,简化版本和写入方法的方法。

void drawPath(){
    QPoint p1 = QPoint(10, 20);
    writePointsToFile(p1);
    QPoint p2 = QPoint(25, 30);
    writePointsToFile(p2);
    QPoint p3 = QPoint(40, 60);
    writePointsToFile(p3);

    QPainterPath path;
    path.moveTo(p1.x(), p1.y());
    path.lineTo(p2.x(), p2.y());
    path.lineTo(p3.x(), p3.y());
}

void writePointsToFile(QPoint point){
    QFile file("../path.dat");
    file.open(QIODevice::WriteOnly);
    QDataStream out(&file);
    out << point;
    file.close();
}

目前,我的文件在运行时从不写入。

但除此之外,序列化这些数据的正确方法是否可以重建形状?

我以为我能够处理重新绘制,但我不能很好地理解序列化。

我是否将这些点序列化? 列表包含点?

我的想法是,如果我序列化点,当我反序列化时,我然后将它们添加到列表中,我应该能够根据列表中每个点的位置重新创建形状;即位置0处的点将是p1,点位置1将是p2等等。但是我无法得到这一点,因为无论如何都没有写入文件。另外,我并不完全确定首先对数据序列化有什么期望。

对此有任何帮助都很棒。

编辑:基于反馈,我现在正在尝试使用我的写法

QFile file("../path.dat");
file.open(QIODevice::WriteOnly);
QDataStream out(&file);
QDataStream & operator << (QDataStream& file, const QPainterPath& path);
out << path;
file.close();

这个编辑很好,即使我不完全确定我做的那样,没有任何东西写入文件,所以我假设我还在某个地方。

1 个答案:

答案 0 :(得分:3)

Qt已经提供了直接序列化和反序列化QPainterPath所必需的运算符:

QDataStream &   operator<<(QDataStream & stream, const QPainterPath & path)
QDataStream &   operator>>(QDataStream & stream, QPainterPath & path)

因此,当您可以序列化路径的确切内容(包括复杂的多组件路径)时,无需序列化点。

因此,您应该将路径实现为持久成员变量,以便您可以从中读取或将其写入文件,而在draw方法中,您只需绘制路径。

  

目前,我的文件在运行时从不写入。

我的赌注是因为永远不会调用writePointsToFile()。当您尝试打开文件等时,您也可能养成检查错误的好习惯。你也没有指定QIODevice::Append,所以即使你写了磁盘,你也只会写一个点,每次都会覆盖前一个点。

编辑:基于您的编辑,看起来您已经领先于自己,并且在您急于使用它之前仍然需要学习基本的C ++。尝试这样的事情,并找出你出错的地方:

QPoint p1 = QPoint(10, 20);
QPoint p2 = QPoint(25, 30);
QPoint p3 = QPoint(40, 60);

QPainterPath path;
path.moveTo(p1.x(), p1.y());
path.lineTo(p2.x(), p2.y());
path.lineTo(p3.x(), p3.y());

QFile file("../path.dat");
if (!file.open(QIODevice::WriteOnly)) return;
QDataStream out(&file);
out << path;