次の 2 つの方法があります。
- すべての設定をいくつかの構造体にロードします
- オンデマンドで値を読み込む
どちらのアプローチが優れていますか?
設定ファイルの使用方法によって異なります。アプリケーションのユーザーがファイル (.ini ファイルなど) の設定を動的に変更できるようにしますか? または、設定は GUI で設定する必要がありますか?
GUI を使用して設定を変更している場合は、アプリケーションの開始時に主な設定を静的クラスなどからロードすることをお勧めします。
void SettingsManager::loadSettings()
{
// .ini format example
QSettings settings(FileName, QSettings::IniFormat);
IntegerSetting = settings.value("SettingName", default).toInt();
BooleanSetting = settings.value("SettingName", default).toBool();
// ...
}
その後、 QSettingsの最適化により、変更した値をオンデマンドで保存しても問題ありません。
/**
* key is your setting name
* variant is your value (could be string, integer, boolean, etc.)
*/
void SettingsManager::writeSetting(const QString &key, const QVariant &variant)
{
QSettings settings(FileName, QSettings::IniFormat);
settings.setValue(key, variant);
}
懸念がある場合は、設定の各論理グループをインターフェイスの背後に置くことができます。次に、QSettings を使用してオンデマンドで設定を取得する具象クラスを作成します。
それがパフォーマンスのボトルネックであることがわかった場合は、設定をキャッシュする具象クラスを構築します。(そうする必要はありませんでした。QSettings は常に十分に高速です。)
のドキュメントではQSettings
、非常によく最適化されていると書かれています。
内部的には、QStrings から QVariants へのマップを保持します。すべてのアクセサ メソッドは非常に便利で使いやすいです。
を使用したときは、と関数を使用QSettings
した例と同様に設定しました。ページの半分ほど下にあるこの例を参照してください。readSettings()
writeSettings()
readSettings()
QSettings オブジェクトを呼び出すとすぐに作成され、オンデマンドで値が読み込まれ、すべての設定が構造体に保持されます。
そのため、私のメイン関数では、アプリケーション名と組織名を必ず設定し、 も使用しますQSettings::setFormat
。その後、QSettings にアクセスしたいときはいつでも、デフォルトのパラメーターを使用して QSettings のインスタンスを作成し、設定にアクセスします。
QSettings s;
int val = s.value("Some_Group/some_setting", default_value).toInt();
// ...
s.setValue("Some_Group/some_setting", val);