}
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 обеспечивает чтение и запись каждого типа, включая контейнеры с произвольным числом элементов. Это освобождает нас от структурирования того, что мы записываем, и от выполнения какого бы то ни было синтаксического анализа того, что мы считываем
<< назад вперед >>