2010-04-03 8 views
46

Ich programmiere eine GUI mit Qt-Bibliothek. In meiner GUI habe ich eine riesige std :: map.Serialisierung mit Qt

"MyType" ist eine Klasse, die verschiedene Arten von Feldern hat.

Ich möchte die std :: map serialisieren. Wie kann ich das machen? Stellt Qt uns die notwendigen Funktionen zur Verfügung?

Antwort

85

QDataStream behandelt eine Vielzahl von C++ - und Qt-Datentypen. Die vollständige Liste ist verfügbar unter http://doc.qt.io/qt-4.8/datastreamformat.html. Wir können auch Unterstützung für unsere eigenen benutzerdefinierten Typen hinzufügen, indem wir die Operatoren < < und >> überladen. Hier ist die Definition eines benutzerdefinierten Datentyp, der mit QDataStream verwendet werden können:

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); 

Hier ist, wie wir die < < Betreiber implementieren würde:

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

Zur Ausgabe ein Gemälde, wir einfach Ausgang zwei QStrings und ein Quint32. Am Ende der Funktion geben wir den Stream zurück. Dies ist ein gängiges C++ - Idiom, das es uns ermöglicht, eine Kette von < Operatoren mit einem Ausgabestrom zu verwenden. Zum Beispiel:

aus < < painting1 < < painting2 < < painting3;

Die Umsetzung des Operators >>() ist ähnlich der des Operator < <():

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

Dies ist aus: C++ GUI-Programmierung mit Qt 4 von Jasmin Blanchette, Mark Summer

+0

Es hat mich überrascht, dass die Liste der unterstützten Typen unvollständig ist: Sie bezieht sich wahrscheinlich nur auf die Typen, deren Serialisierung plattformübergreifend oder stabil ist. Zum Beispiel ist 'QSet' dort nicht aufgeführt. –

+0

'QGeoCoordinate' ist ein anderes Beispiel. –