Класс QTimer
Класс QTimer предоставляет повторяющие и одноразовые таймеры. Подробнее...
| Заголовок: | #include <QTimer> |
| qmake: | QT += core |
| Наследует: | QObject |
Свойства
|
|
Открытые функции
| QTimer(QObject *parent = nullptr) | |
| virtual | ~QTimer() |
| QMetaObject::Connection | callOnTimeout(Functor slot, Qt::ConnectionType connectionType = ...) |
| QMetaObject::Connection | callOnTimeout(const QObject *context, Functor slot, Qt::ConnectionType connectionType = ...) |
| QMetaObject::Connection | callOnTimeout(const QObject *receiver, MemberFunction *slot, Qt::ConnectionType connectionType = ...) |
| 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, SLOT(updateCaption()));
В многопоточных приложениях вы можете использовать QTimer в любом потоке, имеющем цикл событий. Для запуска цикла событий из потока, не являющегося потоком графического интерфейса, используйте QThread::exec(). Qt использует аффилированность потока таймера для определения, какой поток будет генерировать сигнал timeout(). По этой причине вам необходимо запускать и останавливать таймер в его потоке; невозможно запустить таймер из другого потока.
В качестве специального случая QTimer с интервалом таймаута 0 будет отработан, как только все события в очереди событий системы окон будут обработаны. Это можно использовать для выполнения сложных задач, обеспечивая быстрый пользовательский интерфейс:
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(processOneThing()));
timer->start(); После этого processOneThing() будет вызываться повторно. Он должен быть написан таким образом, чтобы всегда возвращаться быстро (обычно после обработки одного элемента данных), чтобы Qt мог передавать события пользовательскому интерфейсу и останавливать таймер, как только он выполнил всю свою работу. Это традиционный способ реализации сложных задач в приложениях графического интерфейса, но поскольку многопоточность сейчас становится доступной на все большем количестве платформ, ожидается, что объекты QTimer с нулевыми миллисекундами постепенно будут заменены объектами QThread.
Точность и разрешение таймера
Точность таймеров зависит от базовой операционной системы и оборудования. Большинство платформ поддерживают разрешение в 1 миллисекунду, хотя точность таймера не будет равна этому разрешению во многих реальных ситуациях.
Точность также зависит от типа таймера. Для Qt::PreciseTimer QTimer будет пытаться сохранить точность на уровне 1 миллисекунды. Точные таймеры также никогда не отработают раньше, чем ожидалось.
Для Qt::CoarseTimer и Qt::VeryCoarseTimer типов QTimer может сработать раньше, чем ожидалось, в пределах границ для этих типов: 5% от интервала для Qt::CoarseTimer и 500 мс для Qt::VeryCoarseTimer.
END_OF_DOCUMENT_MARKERВсе типы таймеров могут завершиться с отставанием от ожидаемого времени, если система загружена или не может обеспечить требуемую точность. В этом случае переполнение таймаута Qt будет излучать timeout() только один раз, даже если несколько таймаутов истекли, а затем возобновит исходный интервал.
Альтернативы QTimer
Альтернативой использованию QTimer является вызов QObject::startTimer() для вашего объекта и переопределение обработчика событий QObject::timerEvent() в вашем классе (который должен наследоваться от QObject). Недостатком является то, что timerEvent() не поддерживает такие высокоуровневые функции, как таймеры с однократным запуском или сигналы.
Ещё одной альтернативой является QBasicTimer. Обычно он менее громоздкий, чем прямое использование QObject::startTimer(). См. Таймеры для обзора всех трёх подходов.
Некоторые операционные системы ограничивают количество используемых таймеров; Qt пытается обойти эти ограничения.
См. также QBasicTimer, QTimerEvent, QObject::timerEvent(), Таймеры, Пример Аналоговых Часов и Пример Wiggly.
Документация свойств
active : const bool
Это булево свойство равно true если таймер работает; в противном случае false.
Это свойство было введено в Qt 4.3.
Функции доступа:
| bool | isActive() const |
interval : int
Это свойство содержит интервал таймаута в миллисекундах.
Значение по умолчанию для этого свойства равно 0. QTimer с интервалом таймаута 0 завершится как только все события в очереди событий системы окон будут обработаны.
Установка интервала активного таймера изменяет его timerId().
Функции доступа:
| int | interval() const |
| void | setInterval(int msec) |
| void | setInterval(std::chrono::milliseconds value) |
См. также singleShot.
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().
[signal] void QTimer::timeout()
Этот сигнал излучается, когда таймер завершает работу.
Примечание: Это частный сигнал. Он может использоваться в подключениях сигналов, но не может быть излучен пользователем.
См. также interval, start() и stop().
[virtual] QTimer::~QTimer()
Удаляет таймер.
QMetaObject::Connection QTimer::callOnTimeout(Functor slot, Qt::ConnectionType connectionType = ...)
Это перегруженная функция.
Создаёт подключение от сигнала timeout() к slot и возвращает дескриптор подключения.
Этот метод предоставлен для удобства. Он эквивалентен вызову QObject::connect(timer, &QTimer::timeout, timer, slot, connectionType).
Эта функция была введена в Qt 5.12.
См. также QObject::connect() и timeout().
QMetaObject::Connection QTimer::callOnTimeout(const QObject *context, Functor slot, Qt::ConnectionType connectionType = ...)
Эта функция перегружает callOnTimeout().
Создаёт подключение от сигнала timeout() к slot, размещая его в определённой очереди событий context, и возвращает дескриптор подключения.
Этот метод предоставлен для удобства. Он эквивалентен вызову QObject::connect(timer, &QTimer::timeout, context, slot, connectionType).
Эта функция была введена в Qt 5.12.
См. также QObject::connect() и timeout().
QMetaObject::Connection QTimer::callOnTimeout(const QObject *receiver, MemberFunction *slot, Qt::ConnectionType connectionType = ...)
Эта функция перегружает callOnTimeout().
Создаёт подключение от сигнала timeout() к slot в объекте receiver. Возвращает дескриптор подключения.
Этот метод предоставлен для удобства. Он эквивалентен вызову QObject::connect(timer, &QTimer::timeout, receiver, slot, connectionType).
Эта функция была введена в Qt 5.12.
См. также QObject::connect() и timeout().
std::chrono::milliseconds QTimer::intervalAsDuration() const
Возвращает интервал этого таймера как объект std::chrono::milliseconds.
Эта функция была введена в Qt 5.8.
См. также interval.
bool QTimer::isActive() const
Возвращает true если таймер запущен (в ожидании); в противном случае возвращает false.
Примечание: Функция-получатель для свойства active.
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] 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] 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] void QTimer::singleShot(int msec, Functor functor)
Это перегруженная функция.
Эта статическая функция вызывает functor после заданного интервала времени.
Использовать эту функцию очень удобно, так как вам не нужно беспокоиться о timerEvent или создавать локальный объект QTimer.
Интервал времени составляет msec миллисекунд.
Примечание: Эта функция является реентерабельной.
Эта функция была добавлена в Qt 5.4.
См. также start().
[static] void QTimer::singleShot(int msec, Qt::TimerType timerType, Functor functor)
Это перегруженная функция.
Эта статическая функция вызывает functor после заданного интервала времени.
Использовать эту функцию очень удобно, так как вам не нужно беспокоиться о timerEvent или создавать локальный объект QTimer.
Интервал времени составляет msec миллисекунд. timerType влияет на точность таймера.
Примечание: Эта функция является реентерабельной.
Эта функция была добавлена в Qt 5.4.
См. также start().
[static] void QTimer::singleShot(int msec, const QObject *context, Functor functor)
Это перегруженная функция.
Эта статическая функция вызывает functor после заданного интервала времени.
Использовать эту функцию очень удобно, так как вам не нужно беспокоиться о timerEvent или создавать локальный объект QTimer.
Интервал времени составляет msec миллисекунд.
Если context будет удалён до истечения интервала, метод не будет вызван. Функция будет выполняться в потоке context. Поток context должен иметь работающий цикл событий Qt.
Примечание: Эта функция является реентерабельной.
Эта функция была добавлена в Qt 5.4.
См. также start().
[static] 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] void QTimer::singleShot(std::chrono::milliseconds msec, const QObject *receiver, const char *member)
Это перегруженная функция.
Эта статическая функция вызывает слот после заданного интервала времени.
Использовать эту функцию очень удобно, так как вам не нужно беспокоиться о timerEvent или создавать локальный объект QTimer.
receiver — объект-получатель, а member — слот. Интервал времени задан в объекте продолжительности msec.
Примечание: Эта функция является реентерабельной.
Эта функция была добавлена в Qt 5.8.
См. также start().
[static] 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().
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-5.13/qtimer.html