S.P.

S.P. 

Разработка прикладного ПО для российской ОС Аврора

8subscribers

116posts

goals1
$33.69 of $135 raised
Свободное ПО денег не приносит, но приносит пользу как минимум разработчику. В РФ донаты непопулярны пока, но думаю ситуация может измениться. Гранты)

Очень простая работа с обложкой Аврора-приложения на 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 в целом тоже работало 
У меня по коду в двух местах сложилась такая ситуация - не захотели меняться property, подписанные на, например, element.x, element.y, этот element создавался динамически (и такой код вполне работал парой сотней строк раньше для других элементов - почему так, разобраться не удалось - вот не работает и всё, в логах пишет, что невозможно получить значения от null). В одном случае выручило введение функции вместо property и ее вызов в обработчике, а в другом случае (там посложнее) - там с сигналами пришлось работать, хотя конечно с property наамного проще конечно же. Хорошо, что в Qt для многих вещей есть разные работающие пути :)
Go up