alex_lip
alex_lip18 июня 2018 г. 14: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 г. 14:06

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

    Александр Панюшкин
    • 18 июня 2018 г. 14: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 г. 14:31

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

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

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

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

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

            alex_lip
            • 18 июня 2018 г. 16: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
                            }
                        }
            Я так понимаю что в этом случае биндинг не слетает

              Комментарии

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

              Qt - Тест 001. Сигналы и слоты

              • Результат:84баллов,
              • Очки рейтинга4
              Ua

              Qt - Тест 001. Сигналы и слоты

              • Результат:42баллов,
              • Очки рейтинга-8
              ОК

              Qt - Тест 001. Сигналы и слоты

              • Результат:47баллов,
              • Очки рейтинга-6
              Последние комментарии
              ИМ
              Игорь Максимов22 ноября 2024 г. 21:51
              Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
              Evgenii Legotckoi
              Evgenii Legotckoi31 октября 2024 г. 23:37
              Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
              A
              ALO1ZE19 октября 2024 г. 17:19
              Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
              ИМ
              Игорь Максимов5 октября 2024 г. 16:51
              Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
              d
              dblas55 июля 2024 г. 20:02
              QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
              Сейчас обсуждают на форуме
              f
              firstlunoxod15 февраля 2025 г. 13:46
              Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
              Дмитрий
              Дмитрий3 февраля 2025 г. 16:24
              Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
              NW
              Nayo Wai30 января 2025 г. 19:22
              не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
              n
              nkly3 января 2025 г. 12:52
              Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
              M
              Marsel17 августа 2023 г. 0:26
              OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

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