Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Serialization with Qt

I am programming a GUI with Qt library. In my GUI I have a huge std::map.

"MyType" is a class that has different kinds of fields.

I want to serialize the std::map. How can I do that? Does Qt provides us with neccesary features?

like image 473
Narek Avatar asked Apr 03 '10 08:04

Narek


People also ask

What is serialization in Qt?

The QDataStream class allows you to serialize the Qt data types listed in this section as of version 18. It is always best to cast integers to a Qt integer type, such as qint16 or quint32, when reading and writing.

How do you serialize in C++?

Object Serialization with the Boost C++ Library Boost serialization works in two ways: one is called the intrusive method and another is the non-intrusive method. The intrusive method is the simplest one where we build mechanism of serialization in the object itself.


1 Answers

QDataStream handles a variety of C++ and Qt data types. The complete list is available at http://doc.qt.io/qt-4.8/datastreamformat.html. We can also add support for our own custom types by overloading the << and >> operators. Here's the definition of a custom data type that can be used with 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); 

Here's how we would implement the << operator:

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

To output a Painting, we simply output two QStrings and a quint32. At the end of the function, we return the stream. This is a common C++ idiom that allows us to use a chain of << operators with an output stream. For example:

out << painting1 << painting2 << painting3;

The implementation of operator>>() is similar to that of operator<<():

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

This is from: C++ GUI Programming with Qt 4 By Jasmin Blanchette, Mark Summerfield

like image 119
Narek Avatar answered Sep 20 '22 23:09

Narek