2017-04-17 19 views
0

我有一个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(); 

编译没有问题,即使我不能完全肯定我做了正确的,什么都没有写到文件,所以我认为我还在某个地方。

回答

3

的Qt已经提供了运营商,必要的序列化和反序列化QPainterPath直接:

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

所以没有必要序列点,当你可以序列化路径的具体内容,包括复杂的多组件路径。

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

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

我的打赌是因为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; 
+0

感谢您的回复。我在我的应用程序中有一个作为成员变量的路径。我正在检查file.exists()是否总是返回true,所以我认为这可能是另一个问题。我可以使用: QFile文件(“../ path.dat”); 文件。开放(QIODevice中::只写); (QDataStream&stream,const QPainterPath&path) ? – bauervision

+0

你可以使用'out << path;'来分别写入'in >>路径;'来读取路径。 – dtech

+0

该文件存在并不意味着您可以打开它,因为您可能没有执行该任务的权限。 – eyllanesc