alex_lip
alex_lipМаусым 18, 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
              Соңғы пікірлер
              ИМ
              Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
              Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
              Evgenii Legotckoi
              Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
              Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
              A
              ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
              Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
              ИМ
              Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
              Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
              d
              dblas5Шілде 5, 2024, 11:02 Т.Ж.
              QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
              Енді форумда талқылаңыз
              m
              moogoҚар. 22, 2024, 7:17 Т.Ж.
              Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
              Evgenii Legotckoi
              Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
              добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
              t
              tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
              google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
              NSProject
              NSProjectМаусым 4, 2022, 3:49 Т.Ж.
              Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

              Бізді әлеуметтік желілерде бақылаңыз