Очень простая работа с обложкой Аврора-приложения на Qt-QML
Изучая документацию на https://developer.auroraos.ru по работе с обложкой приложения, я не смог найти примера, как можно очень легко и быстро из qml поменять значение, например, имя файла на обложке (если это редактор) или значение какого-то счетчика (если это например игра).
Зачастую нужно прям одно-два значения регулярно менять и не нужна никакая сложная логика.
Решение я нашел, и это работа с сигналами и Connections (слотами) в qml.
Задача: редактор, нужно менять имя файла из 4 мест в коде, причем несколько qml-объектов, из которых нужно передавать данные для смены значения на обложке, создаются динамически при помощи Qt.createQmlObject
Как я ее решил:
1. Идем в основной qml-файл приложения, в котором содержится код с ApplicationWindow и проверяем, чтобы для материнского для всего приложения объекта ApplicationWindow было задано id, если оно не задано - задаем (пусть у нас оно будет id: applicationWindow)
2. Задаем сигнал, пусть это будет
signal updateCoverFilename (string newfilename)
3. В обложке (в моем случае в файле DefaultCoverPage.qml) в нужном qml-элементе подписываемся на этот сигнал в Connections ( onUpdateCoverFilename: {...} ) со стороны applicationWindow ( target: applicationWindow ):
newfilename в данном случае - это строка из описания сигнала в пункте 2
4. Теперь из любой точки qml-кода (onClicked: , Component.onCompleted: , onTextChanged: , из функций и т.д.) на любой странице и из любого созданного динамически qml-объекта мы можем эмитировать сигнал applicationWindow.updateCoverFilename(...) и у нас будет меняться имя файла на обложке:
Результат:
P.S. Если нужно обработать несколько разных сигналов от applicationWindow в обложке:
Основной QML-файл приложения:
ApplicationWindow {
id: applicationWindow
........
signal signal1(...)
signal signal2(...)
signal signal3(...)
}
Qml-файл обложки (DefaultCoverPage.qml):
.......
Label {
........
Connections {
target: applicationWindow
onSignal1: {....}
}
Connections {
target: applicationWindow
onSignal2: {....}
}
Connections {
target: applicationWindow
onSignal3: {....}
}
}
.......
Леонид
я через глобальную переменную делал которую объявлял в ApplicationWindow в целом тоже работало
Feb 01 14:13 
1
S.P.
У меня по коду в двух местах сложилась такая ситуация - не захотели меняться property, подписанные на, например, element.x, element.y, этот element создавался динамически (и такой код вполне работал парой сотней строк раньше для других элементов - почему так, разобраться не удалось - вот не работает и всё, в логах пишет, что невозможно получить значения от null). В одном случае выручило введение функции вместо property и ее вызов в обработчике, а в другом случае (там посложнее) - там с сигналами пришлось работать, хотя конечно с property наамного проще конечно же. Хорошо, что в Qt для многих вещей есть разные работающие пути :)
Feb 02 00:20 (changed)