На этом шаге рассмотрим сохранение настроек приложения.
В конструкторе MainWindow мы уже вызывали функцию readSettings() для загрузки сохраненных приложением настроек. Аналогично в функции closeEvent() мы вызывали writeSettings() для сохранения настроек. Эти функции являются последними функциями-членами MainWindow, которые необходимо реализовать.
void MainWindow::writeSettings()
{
QSettings settings("Software Inc.", "Электронные таблицы");
//Функция writeSettings() сохраняет "геометрию" окна (положение и размер),
settings.setValue("geometry", saveGeometry());
//список последних открывавшихся файлов
settings.setValue("recentFiles", recentFiles);
//и опции Show Grid (показать сетку)
settings.setValue("showGrid", showGridAction->isChecked());
//и Auto-Recalculate (автоматический повтор вычислений)
settings.setValue("autoRecalc", autoRecalcAction->isChecked());
}По умолчанию QSettings сохраняет настройки приложения в месте, которое зависит от используемой платформы. В системе Windows для этого используется системный реестр; в системе Unix данные хранятся в текстовых файлах; в системе Mac OS X для этого используется прикладной интерфейс задания установок Core Foundation Preferences. В аргументах конструктора задаются название организации и имя приложения. Эта информация используется затем (причем по-разному для различных платформ) для определения места расположения настроек.
QSettings хранит настройки в виде пары "ключ-значение". Здесь ключ подобен пути файловой системы. Подключи могут задаваться, используя синтаксис, подобный тому, который применяется при указании пути (например, findDialog/matchCase), или используя beginGroup() и endGroup():
settings.beginGroup("findDialog");
settings.setValue("matchCase", caseCheckBox->isChecked());
settings.setValue("searchBackward", backwardCheckBox->isChecked());
settings.endGroup();Значение value может иметь тип int, bool, double, QString, QStringList или любой другой, поддерживаемый QVariant, включая зарегистрированные пользовательские типы.
Функция readSettings() загружает настройки, которые были сохранены функцией writeSettings().
void MainWindow::readSettings()
{
QSettings settings("Software Inc.", "Электронные таблицы");
/*Поскольку второй аргумент не задан для геометрии или для списка недавно
используемых файлов, окно будет иметь произвольный, но разумный размер и положение,
а список недавно используемых файлов будет пустым при первом запуске приложения*/
restoreGeometry(settings.value("geometry").toByteArray());
recentFiles = settings.value("recentFiles").toStringList();
updateRecentFileActions();
/*Второй аргумент функции value() определяет значение, принимаемое по умолчанию
в случае отсутствия запрашиваемого параметра. Принимаемые по умолчанию значения
будут использованы при первом запуске приложения*/
bool showGrid = settings.value("showGrid", true).toBool();
showGridAction->setChecked(showGrid);
bool autoRecalc = settings.value("autoRecalc", true).toBool();
autoRecalcAction->setChecked(autoRecalc);
}Весь программный код MainWindow, относящийся к объектам QSettings, мы разместили в функциях readSettings() и writeSettings(); такой подход лишь один из возможных. Объект QSettings может создаваться для запроса или модификации каких-нибудь настроек в любой момент во время выполнения приложения и из любого места программы.
На следующем шаге рассмотрим реализацию экранных заставок.