作成環境について
Qt Creator 4.3.1で、以下の設定で、プロジェクトを作成しております。以下の設定でクラス名、cppファイル名、hファイル名はすべてデフォルトを使用しています。
- Qtウィジェットアプリケーション
- 基底クラスは、QMainWindows
- フォームを生成する
ユーザー定義クラス(独自クラス)であるPaintクラスの情報をファイルに保存できるようにする
まず、ユーザー定義クラスであるPaintクラスを作成します。
方法は、プロジェクトを選択して、右クリック。
新しいファイルの追加を選択して、C++クラスを選択します。
後は、クラス名を入力すると、paint.cppとpaint.hがともに作成されます。
修正するコードは以下の3つです。
- paint.cpp
- QDataStreamクラスの >>と << の演算子のオーバーロードの実装のみ、こちらに記載しています。なぜ、cppファイルに記載したかというとどこかのページで、このメソッドは、cppファイルに実装すべきだと記載されていたためです。
- paint.h
- 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.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);
http://doc.qt.io/qt-5/qdatastream.html
実行結果
上記プロジェクトを実行した結果は以下のとおりです。
- この記事は、入門 Qt4 プログラミングのP314の内容を参考にしています。
- 上記の書籍は購入はしましたが、この本は、Qt4の情報なので、内容は少し古いです。(´;ω;`)