В моем приложении написано в Qt, у меня есть QGraphicsScene. В этом QgraphicsScene есть изображение и некоторые элементы, которые рисует пользователь. Я хочу сохранить этот QgraphicsScene со всем этим.
например у меня есть такие вещи:
QGraphicsPixmapItem* image;
QPointF point;
ChromosomeShape::type pointType;
QGraphicsItem *item;
когда я сохраняю их в файл, кажется, нет проблем
но когда я хочу загрузить (datastream >> image;
) Я получил ошибку "no match 'operator >>', qdatastream and QGraphicsPixmapItem*"
но я не хочу перегружать operaptor >> для QGraphicsPixmapItem, и на самом деле я не знаю как.
Q: есть ли способ сделать это?
любая идея высоко ценится.
Чтение и запись 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
и т. д.), просто действуйте так же.
Других решений пока нет …