В QML не срабатывает таймер
Добрый день.
Сделал в QML таймер, но он почему то не работает. Кнопки становятся активными сразу же, а не по прошествии таймера.
Скажите пожалуйста, почему так и как исправить?
- import QtQuick 2.4
- import QtQml 2.12
- Page1Form {
- page1Button0.onClicked: //left button
- {
- state = "Page1State2"
- page1Button0.enabled = false
- page1Button1.enabled = false
- Timer
- {
- interval: 150000
- running: true
- repeat: false
- onTriggered:
- {
- page1Button0.enabled = true
- page1Button1.enabled = true
- }
- }
- }
3
99
Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Пожалуйста, авторизуйтесь или зарегистрируйтесь
- Последние комментарии
- AK1 апреля 2025 г. 11:41Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
- VP9 марта 2025 г. 16:14Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
- ИМ22 ноября 2024 г. 21:51Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
- Сейчас обсуждают на форуме
- f15 февраля 2025 г. 13:46Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
- Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
- Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
- Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.
запилить таймер НЕ в onClicked методе, выставить running: false. а уже по нажатию в onClicked сделать start() таймеру
Спасибо. Но почему его нельзя делать в onClicked ?
хороший вопрос)
Добрый день.
К onClicked присваивается функция, и написание кода в декларативном виде, как структура вёрстки в QML внутри функции не работает. Поэтому создать Timer здесь нельзя в таком виде. Внутри функции делается запись только в императивном стиле, как в C++.
Вы можете только запустить или стопнуть Timer в onClicked методе.
Таково поведение языка QML
это понятно.. вопрос глубже, так а почему же нельзя? может кто-то копался в исходниках qml и объяснит в чем сокральный смысл запрета. во что преобразуется Timer и Button.. как они реализованы! знаю что когда включаешь сборку с Qt Quick Compiler QML классы преобразуются в с++ за счет этого ускоряется работа qml кода.. и если все это преобразуется в классы, то кто мешает в методе onClicked сделать new Timer.. хотя если делать так, то при каждом onClicked будет создаваться новый Timer, что тоже не гуд.. поэтому может и сделали так, чтобы он объявлялся в теле Button один раз! в общем-то ничто не мешало позволить его создавать и по клику, но вот управление памятью при этом бы усложнилась, как мне кажется.. поэтому сделали проще и надежнее! ваши мысли?
Timer, Button и т.д. - это всё объекты, которые наследованы от QObject. Все QML типы наследованы от QObject, кроме простейших типов и некоторых контейнеров. И да, получается, что всё в итоге преобразуется в C++ код. По сути можно написать на QML проект, написав очень мало на самом QML, а большую часть логики написав на C++. QML предоставляет более удобный механизм работы с OpenGL для отрисовки объектов, поэтому такой подход жизнеспособен, тем более, что реализовать отрисовку через QML средствами QQuickItem возможно только при наследовании через C++.
Сакрального смысла в запрете нет, и запрета нет. Это просто не работает так, как было написано в самом начале. А суть в том, что QML - это язык с json подобным синтаксисом, в котором структура записи определяет структуру вёрстки. При этом каждый объект должен иметь parent объект. То есть структура организации объектов является древовидной. В случае с методом onClicked таймер не получает parent и QML даже не понимает, куда этот таймер нужно запихнуть и что с ним делать, поэтому вываливает ошибку.
В функции можно создать объект динамически, но тот объект будет создаваться из какого-либо компонента (ваш кастомный QML файл или стандартный тип), а потом ему уже устанавливается parent. Для более подробного описания посмотрите следующую статью . Особенно обратите внимание на функцию createTarget . Это как раз то, о чём вы спрашивали.
То есть я не говорил, что это невозможно сделать. Я говорил, что это не делается таким образом, как это делал топикстартер.