читать и записывать QGraphicsScene в двоичный файл

В моем приложении написано в Qt, у меня есть QGraphicsScene. В этом QgraphicsScene есть изображение и некоторые элементы, которые рисует пользователь. Я хочу сохранить этот QgraphicsScene со всем этим.

например у меня есть такие вещи:

QGraphicsPixmapItem* image;
QPointF point;
ChromosomeShape::type pointType;
QGraphicsItem *item;

когда я сохраняю их в файл, кажется, нет проблем

но когда я хочу загрузить (datastream >> image;) Я получил ошибку "no match 'operator >>', qdatastream and QGraphicsPixmapItem*"

но я не хочу перегружать operaptor >> для QGraphicsPixmapItem, и на самом деле я не знаю как.

Q: есть ли способ сделать это?

любая идея высоко ценится.

0

Решение

Чтение и запись QGraphicsScene из двоичного файла и в него не предоставляется Qt и будет очень длинным и трудным для самостоятельного выполнения, если вы не привыкли к сериализации с абстрактными классами и древовидными иерархиями.это будет вашим лучшим другом, если вы хотите попробовать. В случае QGraphicsScene вы находитесь в эта ситуация

В вашем случае вы, вероятно, захотите только прочитать / записать небольшое подмножество QGraphicsScene, которое вы знаете заранее, поэтому это может быть осуществимо. Например, просто начните, как вы, пытаясь читать / писать QGraphicsPixmapItem, Следовательно, вам нужно реализовать два метода:

QDataStream &operator<<(QDataStream &, const QGraphicsPixmapItem &);
QDataStream &operator>>(QDataStream &, QGraphicsPixmapItem &);

Это еще не существует. То, что вы, вероятно, написали, когда сказали «когда я сохраняю их в файл, кажется, что проблем нет» — это только адрес вашего QGraphicsPixmapItem, то есть просто 32- или 64-битное число, которое бесполезно, чтобы иметь возможность прочитать его снова 😉 Более конкретно, вы, вероятно, сделали:

datastream << image; // writing a QGraphicsPixmapItem*, useless

вместо:

datastream << *image; // writing a QGraphicsPixmapItem, useful but not provided by Qt

Надеемся, что это не должно быть слишком сложным для написания, поскольку Qt уже предоставляет функции сериализации QPixmap и QTransform. Попробуйте что-то вроде:

QDataStream &operator<<(QDataStream & out, const QGraphicsPixmapItem & item)
{
out << item.transform() << item.pixmap();
return out;
}

QDataStream &operator>>(QDataStream & in, QGraphicsPixmapItem & item)
{
QTransform t;
QPixmap p;
in >> t >> p;
item.setTransform(t);
item.setPixmap(p);
return in;
}

И тогда вы можете спасти себя QGraphicsPixmapItem * с:

datastream << *image;

И загрузите его:

QGraphicsPixmapItem * image = new QGraphicsPixmapItem();
datastream >> *image;

Если вам нужно сохранить другие свойства вашего QGraphicsPixmapItem (такие как isActive, isVisible, acceptDrop, offset, shapeMode, transformationModeи т. д.), просто действуйте так же.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]