Trong ứng dụng được viết bằng Qt, tôi có QGraphicsScene. Trong QgraphicsScene này có một hình ảnh và một số mục do người dùng vẽ. Tôi muốn lưu QgraphicsScene này cùng với tất cả nội dung của nó.
Ví dụ tôi có cái này:
Hình ảnh QGraphicsPixmapItem*;
điểm QPointF;
Nhiễm sắc thểShape::loại pointType;
QGraphicsItem *mục;
Khi tôi lưu chúng vào một tập tin thì dường như không có vấn đề gì
Nhưng khi tôi muốn tải (dòng dữ liệu >> hình ảnh;
), tôi hiểu được điều gì đó về "không khớp với 'toán tử >>', qdatastream và QGraphicsPixmapItem*"
lỗi
Nhưng tôi không muốn quá tải operator>> cho QGraphicsPixmapItem và tôi thực sự không biết cách thực hiện.
Hỏi: Có cách nào để làm điều này không?
Bất kỳ ý tưởng được đánh giá rất cao.
Qt không cung cấp khả năng đọc và ghi QGraphicsScene từ các tệp nhị phân và nếu bạn không quen sử dụng các lớp trừu tượng và phân cấp cây để tuần tự hóa, thì việc này sẽ rất dài dòng và khó thực hiện một mình. Cái nàyNếu bạn muốn thử nó, nó sẽ là người bạn tốt nhất của bạn. Đối với QGraphicsScene bạn có tình huống này ở giữa
Trong trường hợp của bạn, có thể bạn chỉ muốn đọc/ghi một phần nhỏ của QGraphicsScene mà bạn biết trước, vì vậy điều đó có thể khả thi. Ví dụ: nếu bạn cố gắng đọc/ghi QGraphicsPixmapMục
Bắt đầu tương tự. Vì vậy, bạn phải tự mình thực hiện hai phương pháp này:
QDataStream &operator<<(QDataStream &, const QGraphicsPixmapItem &);
QDataStream &operator>>(QDataStream &, QGraphicsPixmapItem &);
Điều đó vẫn chưa tồn tại. Khi bạn nói "Khi tôi lưu những thứ này vào một tệp, dường như không có vấn đề gì" thì có lẽ bạn chỉ đang ghi vào QGraphicsPixmapItem của mìnhĐịa chỉ, tức là chỉ là số 32 hoặc 64 bit, không thể đọc lại được ;-) Cụ thể hơn, bạn có thể làm:
luồng dữ liệu << hình ảnh; // viết QGraphicsPixmapItem*, vô dụng
thay thế:
datastream << *image; // viết QGraphicsPixmapItem, hữu ích nhưng không được cung cấp bởi Qt
Hy vọng rằng điều này sẽ không quá phức tạp để viết vì Qt đã cung cấp các chức năng tuần tự hóa QPixmap và QTransform. Hãy thử một cái gì đó như:
QDataStream &operator<<(QDataStream & out, const QGraphicsPixmapItem & item)
{
out << item.transform() << item.pixmap();
trở về;
}
QDataStream &operator>>(QDataStream & in, QGraphicsPixmapItem & item)
{
QTransform t;
QPixmap p;
trong >> t >> p;
item.setTransform(t);
item.setPixmap(p);
trở lại ;
}
Sau đó bạn có thể lưu QGraphicsPixmapMục *
có:
luồng dữ liệu << *hình ảnh;
Tải nó:
QGraphicsPixmapItem * hình ảnh = QGraphicsPixmapItem mới();
luồng dữ liệu >> *hình ảnh;
Nếu bạn cần lưuQGraphicsPixmapMục
các thuộc tính khác (chẳng hạn nhưđang hoạt động
, có thể nhìn thấy
, chấp nhậnThả
, bù lại
, hình dạngChế độ
, chế độ chuyển đổi
, v.v...), hãy tiến hành theo cách tương tự.
Tôi là một lập trình viên xuất sắc, rất giỏi!