Сериализация формы для сохранения и повторного рисования

У меня есть 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();

Это компилируется нормально, хотя я не совсем уверен, что делаю это правильно, в файл ничего не записывается, поэтому я предполагаю, что я все еще где-то далеко.


person bauervision    schedule 17.04.2017    source источник


Ответы (1)


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;
person dtech    schedule 17.04.2017
comment
спасибо за ответ. У меня есть путь как переменная-член в моем приложении. Я проверял, является ли file.exists(), который всегда возвращал true, поэтому я подумал, что это может быть другая проблема. Буду ли я использовать: файл QFile (../path.dat); file.open(QIODevice::WriteOnly); QDataStream и оператор‹‹(QDataStream и поток, const QPainterPath и путь)? - person bauervision; 17.04.2017
comment
Вы должны использовать out << path; для записи и, соответственно, in >> path; для чтения пути. - person dtech; 17.04.2017
comment
То, что файл существует, не означает, что вы можете его открыть, поскольку у вас может не быть прав для выполнения этой задачи. - person eyllanesc; 17.04.2017