Есть два возможных пути:
Какой подход лучше?
Это зависит от того, как вы будете использовать свой файл настроек. Вы хотите разрешить пользователю вашего приложения динамично изменить настройки в файле (например, файл .ini)? Или настройки должны быть установлены с помощью графического интерфейса?
Если вы используете графический интерфейс для изменения настроек, я советую вам загрузить основные настройки при запуске приложения, например, из статического класса.
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);