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
                            }
                        }
            Я так понимаю что в этом случае биндинг не слетает

              Пікірлер

              Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
              Кіріңіз немесе Тіркеліңіз
              Г

              C++ - Тест 001. Первая программа и типы данных

              • Нәтиже:66ұпай,
              • Бағалау ұпайлары-1
              t

              C++ - Тест 001. Первая программа и типы данных

              • Нәтиже:33ұпай,
              • Бағалау ұпайлары-10
              t

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

              • Нәтиже:52ұпай,
              • Бағалау ұпайлары-4
              Соңғы пікірлер
              G
              GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
              Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
              d
              dblas5Шілде 5, 2024, 11:02 Т.Ж.
              QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
              k
              kmssrАқп. 8, 2024, 6:43 Т.Қ.
              Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
              АК
              Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
              Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
              Енді форумда талқылаңыз
              Evgenii Legotckoi
              Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
              добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
              F
              FynjyШілде 22, 2024, 4:15 Т.Ж.
              при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
              BlinCT
              BlinCTМаусым 25, 2024, 1 Т.Ж.
              Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
              BlinCT
              BlinCTМамыр 5, 2024, 5:46 Т.Ж.
              Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
              Evgenii Legotckoi
              Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
              Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

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