0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-06-18

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

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?