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