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 などになります。しかし、ファイルに何も書き込まれていないため、ここまで到達できません。さらに、そもそもデータのシリアル化から何を期待できるのか完全にはわかりません。

これに関するヘルプは素晴らしいでしょう。

編集:フィードバックに基づいて、私は今、私の書き込み方法でこれを試みています

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

これは正常にコンパイルされますが、私がそれを正しく行っているかどうかは完全にはわかりませんが、ファイルには何も書き込まれていないため、まだどこかでオフになっていると思います。

4

1 に答える 1

3

QPainterPathQt は、直接シリアル化および逆シリアル化するために必要な演算子を既に提供しています。

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

したがって、複雑なマルチコンポーネント パスを含む、パスの正確なコンテンツをシリアル化できる場合は、ポイントをシリアル化する必要はありません。

したがって、パスを永続メンバー変数として実装して、ファイルから読み取ったり、ファイルに書き込んだりできるようにする必要があります。 draw メソッドでは、パスを描画するだけです。

現在、私のファイルは実行時に書き込まれることはありません。

私の賭けは、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;
于 2017-04-17T18:29:59.430 に答える