LINUX.ORG.RU

Qt QDataStream


0

1

не могу разобраться QDataStream.

как я понял этот код должен скопировать files2.png в file.png

Вот только file.png не открывается.

    QApplication a(argc, argv);
    QFile file("file.png");

    if(file.open(QIODevice::WriteOnly)) {
        QDataStream stream(&file);

        stream << QImage("files2.png");
    }


Если я правильно понимаю, то не должен. Он должен сериализовать объект класса QImage в файл. И в файле будет лежать именно объект, а не png.

unikoid ★★★
()
Ответ на: комментарий от nexus86

>зачем это нужно тогда?
Чтобы затем можно было считать именно объект. Иногда это бывает полезно. Пример, честно говоря, сходу не придумаю. Хотя давным давно в школьной поделке на делфи мы таким образом некую древовидную иерархию сохраняли, чтобы не париться с самодельным парсером и собственным форматом хранения данных.

unikoid ★★★
()
Ответ на: комментарий от unikoid

Это используется, например, для простой передачи объектов по сети. При этом автоматически производятся все преобразования порядка байт, и учитываются изменения в различных версиях Qt.

Так вот, для копирования небольших файлов:
[code]
char *raw = new char[file1.size()];
stream1.readRawData (raw, file1.size());
stream2.writeRawData (raw, file1.size());
[/code]

Для буферизированного копирования делать то же самое в цикле, следя за количеством прочитанных и записанных байт.
Важно использовать именно readRawData, writeRawData, потому что readBytes и writeBytes пишут опять же сериализированную версию массива байт (добавляется длина).

Для просто записи и чтения с использованием операторов << и >> лучше напрямую указывать тип данных - stream << (qint32)value, чтобы не получить потом неожиданных ошибок.

note173 ★★★★★
()
Ответ на: комментарий от nexus86

Да всё просто, смотри. Вот у тебя есть класс Галерея. В галерее есть экземпляры класса Картина. У картины есть поля QImage (сама картина) и QString (название картины). Описав operator<< и operator>> в классах Картина и Галерея, ты смог бы, например, сохранять и загружать галереи и картины из файла.

Obey-Kun ★★★★★
()
Ответ на: комментарий от Obey-Kun

> operator<< и operator>>

Имелось в виду такие операторы для QDataStream

Obey-Kun ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.