Лабораторная работа № 7. Интеграция C++ и QML: настройки приложения

Студент: Кривошеин Максим Константинович, группа ИС-2301
Дисциплина: Разработка мобильных приложений, СПбГЭУ
Платформа: ОС Аврора 5.2 (Aurora SDK 5.2.0.180), Qt 5.6, C++ / QML (Sailfish Silica)

Задание

Разработать приложение для интеграции C++ с QML.

  • Разработать C++-синглтон, хранящий настройки приложения в файле на диске в виде текстового файла. Настройки должны сохраняться при перезапуске приложения.
  • В QML-части должны быть методы getAppSettingValue("key") и setAppSettingValue("key", setting_value).
  • Подключить синглтон как property в rootContext и использовать его по всему приложению.
  • Первый экран — список сохранённых настроек.
  • Второй экран — добавление новой произвольной настройки: ввод имени и значения.
  • Третий экран — изменение имеющейся настройки: имя автоматически проставляется из списка, можно поменять значение.
  • В настройках должна быть настройка отступов ListView от краёв экрана с возможностью изменения и сохранения в общий список.

Реализация

C++-синглтон — src/appsettings.{h,cpp}, класс AppSettings:

  • единственный экземпляр создаётся при первом вызове AppSettings::instance(), конструктор закрыт, копирование запрещено (Q_DISABLE_COPY);
  • настройки хранятся в текстовом файле ~/.local/share/ru.krivoshein/SettingsDemo/settings.txt, по строке ключ=значение на настройку; файл перезаписывается безопасно через QSaveFile;
  • методы для QML (Q_INVOKABLE): getAppSettingValue(key, defaultValue), setAppSettingValue(key, value), contains(key), removeAppSetting(key), isValidKey(key);
  • свойства: keys (список имён для ListView), revision (номер изменения, на него подписываются привязки QML), filePath;
  • при первом запуске создаются настройки по умолчанию: listview_margin=24, app_title=Мои настройки, cover_text=Настройки из файла.

Подключение к QML — src/main.cpp:

view->rootContext()->setContextProperty(QStringLiteral("appSettings"), AppSettings::instance());

Объект appSettings используется во всех частях приложения: заголовок главного экрана берётся из app_title, отступы списка — из listview_margin, обложка — из cover_text.

Экраны:

№ Файл Назначение
1 qml/pages/MainPage.qml список всех настроек «имя — значение»; отступ списка от краёв экрана равен listview_margin; по нажатию открывается экран изменения, в контекстном меню — «Изменить» и «Удалить»
2 qml/pages/AddSettingDialog.qml добавление новой настройки: имя (латиница, цифры, _ . -) и значение; если такое имя уже есть, выводится предупреждение
3 qml/pages/EditSettingDialog.qml изменение значения; имя приходит из списка и не редактируется. Для listview_margin значение проверяется (целое 0–200), есть ползунок и предпросмотр отступа

После сохранения listview_margin список на первом экране сразу перестраивается с новыми отступами, а значение записывается в файл вместе с остальными настройками.

Пример файла после работы с приложением:

# Settings of ru.krivoshein.SettingsDemo, one key=value per line
app_title=Мои настройки
cover_text=Настройки из файла
greeting=Привет из файла настроек
listview_margin=75

Структура проекта

ru.krivoshein.SettingsDemo.pro      проект qmake
src/main.cpp                        создание окна и подключение синглтона в rootContext
src/appsettings.h, appsettings.cpp  C++-синглтон настроек
qml/SettingsDemo.qml                ApplicationWindow
qml/pages/MainPage.qml              экран 1 — список настроек
qml/pages/AddSettingDialog.qml      экран 2 — новая настройка
qml/pages/EditSettingDialog.qml     экран 3 — изменение настройки
qml/pages/AboutPage.qml             «О приложении»
qml/cover/DefaultCoverPage.qml      обложка с текстом из настроек
rpm/ru.krivoshein.SettingsDemo.spec описание RPM-пакета

Скриншоты

Настройки по умолчанию Новая настройка Изменение отступа После изменений
Список Добавление Изменение После

Лицензия

MIT, см. LICENSE.