2010-04-03 19 views
46

Estoy programando una GUI con la biblioteca Qt. En mi GUI tengo un gran estándar :: mapa.Serialización con Qt

"MyType" es una clase que tiene diferentes tipos de campos.

Quiero serializar el std :: map. ¿Cómo puedo hacer eso? ¿Qt nos proporciona las características necesarias?

Respuesta

85

QDataStream maneja una variedad de tipos de datos C++ y Qt. La lista completa está disponible en http://doc.qt.io/qt-4.8/datastreamformat.html. También podemos agregar soporte para nuestros propios tipos personalizados sobrecargando los operadores < < y >>. Esta es la definición de un tipo de datos personalizados que se pueden utilizar con 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); 

Así es como nos gustaría poner en práctica el operador < <:

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

A la salida de un cuadro, simplemente salida de dos QStrings y un quint32. Al final de la función, devolvemos la secuencia. Esta es una expresión común de C++ que nos permite utilizar una cadena de operadores < < con una secuencia de salida. Por ejemplo:

cabo < < painting1 < < painting2 < < painting3;

La implementación del operador >>() es similar a la del operador < <():

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

Esto es de: Programación C++ GUI con Qt 4 de Jasmin Blanchette, Mark Summerfield

+0

Se Me sorprendió que la lista de tipos soportados sea incompleta: probablemente solo haga referencia a los tipos de serialización de los cuales es multiplataforma o estable. Por ejemplo, 'QSet' no aparece en la lista. –

+0

'QGeoCoordinate' es otro ejemplo. –