QMLBOOK | 4.1.2 QML Скриптинг

⌛ читать всего 2 мин.

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *