Михаиллл
3 апреля 2019 г. 13:25

В QML не срабатывает таймер

QML, timer, таймер

Добрый день.
Сделал в QML таймер, но он почему то не работает. Кнопки становятся активными сразу же, а не по прошествии таймера.
Скажите пожалуйста, почему так и как исправить?

  1. import QtQuick 2.4
  2. import QtQml 2.12
  3.  
  4. Page1Form {
  5.  
  6. page1Button0.onClicked: //left button
  7. {
  8. state = "Page1State2"
  9. page1Button0.enabled = false
  10. page1Button1.enabled = false
  11. Timer
  12. {
  13. interval: 150000
  14. running: true
  15. repeat: false
  16. onTriggered:
  17. {
  18. page1Button0.enabled = true
  19. page1Button1.enabled = true
  20. }
  21. }
  22. }
3

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

6
ВЖ
  • 3 апреля 2019 г. 14:56
  • Ответ был помечен как решение.

запилить таймер НЕ в onClicked методе, выставить running: false. а уже по нажатию в onClicked сделать start() таймеру

    Михаиллл
    • 3 апреля 2019 г. 15:51

    Спасибо. Но почему его нельзя делать в onClicked ?

      ВЖ
      • 3 апреля 2019 г. 20:13

      хороший вопрос)

        Evgenii Legotckoi
        • 5 апреля 2019 г. 1:56

        Добрый день.

        К onClicked присваивается функция, и написание кода в декларативном виде, как структура вёрстки в QML внутри функции не работает. Поэтому создать Timer здесь нельзя в таком виде. Внутри функции делается запись только в императивном стиле, как в C++.

        Вы можете только запустить или стопнуть Timer в onClicked методе.

        Таково поведение языка QML

          ВЖ
          • 5 апреля 2019 г. 13:00

          это понятно.. вопрос глубже, так а почему же нельзя? может кто-то копался в исходниках qml и объяснит в чем сокральный смысл запрета. во что преобразуется Timer и Button.. как они реализованы! знаю что когда включаешь сборку с Qt Quick Compiler QML классы преобразуются в с++ за счет этого ускоряется работа qml кода.. и если все это преобразуется в классы, то кто мешает в методе onClicked сделать new Timer.. хотя если делать так, то при каждом onClicked будет создаваться новый Timer, что тоже не гуд.. поэтому может и сделали так, чтобы он объявлялся в теле Button один раз! в общем-то ничто не мешало позволить его создавать и по клику, но вот управление памятью при этом бы усложнилась, как мне кажется.. поэтому сделали проще и надежнее! ваши мысли?

            Evgenii Legotckoi
            • 5 апреля 2019 г. 13:41
            • (ред.)

            Timer, Button и т.д. - это всё объекты, которые наследованы от QObject. Все QML типы наследованы от QObject, кроме простейших типов и некоторых контейнеров. И да, получается, что всё в итоге преобразуется в C++ код. По сути можно написать на QML проект, написав очень мало на самом QML, а большую часть логики написав на C++. QML предоставляет более удобный механизм работы с OpenGL для отрисовки объектов, поэтому такой подход жизнеспособен, тем более, что реализовать отрисовку через QML средствами QQuickItem возможно только при наследовании через C++.

            Сакрального смысла в запрете нет, и запрета нет. Это просто не работает так, как было написано в самом начале. А суть в том, что QML - это язык с json подобным синтаксисом, в котором структура записи определяет структуру вёрстки. При этом каждый объект должен иметь parent объект. То есть структура организации объектов является древовидной. В случае с методом onClicked таймер не получает parent и QML даже не понимает, куда этот таймер нужно запихнуть и что с ним делать, поэтому вываливает ошибку.

            В функции можно создать объект динамически, но тот объект будет создаваться из какого-либо компонента (ваш кастомный QML файл или стандартный тип), а потом ему уже устанавливается parent. Для более подробного описания посмотрите следующую статью . Особенно обратите внимание на функцию createTarget . Это как раз то, о чём вы спрашивали.

            То есть я не говорил, что это невозможно сделать. Я говорил, что это не делается таким образом, как это делал топикстартер.

              Комментарии

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