3.6. Сохранение пользовательских настроек приложения.

В конструкторе MainWindow, для загрузки пользовательских настроек, мы вызывали функцию readSettings(). Аналогично, для их сохранения, в обработчике closeEvent(), вызывалась функция writeSettings(). Пришло время рассмотреть реализацию обоих функций, которые являются методами класса MainWindow.

Для своего приложения, в качестве хранилища настроек, мы выбрали класс QSettings. Экземпляр этого класса может быть создан и использован в любой момент, по мере необходимости.

void MainWindow::writeSettings() { QSettings settings; settings.setPath("software-inc.com", "Spreadsheet"); settings.beginGroup("/Spreadsheet"); settings.writeEntry("/geometry/x", x()); settings.writeEntry("/geometry/y", y()); settings.writeEntry("/geometry/width", width()); settings.writeEntry("/geometry/height", height()); settings.writeEntry("/recentFiles", recentFiles); settings.writeEntry("/showGrid", showGridAct->isOn()); settings.writeEntry("/autoRecalc", showGridAct->isOn()); settings.endGroup(); } Функция writeSettings() сохраняет геометрию главного окна (положение на экране и размеры), список недавно использовавшихся файлов и состояние флагов Show Grid и Auto-recalculate.

Место, куда QSettings сохраняет настройки, зависит от используемой платформы. В Windows сохранение производится в системный реестр, в Unix -- в текстовый файл, в Mac OS X используется Carbon API. Методу setPath() передаются названия организации и программного продукта. Эти сведения используются для преобразование в платформо-зависимое представление места сохранения настроек.

Настройки хранятся в виде пары: ключ-значение. Ключ очень похож на строку пути в файловой системе и всегда должен начинаться с названия приложения. Например, /Spreadsheet/geometry/x или /Spreadsheet/showGrid. (Функция beginGroup() "запоминает" префикс ключа - название приложения, которое будет автоматически подставляться в начало ключа, что позволяет нам сэкономить на своих усилиях.) Значение, той или иной настройки, может быть одного из пяти типов: int, bool, double, QString или QStringList.

void MainWindow::readSettings() { QSettings settings; settings.setPath("software-inc.com", "Spreadsheet"); settings.beginGroup("/Spreadsheet"); int x = settings.readNumEntry("/geometry/x", 200); int y = settings.readNumEntry("/geometry/y", 200); int w = settings.readNumEntry("/geometry/width", 400); int h = settings.readNumEntry("/geometry/height", 400); move(x, y); resize(w, h); recentFiles = settings.readListEntry("/recentFiles"); updateRecentFileItems(); showGridAct->setOn( settings.readBoolEntry("/showGrid", true)); autoRecalcAct->setOn( settings.readBoolEntry("/autoRecalc", true)); settings.endGroup(); } Функция readSettings() загружает настройки, предварительно сохраненные вызовом writeSettings(). Второй аргумент в "read"-функциях -- это значение по-умолчанию, возвращаемое в том случае, если запрошенный ключ отсутствует. Значения по-умолчанию используются на самом первом запуске приложения, когда настройки еще не были сохранены.

На этом мы заканчиваем рассмотрение реализации главного окна приложения. В следующих разделах мы покажем, как изменить наше приложение, чтобы оно могло работать одновременно с несколькими документами, и как добавить к приложению показ заставки во время загрузки.