Лабораторная работа № 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.



