nprogram’s blog

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

QSettingsを用いて、画面のサイズをセーブ・ロードしよう

作成環境について

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

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

プログラムについて

画面終了時の画面の幅と高さをQSettingsに格納します。

再度、アプリケーションを実行したときに、前回起動時の画面の幅と高さを再現するプログラムです。

修正コードは以下の2か所

  • mainwindow.cpp
  • mainwindow.h

[mainwindow.cpp]

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QSettings>
#include <QSize>

const QString ORG_NAME = "My Company";
const QString APP_NAME = "My Tool";

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QSettings settings("My Company", "My Tool");
    int width = settings.value("window/width").toInt();
    int height = settings.value("window/height").toInt();

    this->resize(QSize(width, height));
}

MainWindow::~MainWindow()
{
    delete ui;
}

// Qtでは、closeEventをオーバーライドする事で実現可能です。
void MainWindow::closeEvent( QCloseEvent *event ){

    int width = this->geometry().width();
    int height = this->geometry().height();

    QMessageBox::information(this, "Finish Timing", tr("window width : %1 \nwindow height : %2").arg(width).arg(height));

    QSettings settings("My Company", "My Tool");

    settings.setValue("window/width", width);
    settings.setValue("window/height", height);
}

[mainwindow.h]

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

protected:
    virtual void closeEvent( QCloseEvent *event );

};

#endif // MAINWINDOW_H

実行結果

前回の画面サイズが、起動時に再現することができました。

<アプリケーション終了時>

f:id:nprogram:20170807221432p:plain

<アプリケーション起動時>

f:id:nprogram:20170807221510p:plain