2017-04-17 20 views
0

私はQPainterPathを描画しているQGraphicsSceneを持っています。シェイプを保存して、アプリケーションが再び実行されるときに再描画する必要があります。ここでは、私が形状、単純化されたバージョン、および私の書き込みメソッドを描いている方法です。保存して再描画するためにシェイプをシリアライズ

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となります。しかし、これまでのところ、何もファイルに書き込まれていないので、これを得ることはできません。また、私は最初にデータのシリアル化から何を期待するべきかについて完全にはわかっていません。

これについての助力はすばらしいでしょう。

EDIT:フィードバックに基づいて、私は今、私の書き込み方法でこれに

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も指定しないので、ディスクに書き込んだとしても、1つのシングルポイントだけを書き込んで、毎回前のものを上書きします。

編集:あなたの編集に基づいて、あなたは自分より先に進んでいるように見えますが、それを使用するには、まだ基本的な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"); QFileファイル ファイルオープン(QIODevice :: WriteOnly); QDataStream&operator <<(QDataStream&stream、const QPainterPath&path) ? – bauervision

+0

パスを読み込むには、 'out << path;'と 'in >> path;'をそれぞれ書きます。 – dtech

+0

ファイルが存在するということは、そのタスクを実行する権限がない可能性があるため、ファイルを開くことを意味するものではありません。 – eyllanesc

関連する問題