Ответ 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, Марк Саммерфилд