見出し画像

Qt5再入門: 状態の読み込み

前回はQSettingsを用いて状態に関する値を保存してみました。今回は、保存した値を読み込んで、起動時に状態を復元できるようにします。

今回も、MainWindowクラスに、プライベートアクセスで次のようにloadSettingsメソッドを追加します。

// mainwindow.h
class MainWindow : public QMainWindow {
// ...
private:
 void loadSettiings();
// ...
};

// mainwindow.cpp
void MainWindow::loadSettings() {
 QSettings settings;
 bool maximized = settings.value("maximized", false).toBool();
 if (!maximized) {
   QDesktopWidget d;
   constexpr int dw = 800;
   constexpr int dh = 600;
   move(settings.value(
          "geometry/pos",
          QPoint((d.width() - dw) / 2, (d.height() - dh) / 2)
          ).toPoint()
        );
   resize(settings.value(
            "geometry/size",
            QSize(dw, dh)).toSize()
          );
 }
 else {
   showMaximized();
 }
}

loadSettingsでは、まず最初に「最大化をしていたか」を表す 'maximized' の値を取得します。最大化をしていれば、showMaximizedメソッドを呼び出して、ウィンドウを最大化します。
そうでなければ、'geometry/pos' の値を取得して、その位置にウィンドウの左上隅を移動します。もし最初の起動時のように値が存在しない場合、デスクトップ情報 QDesktopWidget を使って画面のサイズを取得し、デフォルトのウィンドウサイズ800x600で中央に配置できる位置に移動します。また、'geomotry/size' の値で幅と高さを変更します。

状態保存のタイミング

一般的に、アプリケーションが扱うデータ(ワープロの文書、表計算のシートデータなど)の保存のように、ユーザーが意図的にファイル名を付けて保存するものとは異なり、アプリケーションの設定や状態に関する情報は、終了時に人知れず保存されることがほとんどです。

Qtアプリケーションの場合、QMainWindowやQDesktopのサブクラスが主体となることが多いので、これらが閉じるタイミング=状態を保存するタイミングとみてもいいでしょう。

私が Notes/Domino APIプログラミング―C++とSTLによる実践的プログラミング の次に読み込んでいるこちらでは、closeEventというプロテクテッド/仮想関数をオーバーライドしているので、これに倣います。

// mainwindow.h
class MainWindow : public QMainWindow {
// ...
protected:
 virtual void closeEvent(QCloseEvent *event) override;
// ...
};

// mainwindow.cpp
void MainWindow::closeEvent(QCloseEvent *event) {
 saveSettings();
 event->accept();
}

ちなみに、closeEventで渡されるQCloseEventで 'accept' メソッドを実行していますが、 'ignore' を実行するとウィンドウのクローズを阻止できます。例えば未保存のデータがある場合に、ユーザに保存を促して終了を中止させる場合などに使えます。

状態読み込みのタイミング

状態を読み込むタイミングは、QMainWindowやQDesktopのサブクラスが主体となる場合、main関数で生成直後にshow()メソッドで表示されるので、生成時(コンストラクタ内)でいいでしょう。

// mainwindow.h
class MainWindow : public QMainWindow {
// ...
public:
 MainWindow(QWidget *parent);
// ...
};

// mainwindow.cpp
MainWindow::MainWindow(QWidget *parent)
 : QMainWindow(parent)
 , ui_(new Ui::MainWindow)
{
 ui_->setupUi(this);
// ...
 loadSettings();
// ...
}

設定の範囲などにもよりますが、loadSettingsを呼び出すのは少なくともウィジェットの生成をほとんど終えた後半が妥当でしょう。

まとめ

これでアプリケーションを終了した時と同じようにウィンドウの大きさと位置を復元できるようになり、保存と復元のタイミングでこれらを呼び出せるようになりました。

次回以降では、MainWindow内にあるブックマークのビジネスロジックや、QStandardItem、QStandardItemModelなどについて書きたいと思います。

この記事が気に入ったらサポートをしてみませんか?