На этом шаге рассмотрим сохранение настроек приложения.
В конструкторе 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 может создаваться для запроса или модификации каких-нибудь настроек в любой момент во время выполнения приложения и из любого места программы.
На следующем шаге рассмотрим реализацию экранных заставок.