はじめてC++で画面を作ろう! (7) QSettings編

#23.アプリ情報を記録しよう!!
Windows系は、アプリ情報をレジストリに記録したり、.iniファイルに記録したりする。
Qtには、___QSettings___と言う便利なものがある。

これをインクルードして、新しく、読み込み用の___loadWinSetting()___関数と書き込み用の___saveWinSetting()___関数を書いていく。

```mainwindow.cpp
#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include <QSettings> /* これを追加 */
...省略...

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    loadWinSetting(); /* ここに追加 */
}

MainWindow::~MainWindow()
{
    saveWinSetting(); /* ここに追加 */
    delete ui;
}

/* この関数を追加 */
void MainWindow::loadWinSetting()
{
    QString iniFile = qAppName() + ".ini";
    QSettings setting(iniFile, QSettings::IniFormat);
    setting.setIniCodec(QTextCodec::codecForName("UTF-8"));

    setting.beginGroup("Window");
    int state = setting.value("WindowState", 0).toInt();
    int left = setting.value("Laft", 0).toInt();
    int top = setting.value("Top", 0).toInt();
    int width = setting.value("Width", 640).toInt();
    int height = setting.value("Height", 480).toInt();

    this->setGeometry(left, top, width, height);

    switch (state) {
    case 2:
        this->setWindowState(Qt::WindowMaximized);
        break;
    case 4:
        this->setWindowState(Qt::WindowFullScreen);
        break;
    default:
        this->setWindowState(Qt::WindowNoState);
        break;
    }

    setting.endGroup();
}

/* この関数を追加 */
void MainWindow::saveWinSetting()
{
    QString iniFile = qAppName() + ".ini";
    QSettings setting(iniFile, QSettings::IniFormat);
    setting.setIniCodec(QTextCodec::codecForName("UTF-8"));

    setting.beginGroup("Window");
    switch (this->windowState()) {
    case Qt::WindowNoState:
        setting.setValue("WindowState", 0);
        setting.setValue("Laft", this->pos().x());
        setting.setValue("Top", this->pos().y());
        setting.setValue("Width", this->width());
        setting.setValue("Height", this->height());
        break;
    case Qt::WindowMinimized:
        setting.setValue("WindowState", 0);
        break;
    case Qt::WindowMaximized:
        setting.setValue("WindowState", 2);
        break;
    case Qt::WindowFullScreen:
        setting.setValue("WindowState", 4);
        break;
    }
    setting.endGroup();
    setting.sync();
}
...省略...
```

C++では、MainWindowクラスに関数を作ると、ヘッダー側にも、定義する必要がある。

```mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

...省略...

class MainWindow : public QMainWindow
{

...省略...

private:
    Ui::MainWindow *ui;
    ...省略...
    void loadWinSetting(); /* ここに追加 */
    void saveWinSetting(); /* ここに追加 */
};
#endif // MAINWINDOW_H
```

#24.動作確認!!
画面の左下にある、右三角マークの「実行」ボタンをクリックして、「MainWindow」が出てくる!

一番、初めに起動した時は、デバッグ用のフォルダーには、まだ、hello.iniファイルが存在しない。

従って、value("Width", ___640___)の二番目の引数の ___640___が効いてくる。
結果、this->___setGeometry(0, 0, 640, 480)___となる。

アプリを閉じた時、その位置とサイズを記録するため、次に起動した時に、その場所を再現する。

[1] アプリを最小化したまま、終了した場合は、ノーマルで再現
[2] アプリを最大化したまま、終了した場合は、最大化を再現
[3] アプリをフルスクリーンで、終了した場合は、フルスクリーンを再現

※ちなみに最大化した状態で、this->pos().___x___()/___y___()は、マイナスの値になる。
これは、ウィンドウの枠幅だけ、画面の外に出ていることになる。

#25.QSettingsは、便利!!
数値型や文字列型の他にも、配列型なども記録できる。

Windowsアプリでは「最近、開いたファイル」を記録しておく場合も、これを使う。
他にも、プラグインの情報なども記録できる。

今回は、ここまで次回は、アプリに「アイコン」を設定しよう!!です。