nprogram’s blog

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

Qtで、ユーザー定義クラスのデータを保存する・読み出す方法 (Qt Designer使用)

作成環境について

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

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

Qt Designerを使用して、ユーザー定義クラスのデータをセーブ・ロードを読み出す

以下のような簡単なアプリを作成します

f:id:nprogram:20170806224700p:plain

  • mainwindow.uiのレイアウトは以下のようになります。TitleとAgeを入力するLine EditとPush Buttonが2つあれば問題ありません。

f:id:nprogram:20170806225114p:plain

  • セーブボタンとロードボタンを押したときのClickedイベントをスロットに登録しておいてください

以下はmainwindow.hの登録されたスロット

f:id:nprogram:20170806225729p:plain

[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