web-dev-qa-db-ja.com

Qtでのシリアル化

Qtライブラリを使用してGUIをプログラミングしています。私のGUIには、巨大なstd :: mapがあります。

「MyType」は、さまざまな種類のフィールドを持つクラスです。

Std :: mapをシリアル化したい。どうやってやるの? Qtは必要な機能を提供しますか?

49
Narek

QDataStreamは、さまざまなC++および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;
}

絵画を出力するには、2つのQStringと1つのquint32を出力するだけです。関数の最後で、ストリームを返します。これは、出力ストリームで一連の<<演算子を使用できる一般的なC++イディオムです。例えば:

out << painting1 << painting2 << painting3;

Operator >>()の実装は、operator <<()の実装に似ています。

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

Qt 4によるC++ GUIプログラミングJasmin Blanchette著、Mark Summerfield著

94
Narek