Класс QTimer
Класс QTimer предоставляет таймеры с повторением и однократным срабатыванием. Подробнее...
| Заголовок: | #include <QTimer> |
| CMake: | find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| Наследует: | QObject |
Свойства
|
|
Публичные функции
| QTimer(QObject *parent = nullptr) | |
| virtual | ~QTimer() |
| QMetaObject::Connection | callOnTimeout(Functor slot, Qt::ConnectionType connectionType = Qt::AutoConnection) |
| QMetaObject::Connection | callOnTimeout(const QObject *context, Functor slot, Qt::ConnectionType connectionType = Qt::AutoConnection) |
| QMetaObject::Connection | callOnTimeout(const QObject *receiver, MemberFunction *slot, Qt::ConnectionType connectionType = Qt::AutoConnection) |
| int | interval() const |
| std::chrono::milliseconds | intervalAsDuration() const |
| bool | isActive() const |
| bool | isSingleShot() const |
| int | remainingTime() const |
| std::chrono::milliseconds | remainingTimeAsDuration() const |
| void | setInterval(int msec) |
| void | setInterval(std::chrono::milliseconds value) |
| void | setSingleShot(bool singleShot) |
| void | setTimerType(Qt::TimerType atype) |
| void | start(std::chrono::milliseconds msec) |
| int | timerId() const |
| Qt::TimerType | timerType() const |
Публичные слоты
| void | start() |
| void | start(int msec) |
| void | stop() |
Сигналы
| void | timeout() |
Статические публичные члены
| void | singleShot(int msec, const QObject *receiver, const char *member) |
| void | singleShot(int msec, Qt::TimerType timerType, const QObject *receiver, const char *member) |
| void | singleShot(int msec, const QObject *receiver, PointerToMemberFunction method) |
| void | singleShot(int msec, Qt::TimerType timerType, const QObject *receiver, PointerToMemberFunction method) |
| void | singleShot(int msec, Functor functor) |
| void | singleShot(int msec, Qt::TimerType timerType, Functor functor) |
| void | singleShot(int msec, const QObject *context, Functor functor) |
| void | singleShot(int msec, Qt::TimerType timerType, const QObject *context, Functor functor) |
| void | singleShot(std::chrono::milliseconds msec, const QObject *receiver, const char *member) |
| void | singleShot(std::chrono::milliseconds msec, Qt::TimerType timerType, const QObject *receiver, const char *member) |
Переопределённые защищённые функции
| virtual void | timerEvent(QTimerEvent *e) override |
Подробное описание
Класс QTimer предоставляет высокоуровневый интерфейс программирования для таймеров. Для его использования создайте QTimer, подключите его сигнал timeout() к соответствующим слотам и вызовите start(). После этого он будет генерировать сигнал timeout() с постоянными интервалами.
Пример таймера на одну секунду (1000 миллисекунд) (из примера Аналоговых часов):
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, QOverload<>::of(&AnalogClock::update));
timer->start(1000); После этого вызывается слот update() каждые секунду.
Вы можете задать таймер, который сработает только один раз, вызвав setSingleShot(true). Также можно использовать статическую функцию QTimer::singleShot() для вызова слота после заданного интервала:
QTimer::singleShot(200, this, &Foo::updateCaption);
В многопоточных приложениях QTimer можно использовать в любом потоке, имеющем цикл обработки событий. Чтобы запустить цикл обработки событий из потока, не являющегося графическим, используйте QThread::exec(). Qt использует аффинность потока таймера для определения потока, который сгенерирует сигнал timeout(). Поэтому таймер нужно запускать и останавливать в его потоке; запуск таймера из другого потока невозможен.
В качестве специального случая, QTimer с интервалом таймаута 0 сработает как можно скорее, хотя порядок между нулевыми таймерами и другими источниками событий не определён. Нулевые таймеры могут использоваться для выполнения некоторой работы, сохраняя при этом отзывчивость пользовательского интерфейса:
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &Foo::processOneThing);
timer->start(); После этого processOneThing() будет вызываться повторно. Он должен быть написан так, чтобы всегда возвращаться быстро (обычно после обработки одного элемента данных), чтобы Qt мог доставлять события в пользовательский интерфейс и останавливать таймер, как только он завершит всю свою работу. Это традиционный способ реализации сложных задач в приложениях с GUI, но, поскольку многопоточность сегодня становится доступной на всё большем количестве платформ, ожидается, что объекты QTimer с нулевыми миллисекундами постепенно будут заменяться объектами QThread.
Точность и разрешение таймера
Точность таймеров зависит от базовой операционной системы и аппаратного обеспечения. Большинство платформ поддерживает разрешение в 1 миллисекунду, хотя точность таймера во многих реальных ситуациях не будет равна этому разрешению.
Точность также зависит от типа таймера. Для Qt::PreciseTimer, QTimer будет пытаться поддерживать точность в 1 миллисекунду. Точные таймеры также никогда не сработают раньше, чем ожидалось.
Для типов Qt::CoarseTimer и Qt::VeryCoarseTimer, QTimer может проснуться раньше ожидаемого, в пределах допусков для этих типов: 5% от интервала для Qt::CoarseTimer и 500 мс для Qt::VeryCoarseTimer.
Все типы таймеров могут завершиться позже ожидаемого, если система загружена или не может обеспечить необходимую точность. В таком случае переполнения таймаута Qt будет излучать timeout() только один раз, даже если истекло несколько таймаутов, а затем возобновит исходный интервал.
Альтернативы QTimer
Альтернативой использованию QTimer является вызов QObject::startTimer() для вашего объекта и переопределение обработчика события QObject::timerEvent() в вашем классе (который должен унаследовать от QObject). Недостатком является то, что timerEvent() не поддерживает такие продвинутые функции, как таймеры с одним выстрелом или сигналы.
Другой альтернативой является QBasicTimer. Он обычно менее сложен, чем использование QObject::startTimer() напрямую. См. Таймеры для обзора всех трёх подходов.
Некоторые операционные системы ограничивают количество используемых таймеров; Qt пытается обойти эти ограничения.
См. также QBasicTimer, QTimerEvent, QObject::timerEvent(), Таймеры, Пример аналоговых часов и Пример Wiggly.
Документация свойств
[read-only] active : const bool
Это булево свойство true если таймер работает; иначе false.
Функции доступа:
| bool | isActive() const |
interval : int
Это свойство содержит интервал таймаута в миллисекундах
Значение по умолчанию для этого свойства равно 0. QTimer с интервалом таймаута 0 сработает как только все события в очереди событий системы окон будут обработаны.
Установка интервала активного таймера изменяет его timerId().
Функции доступа:
| int | interval() const |
| void | setInterval(int msec) |
| void | setInterval(std::chrono::milliseconds value) |
См. также singleShot.
[read-only, since 5.0] remainingTime : const int
Это свойство содержит оставшееся время в миллисекундах
Возвращает оставшееся время таймера в миллисекундах до истечения таймаута. Если таймер неактивен, возвращаемое значение будет -1. Если таймер просрочен, возвращаемое значение будет 0.
Это свойство было введено в Qt 5.0.
Функции доступа:
| int | remainingTime() const |
См. также interval.
singleShot : bool
Это свойство показывает, является ли таймер таймером с одним выстрелом
Таймер с одним выстрелом срабатывает только один раз, таймеры без одного выстрела срабатывают каждые interval миллисекунд.
Значение по умолчанию для этого свойства false.
Функции доступа:
| bool | isSingleShot() const |
| void | setSingleShot(bool singleShot) |
См. также interval и singleShot().
timerType : Qt::TimerType
управляет точностью таймера
Значение по умолчанию для этого свойства Qt::CoarseTimer.
Функции доступа:
| Qt::TimerType | timerType() const |
| void | setTimerType(Qt::TimerType atype) |
См. также Qt::TimerType.
Документация функций-членов
QTimer::QTimer(QObject *parent = nullptr)
Конструирует таймер с заданным parent.
[slot] void QTimer::start()
Эта функция перегружает start().
Запускает или перезапускает таймер с таймаутом, указанным в interval.
Если таймер уже запущен, он будет остановлен и перезапущен.
Если singleShot равно true, таймер будет активирован только один раз.
[slot] void QTimer::start(int msec)
Запускает или перезапускает таймер с интервалом таймаута msec миллисекунд.
Если таймер уже запущен, он будет остановлен и перезапущен.
Если singleShot равно true, таймер будет активирован только один раз.
[slot] void QTimer::stop()
Останавливает таймер.
См. также start().
[private signal] void QTimer::timeout()
Этот сигнал излучается, когда таймер истекает.
Примечание: Это частный сигнал. Он может использоваться в соединениях сигналов, но не может излучаться пользователем.
См. также interval, start() и stop().
[virtual] QTimer::~QTimer()
Уничтожает таймер.
[since 5.12] template <typename Functor> QMetaObject::Connection QTimer::callOnTimeout(Functor slot, Qt::ConnectionType connectionType = Qt::AutoConnection)
Это перегруженная функция.
Создаёт соединение типа connectionType от сигнала timeout() к slot и возвращает дескриптор соединения.
Этот метод предоставлен для удобства. Он эквивалентен вызову QObject::connect(timer, &QTimer::timeout, timer, slot, connectionType).
Эта функция была введена в Qt 5.12.
См. также QObject::connect() и timeout().
[since 5.12] template <typename Functor> QMetaObject::Connection QTimer::callOnTimeout(const QObject *context, Functor slot, Qt::ConnectionType connectionType = Qt::AutoConnection)
Эта функция перегружает callOnTimeout().
Создаёт соединение от сигнала timeout() к slot, которое будет помещено в определённую очередь событий context, и возвращает дескриптор соединения.
Этот метод предоставлен для удобства. Он эквивалентен вызову QObject::connect(timer, &QTimer::timeout, context, slot, connectionType).
Эта функция была введена в Qt 5.12.
См. также QObject::connect() и timeout().
[since 5.12] template <typename MemberFunction> QMetaObject::Connection QTimer::callOnTimeout(const QObject *receiver, MemberFunction *slot, Qt::ConnectionType connectionType = Qt::AutoConnection)
Эта функция перегружает callOnTimeout().
Создаёт соединение от сигнала timeout() к slot в объекте receiver. Возвращает дескриптор соединения.
Этот метод предоставлен для удобства. Он эквивалентен вызову QObject::connect(timer, &QTimer::timeout, receiver, slot, connectionType).
Эта функция была введена в Qt 5.12.
См. также QObject::connect() и timeout().
[since 5.8] std::chrono::milliseconds QTimer::intervalAsDuration() const
Возвращает интервал этого таймера как std::chrono::milliseconds объект.
Эта функция была введена в Qt 5.8.
См. также interval.
bool QTimer::isActive() const
Возвращает true если таймер запущен (ожидает); иначе возвращает false.
Примечание: Функция-геттер для свойства active.
[since 5.8] std::chrono::milliseconds QTimer::remainingTimeAsDuration() const
Возвращает оставшееся время в этом объекте таймера как объект std::chrono::milliseconds. Если этот таймер истек или просрочен, возвращаемое значение равно std::chrono::milliseconds::zero(). Если оставшееся время не найдено или таймер не активен, эта функция возвращает отрицательную длительность.
Эта функция была введена в Qt 5.8.
См. также remainingTime().
[static] void QTimer::singleShot(int msec, const QObject *receiver, const char *member)
Эта статическая функция вызывает слот после заданного интервала времени.
Использовать эту функцию очень удобно, так как вам не нужно беспокоиться о timerEvent или создавать локальный объект QTimer.
Пример:
#include <QApplication>
#include <QTimer>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QTimer::singleShot(600000, &app, SLOT(quit()));
...
return app.exec();
} Эта демонстрационная программа автоматически завершается через 10 минут (600 000 миллисекунд).
receiver — объект-получатель, а member — имя слота. Интервал времени составляет msec миллисекунд.
Примечание: Эта функция является реентерабельной.
См. также setSingleShot() и start().
[static] void QTimer::singleShot(int msec, Qt::TimerType timerType, const QObject *receiver, const char *member)
Это перегруженная функция.
Эта статическая функция вызывает слот после заданного интервала времени.
Использовать эту функцию очень удобно, так как вам не нужно беспокоиться о timerEvent или создавать локальный объект QTimer.
receiver — объект-получатель, а member — имя слота. Интервал времени составляет msec миллисекунд. timerType влияет на точность таймера.
Примечание: Эта функция является реентерабельной.
См. также start().
[static, since 5.4] template <typename PointerToMemberFunction> void QTimer::singleShot(int msec, const QObject *receiver, PointerToMemberFunction method)
Это перегруженная функция.
Эта статическая функция вызывает член-функцию объекта QObject после заданного интервала времени.
Использовать эту функцию очень удобно, так как вам не нужно беспокоиться о timerEvent или создавать локальный объект QTimer.
receiver — объект-получатель, а method — член-функция. Интервал времени составляет msec миллисекунд.
Если receiver уничтожен до истечения интервала, метод не будет вызван. Функция будет выполнена в потоке receiver. В потоке receiver должен быть запущен цикл событий Qt.
Примечание: Эта функция является реентерабельной.
Эта функция была введена в Qt 5.4.
См. также start().
[static, since 5.4] template <typename PointerToMemberFunction> void QTimer::singleShot(int msec, Qt::TimerType timerType, const QObject *receiver, PointerToMemberFunction method)
Это перегруженная функция.
Эта статическая функция вызывает член-функцию объекта QObject после заданного интервала времени.
Использовать эту функцию очень удобно, так как вам не нужно беспокоиться о timerEvent или создавать локальный объект QTimer.
receiver — объект-получатель, а method — член-функция. Интервал времени составляет msec миллисекунд. timerType влияет на точность таймера.
Если receiver уничтожен до истечения интервала, метод не будет вызван. Функция будет выполнена в потоке receiver. В потоке receiver должен быть запущен цикл событий Qt.
Примечание: Эта функция является реентерабельной.
Эта функция была введена в Qt 5.4.
См. также start().
[static, since 5.4] template <typename Functor> void QTimer::singleShot(int msec, Functor functor)
Это перегруженная функция.
Эта статическая функция вызывает functor после заданного интервала времени.
Использовать эту функцию очень удобно, так как вам не нужно беспокоиться о timerEvent или создавать локальный объект QTimer.
Интервал времени составляет msec миллисекунд.
Примечание: Эта функция является реентерабельной.
Эта функция была введена в Qt 5.4.
См. также start().
[static, since 5.4] template <typename Functor> void QTimer::singleShot(int msec, Qt::TimerType timerType, Functor functor)
Это перегруженная функция.
Эта статическая функция вызывает functor после заданного интервала времени.
Использовать эту функцию очень удобно, так как вам не нужно беспокоиться о timerEvent или создавать локальный объект QTimer.
Интервал времени составляет msec миллисекунд. timerType влияет на точность таймера.
Примечание: Эта функция является реентерабельной.
Эта функция была введена в Qt 5.4.
См. также start().
[static, since 5.4] template <typename Functor, int> void QTimer::singleShot(int msec, const QObject *context, Functor functor)
Это перегруженная функция.
Эта статическая функция вызывает functor после заданного интервала времени.
Использовать эту функцию очень удобно, так как вам не нужно беспокоиться о timerEvent или создавать локальный объект QTimer.
Интервал времени составляет msec миллисекунд.
Если context уничтожен до истечения интервала, метод не будет вызван. Функция будет выполнена в потоке context. В потоке context должен быть запущен цикл событий Qt.
Примечание: Эта функция является реентерабельной.
Эта функция была введена в Qt 5.4.
См. также start().
[static, since 5.4] template <typename Functor, int> void QTimer::singleShot(int msec, Qt::TimerType timerType, const QObject *context, Functor functor)
Это перегруженная функция.
Эта статическая функция вызывает functor после заданного интервала времени.
Использовать эту функцию очень удобно, так как вам не нужно беспокоиться о timerEvent или создавать локальный объект QTimer.
Интервал времени составляет msec миллисекунд. timerType влияет на точность таймера.
Если context уничтожен до истечения интервала, метод не будет вызван. Функция будет выполнена в потоке context. В потоке context должен быть запущен цикл событий Qt.
Примечание: Эта функция является реентерабельной.
Эта функция была введена в Qt 5.4.
См. также start().
[static, since 5.8] void QTimer::singleShot(std::chrono::milliseconds msec, const QObject *receiver, const char *member)
Это перегруженная функция.
Эта статическая функция вызывает слот после заданного интервала времени.
Использовать эту функцию очень удобно, так как вам не нужно беспокоиться о timerEvent или создавать локальный объект QTimer.
receiver — объект-получатель, а member — имя слота. Интервал времени задан в объекте продолжительности msec.
Примечание: Эта функция является реентерабельной.
Эта функция была введена в Qt 5.8.
См. также start().
[static, since 5.8] void QTimer::singleShot(std::chrono::milliseconds msec, Qt::TimerType timerType, const QObject *receiver, const char *member)
Это перегруженная функция.
Эта статическая функция вызывает слот после заданного интервала времени.
Использовать эту функцию очень удобно, так как вам не нужно беспокоиться о timerEvent или создавать локальный объект QTimer.
receiver — объект-получатель, а member — имя слота. Интервал времени задан в объекте продолжительности msec. timerType влияет на точность таймера.
Примечание: Эта функция является реентерабельной.
Эта функция была введена в Qt 5.8.
См. также start().
[since 5.8] void QTimer::start(std::chrono::milliseconds msec)
Это перегруженная функция.
Запускает или перезапускает таймер с интервалом msec миллисекунд.
Если таймер уже запущен, он будет остановлен и перезапущен.
Если singleShot имеет значение true, таймер будет активирован только один раз.
Эта функция была добавлена в Qt 5.8.
[override virtual protected] void QTimer::timerEvent(QTimerEvent *e)
Переопределяет: QObject::timerEvent(QTimerEvent *event).
int QTimer::timerId() const
Возвращает идентификатор таймера, если таймер запущен; в противном случае возвращает -1.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.0/qtimer.html