作成環境について
Qt Creator 4.3.1で、以下の設定で、プロジェクトを作成しております。以下の設定でクラス名、cppファイル名、hファイル名はすべてデフォルトを使用しています。
- Qtウィジェットアプリケーション
- 基底クラスは、QMainWindows
- フォームを生成する
Qt Designerを使用して、ユーザー定義クラスのデータをセーブ・ロードを読み出す
以下のような簡単なアプリを作成します
- mainwindow.uiのレイアウトは以下のようになります。TitleとAgeを入力するLine EditとPush Buttonが2つあれば問題ありません。
- セーブボタンとロードボタンを押したときのClickedイベントをスロットに登録しておいてください
以下はmainwindow.hの登録されたスロット
[main.cpp]
- 記載を初期状態に戻してあります
セーブロード機能は、すべてMainWindowクラスのClickedイベントメソッドで実現するようにしました。 セーブボタンを押したときは、TitleとAgeが入力されたLine Editのテキストを取得して、ユーザー定義クラスの情報を、QDataStreamに << 演算子を用いて格納しています。格納後は、テキストをクリアしました。 ロードボタンを押したときは、>> 演算子を用いて、QDataStreamに格納されたユーザー定義クラスの情報を取り出して、TitleとAgeのLine Editのテキストに反映させます。
[mainwindow.cpp]
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QFile> #include <QDataStream> #include <QFileDialog> #include <QMessageBox> #include <iostream> #include <String> #include "paint.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_clicked() { QString fileName = QFileDialog::getSaveFileName(this, tr("Save Paint Info"), "", tr("Paint info (*.txt);;All Files (*)")); if (fileName.isEmpty()) return; QFile file(fileName); if (!file.open(QIODevice::WriteOnly)) { QMessageBox::information(this, tr("Unable to open file"), file.errorString()); return; } // Line Editウィジェット(オブジェクト名はlineTitle)から文字列titleを取得 QString title = ui->lineTitle->text(); // Line Editウィジェット(オブジェクト名はlineAge)から数値ageを取得 int age = ui->lineAge->text().toInt(); Paint paint(title, age); QDataStream out(&file); out.setVersion(QDataStream::Qt_4_5); out << paint; file.close(); ui->lineTitle->clear(); ui->lineAge->clear(); } void MainWindow::on_pushButton_2_clicked() { QString fileName = QFileDialog::getOpenFileName(this, tr("Load Paint Info"), "", tr("Paint info (*.txt);;All Files (*)")); if (fileName.isEmpty()) return; QFile file(fileName); if (!file.open(QIODevice::ReadOnly)) { QMessageBox::information(this, tr("Unable to open file"), file.errorString()); return; } QDataStream in(&file); in.setVersion(QDataStream::Qt_4_5); Paint paint; in >> paint; ui->lineTitle->setText(paint._title); ui->lineAge->setText(QString::number(paint._year)); }
[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; }
[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