我有一个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();
这个编辑很好,即使我不完全确定我做的那样,没有任何东西写入文件,所以我假设我还在某个地方。
答案 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;