nprogram’s blog

気ままに、プログラミングのトピックについて書いていきます

Qtで、ユーザー定義クラスのデータを保存する方法

作成環境について

Qt Creator 4.3.1で、以下の設定で、プロジェクトを作成しております。以下の設定でクラス名、cppファイル名、hファイル名はすべてデフォルトを使用しています。

  • Qtウィジェットアプリケーション
  • 基底クラスは、QMainWindows
  • フォームを生成する

ユーザー定義クラス(独自クラス)であるPaintクラスの情報をファイルに保存できるようにする

まず、ユーザー定義クラスであるPaintクラスを作成します。 方法は、プロジェクトを選択して、右クリック。

f:id:nprogram:20170806201927p:plain

新しいファイルの追加を選択して、C++クラスを選択します。

f:id:nprogram:20170806201958p:plain

後は、クラス名を入力すると、paint.cppとpaint.hがともに作成されます。

f:id:nprogram:20170806202110p:plain

修正するコードは以下の3つです。

  • paint.cpp
    • QDataStreamクラスの >>と << の演算子オーバーロードの実装のみ、こちらに記載しています。なぜ、cppファイルに記載したかというとどこかのページで、このメソッドは、cppファイルに実装すべきだと記載されていたためです。
  • paint.h
    • Paintクラスの宣言・実装を記載します。
  • main.cpp
    • in.txtファイルに、Paintクラスの情報を書き込みます。その後、in.txtファイルから、Paintクラスの情報を取り出し、標準出力させています。

[paint.h]

#ifndef PAINT_H
#define PAINT_H

#include <QString>
#include <QDataStream>

class Paint
{
public:
    QString _title;
    int _year;

public:
    Paint(){}
    Paint(QString title, int year) {
        _title = title;
        _year = year;
    }
};

QDataStream &operator << (QDataStream &out, const Paint &paint);
QDataStream &operator >> (QDataStream &in, Paint &paint);

#endif // PAINT_H

[paint.cpp]

#include "paint.h"

QDataStream &operator << (QDataStream &out, const Paint &paint)
{
    out << paint._title << qint32(paint._year);
    return out;
}

QDataStream &operator >> (QDataStream &in, Paint &paint)
{
    QString title;
    qint32 year;

    in >> title >> year;

    paint = Paint(title, static_cast<int>(year));

    return in;
}

[main.cpp]

#include "mainwindow.h"
#include <QApplication>
#include <QFile>
#include <QDataStream>
#include <iostream>
#include <String>
#include "paint.h"

int main(int argc, char *argv[])
{
    QFile file("in.txt");
    file.open(QIODevice::WriteOnly);

    Paint paint("picaso", 1932);
    QDataStream out(&file);
    out.setVersion(QDataStream::Qt_4_5);
    out << paint;
    file.close();

    file.open(QIODevice::ReadOnly);

    Paint readInfo;
    out.setVersion(QDataStream::Qt_4_5);
    out >> readInfo;

    std::cout << "title : " << readInfo._title.toStdString() << std::endl << "age : " << readInfo._year << std::endl;

    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

注意ポイント

Qtの最新のドキュメントに記載されているオーバーロード演算子の記載に合うように、演算子オーバーロードしないと、エラーになるので、注意してください。

[Qt最新ドキュメントのオーバーロード宣言]

QDataStream &operator<<(QDataStream &, const QXxx &);
QDataStream &operator>>(QDataStream &, QXxx &);

[ユーザー定義クラスのオーバーロード宣言]

QDataStream &operator << (QDataStream &out, const Paint &paint);
QDataStream &operator >> (QDataStream &in, Paint &paint);
  • Qt5 公式ドキュメント QDataStream

http://doc.qt.io/qt-5/qdatastream.html

実行結果

上記プロジェクトを実行した結果は以下のとおりです。

f:id:nprogram:20170806210627p:plain

  • この記事は、入門 Qt4 プログラミングのP314の内容を参考にしています。
    • 上記の書籍は購入はしましたが、この本は、Qt4の情報なので、内容は少し古いです。(´;ω;`)