Сериализация с Qt - программирование
Подтвердить что ты не робот

Сериализация с Qt

Я программирую графический интерфейс с библиотекой Qt. В моем графическом интерфейсе у меня есть огромная std:: map.

"MyType" - это класс, который имеет разные типы полей.

Я хочу сериализовать std:: map. Как я могу это сделать? Qt предоставляет нам дополнительные функции?

4b9b3361

Ответ 1

QDataStream обрабатывает различные типы данных С++ и Qt. Полный список доступен по адресу http://doc.qt.io/qt-4.8/datastreamformat.html. Мы также можем добавить поддержку наших собственных пользовательских типов путем перегрузки < и → операторов. Здесь определение пользовательского типа данных, которое можно использовать с QDataStream:

class Painting
{
public:
    Painting() { myYear = 0; }
    Painting(const QString &title, const QString &artist, int year) {
        myTitle = title;
        myArtist = artist;
        myYear = year;
    }
    void setTitle(const QString &title) { myTitle = title; }
    QString title() const { return myTitle; }
    ...
private:
    QString myTitle;
    QString myArtist;
    int myYear;
};
QDataStream &operator<<(QDataStream &out, const Painting &painting);
QDataStream &operator>>(QDataStream &in, Painting &painting);

Здесь мы будем реализовывать < < Оператор:

QDataStream &operator<<(QDataStream &out, const Painting &painting)
{
    out << painting.title() << painting.artist()
        << quint32(painting.year());
    return out;
}

Чтобы вывести Painting, мы просто выводим два QStrings и quint32. В конце функции мы возвращаем поток. Это общая идиома С++, которая позволяет нам использовать цепочку < < операторы с потоком вывода. Например:

out < живопись1 < painting2 < painting3;

Реализация оператора → () аналогична реализации оператора < (lt;):

QDataStream &operator>>(QDataStream &in, Painting &painting)
{
    QString title;
    QString artist;
    quint32 year;
    in >> title >> artist >> year;
    painting = Painting(title, artist, year);
    return in;
}

Это от: С++ GUI Программирование с Qt 4 by Jasmin Blanchette, Марк Саммерфилд