QML И JavaScript (также известный как EcmaScript) являются лучшими друзьями. В главе JavaScript мы рассмотрим более детально этот симбиоз. Сейчас мы просто хотим, что бы вы знали существовании этой связи.
Text {
id: label
x: 24; y: 24
// обычный счётчик нажатия клавиши в нашем случае пробела
property int spacePresses: 0
text: "Space pressed: " + spacePresses + " times"
// (1) обработчик изменения текста
onTextChanged: console.log("text changed to:", text)
// нужен фокус для перехвата события нажатия клавиши
focus: true
// (2) обработчик с некоторым JavaScript
Keys.onSpacePressed: {
increment()
}
// очищаем текст по нажатию Escape
Keys.onEscapePressed: {
label.text = ''
}
// (3) Функция JavaScript
function increment() {
spacePresses = spacePresses + 1
}
}
1) Обработчик onTextChanged выводи текст в консоль, каждый раз когда изменяется текст из-за нажатия пробела.
2) Когда элемент Text получает Keys нажатия пробела, мы вызываем функцию JavaScript increment().
3) Функция JavaScript определяется конструкцией function <наименование>(<параметры>) { ... }. Каждый раз при нажатии пробела увеличивается spacePressed и все связанные с ним свойства обновляются.
Примечание
Разница между : (связывание) в QML и = (присваивания) в JavaScript в том, что связывание это контракт, оно хранит значение на протяжении всего времени связывания, в то время как в JavaScript значение присваивается единожды. (о.а. Это похоже на работу со ссылками. Скорее всего это даже как-то так и реализовано.) Время жизни связывания заканчивается тогда, когда в свойство устанавливается новое связывание или когда присваивается значение при помощи = JavaScript. В нашем примере обработчик события нажатия клавиши Escape устанавливает в свойство текста пустую строку, что прекращает вывод нашего счётчика:
Keys.onEscapePressed: {
label.text=''
}
После нажатия Escape, по нажатию пробела не будет ни чего выводится, поскольку предыдущее связывание свойства text (text: “Space pressed: ” + spacePresses + ” times” ) было уничтожено. Когда у вас существует конфликт стратегий изменения свойств как в нашем примере (обновление текста при изменении свойства при помощи связывания и очистка при помощи присваивания JavaqScript) вы не можете использовать связывание! Вы должны использовать присвоение на обоих путях изменения свойства, а связывание будет уничтожено присваиванием (сломан контракт!).
Оригинал : http://qmlbook.org/ch04/index.html#scripting
Пример: qmlbook4-1-2.qml