alex_lip
alex_lip18 июня 2018 г. 4:03

Qml and JavaScript

Разбираю пример по поводу разницы между qml и javascript

Text {
id: label
x: 24; y: 24
// custom counter property for space presses
property int spacePresses: 0
text: "Space pressed: " + spacePresses + " times"
// (1) handler for text changes
onTextChanged: console.log("text changed to:", text)
// need focus to receive key events
focus: true
// (2) handler with some JS
Keys.onSpacePressed: {
increment()
}
// clear the text on escape
Keys.onEscapePressed: {
label.text = ''
}
// (3) a JS function
function increment() {
spacePresses = spacePresses + 1
}
}


The difference between the QML : (binding) and the JavaScript = (assignment) is, that the binding is a
contract and keeps true over the lifetime of the binding, whereas the JavaScript assignment (=) is a one time value
assignment. The lifetime of a binding ends, when a new binding is set to the property or even when a JavaScript
value is assigned is to the property. For example a key handler setting the text property to an empty string would
destroy our increment display:

Keys.onEscapePressed: {
label.text = ''
}
В принципе понятно, что командой
label.text = ''
мы уничтожили биндинг для label. Но когда я немного подправил

Keys.onEscapePressed: {
label.text = "Space pressed: " + spacePresses + " times"
}
- то есть по сути по ESC я присваиваю полю label - то же самое что и было в text. Однако я не получил того же самого результата. У меня на экране инкремент отображается только по нажатию ESC. То есть биндинг повесился на метод, а не на объект.  Можете пояснить почему?



Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

6
alex_lip
  • 18 июня 2018 г. 4:06

и как мне тогда через JS переинициализировать объект в том же виде?

    Александр Панюшкин
    • 18 июня 2018 г. 4:30
    • Ответ был помечен как решение.

    Можно через states сделать.


        Text {
            id: label
            x: 24; y: 24
            // custom counter property for space presses
            property int spacePresses: 0
            text: "Space pressed: " + spacePresses + " times"
            // (1) handler for text changes
            onTextChanged: console.log("text changed to:", text)
            // need focus to receive key events
            focus: true
            // (2) handler with some JS
            Keys.onSpacePressed: {
            increment()
            }
    
            states: [
                State {
                    name: "onEsc"
                    PropertyChanges {
                        target: label
                        text: ""
                    }
                },
                State {
                    name: "onReleased"
                    PropertyChanges {
                        target: label
                        text: "Space pressed: " + spacePresses + " times"
                    }
                }
            ]
    
            // clear the text on escape
            Keys.onEscapePressed: {
                state = "onEsc"
            }
    
            Keys.onReleased: {
                state = "onReleased"
            }
    
            // (3) a JS function
            function increment() {
            spacePresses = spacePresses + 1
            }
        }
      Александр Панюшкин
      • 18 июня 2018 г. 4:31

      По идее, я так думаю, в раздел State{} можно прописать when, к которому привязать кнопки, но я не нашёл, как это правильно сделать.

        alex_lip
        • 18 июня 2018 г. 4:55

        Да тут главное принцип понятен. Спасибо. Я теперь понял почему во всех примерах применяют именно state - PropertyChanges .

          Александр Панюшкин
          • 18 июня 2018 г. 4:59

          Опять же, ни кто не мешает всё это проделывать непосредственно в JS в Keys.onReleased и Keys.onEscapePressed, но, на сколько я понимаю, чем меньше JS в QML коде, тем лучше. Меньше проблем при отладке большого кол-ва кода возникает. Да и Qt Creator легче ошибки отлавливает.

            alex_lip
            • 18 июня 2018 г. 6:51
            В том то и дело что просто в JS так нельзя

            Если использовать state -

            onReleased - не нужен

            вот так все работает


               Text {
                            id: label
                            x: 24; y: 24
                            // custom counter property for space presses
                            property int spacePresses: 0
                            text: "Space pressed: " + spacePresses + " times"
                            // (1) handler for text changes
                            onTextChanged: console.log("text changed to:", text)
                            // need focus to receive key events
                            focus: true
                            // (2) handler with some JS
                            Keys.onSpacePressed: {
                            increment()
                            }
            
                            states: [
                                State {
                                    name: "onEsc"
                                    PropertyChanges {
                                        target: label
                                        text: "Space pressed: " + spacePresses + " times"
                                    }
                                }
                            ]
            
                            // clear the text on escape
                            Keys.onEscapePressed: {
                                state = "onEsc"
                            }
            
                            // (3) a JS function
                            function increment() {
                            spacePresses = spacePresses + 1
                            }
                        }
            Я так понимаю что в этом случае биндинг не слетает

              Комментарии

              Только авторизованные пользователи могут публиковать комментарии.
              Пожалуйста, авторизуйтесь или зарегистрируйтесь
              AD

              C++ - Тест 004. Указатели, Массивы и Циклы

              • Результат:50баллов,
              • Очки рейтинга-4
              m
              • molni99
              • 26 октября 2024 г. 1:37

              C++ - Тест 004. Указатели, Массивы и Циклы

              • Результат:80баллов,
              • Очки рейтинга4
              m
              • molni99
              • 26 октября 2024 г. 1:29

              C++ - Тест 004. Указатели, Массивы и Циклы

              • Результат:20баллов,
              • Очки рейтинга-10
              Последние комментарии
              i
              innorwall14 ноября 2024 г. 19:03
              Qt/C++ - Урок 060. Настройка внешнего вида приложения в рантайме I didnt have an issue work colors priligy dapoxetine 60mg revia cost uk August 3, 2022 Reply
              i
              innorwall14 ноября 2024 г. 11:42
              Как Копировать Файлы в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
              i
              innorwall14 ноября 2024 г. 9:09
              Qt/C++ - Урок 068. Hello World с использованием системы сборки CMAKE в CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
              i
              innorwall14 ноября 2024 г. 4:05
              EVILEG-CORE. Использование Google reCAPTCHA 2001; 98 29 34 priligy buy
              Сейчас обсуждают на форуме
              i
              innorwall14 ноября 2024 г. 3:39
              добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
              i
              innorwall11 ноября 2024 г. 10:55
              Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
              9
              9Anonim25 октября 2024 г. 9:10
              Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
              ИМ
              Игорь Максимов3 октября 2024 г. 4:05
              Реализация навигации по разделам Спасибо Евгений!

              Следите за нами в социальных сетях