Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
3 апреля 2019 г. 7:25

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

QML, timer, таймер

Добрый день. Сделал в 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
            }
        }
    }
Виртуальный хостинг со скидкой 10 процентов
Виртуальный хостинг со скидкой 10 процентов
EVILEG предлагает надёжный хостинг со скидкой 10% на виртуальный хостинг и 5% на VPS
6
VZ
  • 3 апреля 2019 г. 8:56
  • Ответ был помечен как решение.

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

0

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

0
VZ

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

0

Добрый день.

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

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

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

0
VZ

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

0

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

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

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

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

1

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
AA
17 апреля 2019 г. 19:40
Anton Ablin

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

  • Результат:73баллов,
  • Очки рейтинга1
E
17 апреля 2019 г. 18:16
Evgeny

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

  • Результат:100баллов,
  • Очки рейтинга10
E
17 апреля 2019 г. 18:14
Evgeny

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

  • Результат:78баллов,
  • Очки рейтинга2
Последние комментарии
U
18 апреля 2019 г. 15:37
Unreal_man

А как иконку в хедер задать?
u
18 апреля 2019 г. 2:15
uaa

доброго времени,большое спасибо за пример для начинающего)при адаптации к своему проекту столкнулся с таким ньансом:в vepolyline.h в 47 строке нужна инициализация по умолчанию: int m_pointF...
E
11 апреля 2019 г. 12:49
Evgeny

Спасибо за ответ) У меня компоновщик на нее ругался просто. Оказалось, просто забыл Q_OBJECT в начале класса указать.
11 апреля 2019 г. 12:29
Евгений Легоцкой

Добрый день. Вы имели ввиду реализацию? Для сигналов в Qt реализация не пишется, это всё генерируется в moc файлах под капотом Qt.
E
11 апреля 2019 г. 12:15
Evgeny

Здравствуйте. А где описание функции signal1()?
Сейчас обсуждают на форуме
R
19 апреля 2019 г. 9:55
RED_Spider

мені важко це зараз навіть перевірити, тому що знайшов коміт, це ще було в 2016 році, і цей код не буде працювати коректно зараз, єдине скажу що це були QThread
i
17 апреля 2019 г. 15:03
ilya.guzikov

BlinCT, на стороне ++ это делать необходимо так как в qml при использовании функции append происходит перерисовка всех точек лини(как я понимаю) и из-за этого при использовании больших массиво...
10 апреля 2019 г. 11:20
Алексей Внуков

может тоже кому надо будет - QML не принимает QVector<QVector<int>> , при попытке вывести полученый вектор QML показывает что это QVariant(QVector<QVector<int> ...
SN
10 апреля 2019 г. 9:36
Stanislav Nykytiuk

Как реализовать такое меню, что бы нажмаешь меню подменю и выбор позиции? Данные меню и подменю в базе SQL.
Присоединяйтесь к нам в социальных сетях

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы