見出し画像

Qt5再入門: 状態の保存

Qtには、QSettingsというアプリケーションのオプションや設定を保存したり読み出したりする機能が提供されています。QSettingsは抽象化されていて、プラットフォームに合わせた保存先が用意されています。Windowsならレジストリ、MacOSならplistファイル、OSとして標準を持たないLinuxはINIテキストファイルなどです。

今回は、QSettingsを使って、メインウィンドウの状態を保存してみます。

まず、前回用意したMainWindowクラスに、プライベートアクセスで次のようにsaveSettingsメソッドを追加します。

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

// mainwindow.cpp
void MainWindow::saveSettings() const {
  QSettings settings;
  settings.setValue("maximized", isMaximized());
  if (!isMaximized()) {
    settings.setValue("geometry/pos", frameGeometry().topLeft());
    settings.setValue("geometry/size", geometry().size());
  }
}

saveSettiingsでは最初に、QSettingsのオブジェクトを生成します。これは、引数にアプリケーション名や会社名などを使って生成しますが、何も指定せずに初期化すると、QApplication(QCoreApplication)が持っているアプリ情報や開発元情報などを自動で取得して、例えばWindowsならばレジストリのキーに割り当てます。このアプリを製造元Chiburu Systems、製品名Notes Explorer 2と設定していたなら、次のようなレジストリになります。

スクリーンショット 2021-08-23 20.33.21

次にウィンドウが最大化しているかどうか、MainWindow::isMaximized()の値を'maximized'として保存します。
さらに最大化されていない時は、ウィンドウの左上の位置(QPoint型)と、ウィンドウのサイズ(QSize)を'geometry/pos'、'geometry/size'として保存します。なお、QSettingsで保存が可能な値はQVariant型になります。

QVariant

Qtには、Variantやanyなどで表現される、いわゆる「バリアント」として、QVariantクラスがあります。intやdoubleなどのプリミティブ値はもちろん、文字列、日時、位置、サイズ、MapやListのようなコンテナ、JSON型なども取り込めます。QObjectとそのサブクラスのような、コピーや代入が許可されていないクラスでも、ポインタにして格納できます。また、Qtパッケージに含まれないものでも、テンプレートやユーザー定義などの仕組みが用意されているので、それらの規定に則れば、QVariantに取り込むことが可能です。
そういったことが面倒なら、コンテナ型、JSON型などを活用して変換過程をかませれば、効率などの犠牲は払いますが、難なくできるはずです。

まとめ

Windowsでの環境設定、オプション設定、MacOSでの設定にあたるような機能を提供するQSettingsの、保存の側面をインプリメントしてみました。次回は保存した設定を読み込む機能をインプリメントしてみます。

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