web-dev-qa-db-fra.com

Sérialisation avec Qt

Je programme une interface graphique avec la bibliothèque Qt. Dans mon interface graphique, j'ai un énorme std :: map.

"MyType" est une classe qui a différents types de champs.

Je veux sérialiser la carte std ::. Comment puis je faire ça? Qt nous fournit-il des fonctionnalités nécessaires?

49
Narek

QDataStream gère une variété de types de données C++ et Qt. La liste complète est disponible sur http://doc.qt.io/qt-4.8/datastreamformat.html . Nous pouvons également ajouter la prise en charge de nos propres types personnalisés en surchargeant les opérateurs << et >>. Voici la définition d'un type de données personnalisé qui peut être utilisé avec 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);

Voici comment nous implémenterions l'opérateur <<:

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

Pour sortir une peinture, nous sortons simplement deux QStrings et un quint32. À la fin de la fonction, nous retournons le flux. Il s'agit d'un idiome C++ commun qui nous permet d'utiliser une chaîne d'opérateurs << avec un flux de sortie. Par exemple:

out << peinture1 << peinture2 << peinture3;

L'implémentation de l'opérateur >> () est similaire à celle de l'opérateur << ():

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

Cela vient de: Programmation GUI C++ avec Qt 4 Par Jasmin Blanchette, Mark Summerfield

94
Narek