Сохранение настроек QSettings

Автор: | 31 июля, 2019

Данный класс создан для упрощения сохранения настроек по средствам ini или conf файлов и системном реестре Windows

Он представляет платформа независимые настройки приложения и основан на QVariant который позволяет сохранять большинство типов

Для определения формата сохранения его необходимо объявить.  Для более поздних версий используется следующие форматы:

NativeFormat

Использует наиболее подходящий вариант сохранения настроек

В Windows это системный реестр, Mac OS X API CFPreferences, в Unix текстовые конфигурационные файлы в формате INI.

Для сохранения настроек в INI файле:

IniFormat  

Для пользовательского значения, возвращаемое registerFormat():

UserScope

В более новых версиях добавили несколько новых форматов:

Registry32Format и Registry64Format

Доступ к 32-битному и 64-битному системному реестру.  Это значение перечисления было добавлено в Qt 5.7.

Рассмотрим несколько пример реализации данного класса.

Запись настроек в файл таких параметров как QString, int, double, unsigned int, QByteArray, QTime, QDateTime.

Пример записи файла методом QSettings

  //Запись в файл настроек
  QSettings settings("settings.ini",QSettings::IniFormat);
  QString ip = "127.0.0.1";
  int a = 10;
  double b = 11.2;
  unsigned int c = 12;
  QByteArray d = "abc";
  QTime e = QTime::currentTime();
  QDateTime f = QDateTime::currentDateTime();
  settings.beginGroup("Settings");
  settings.setValue( "ip", ip);
  settings.setValue("a",a);
  settings.setValue("b",b);
  settings.setValue("c",c);
  settings.setValue("d",d);
  settings.setValue("e",e);
  settings.setValue("f",f);
  settings.endGroup();

В результате будет создан файл settings.ini в котором будет записано следующее:

[Settings]
ip=127.0.0.1
a=10
b=11.2
c=12
d=@ByteArray(abc)
e=@Variant(\0\0\0\xf\x2\x95\xaat)
f=@DateTime(\0\0\0\x10\0\0\0\0\0\0%\x84:\x2\x95\xaat\0)

[Settings]  — Название группу, далее следуют параметры. Группы используется для логического объединения информации.

Пример чтения файла методом QSettings

Пример чтение из ранее созданного файла settings.ini.

  //Чтение данный из файла
  QSettings settings ("settings.ini",QSettings::IniFormat);
  settings.beginGroup("Settings");
  QString ip = settings.value("ip").toString();
  int a = settings.value("a").toInt();
  double b = settings.value("b").toDouble();
  unsigned int c = settings.value("c").toUInt();
  QByteArray d = settings.value("d").toByteArray();
  QTime e = settings.value("e",e).toTime();
  QDateTime f = settings.value("f",f).toDateTime();
  settings.endGroup();

При чтении параметров можно задать параметр по умолчанию, который будет установлено в случаи если данный параметр не удалось прочитать из заданного файла.

 Пример реализации установки параметра по умолчанию:

QString ip = settings.value("ip",QString("127.0.0.1")).toString();

Рассмотрим поподробней registerFormat для QSettings, данный метод регистрирует пользовательский формат хранения. В случае успеха возвращает специальное значение Format, которое затем может быть передано в конструктор QSettings. При неудаче вернет InvalidFormat.

Пример реализации:

bool readXml(QIODevice &device, QSettings::SettingsMap &map);

bool writeXml(QIODevice &device, const QSettings::SettingsMap &map);

QSettings::Format XmlFormat =  QSettings::registerFormat("xml", readXml, writeXml);

QSettings settings(XmlFormat, QSettings::UserScope, "Settings", "Settings2");

Параметры readXml и writeXml являются указателями на функции, которые читают и записывают набор пар ключ / значение. Параметр QIODevice для функций чтения и записи всегда открывается в двоичном режиме.