}

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 мы просто выводим две строки типа QString и значение ти­па quint32. В конце функции мы возвращаем поток. Этот обычный в С++ прием по­зволяет использовать последовательность операторов « для вывода данных в поток. Например:

out « paintingl « painting2 « painting3;

Реализация оператора » аналогична реализации оператора «.

QDataStream &operator»(QDataStream &in, Painting &painting) {

QString title; QString artist; quint32 year;

in » title » artist » year;

painting = Painting(title, artist, year);

return in;

}

Обеспечение в пользовательских типах данных операторов ввода-вывода в по­ток дает несколько преимуществ. Одно из них заключается в том, что это позволяет нам выводить в поток контейнеры с пользовательскими типами. Например:

QList<Painting> paintings = ...; out « paintings;

Мы можем так же просто считывать контейнеры:

QList<Painting> paintings; in » paintings;

Это привело бы к ошибке компиляции, если бы тип Painting не поддерживал операции « или ». Еще одно преимущество обеспечения потоковых операторов в пользовательских типах заключается в возможности хранения этих типов в виде объектов QVariant, что расширяет возможности их применения, например, в объек­тах QSettings. Это будет работать при условии предварительной регистрации типа с помощью функции qRegisterMetaTypeStreamOperators<T>(), работа которой рас­сматривается в главе 11.

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


<< назад вперед >>