Класс QTimer
Класс QTimer предоставляет таймеры с повторением и однократного срабатывания. Подробнее...
| Заголовок: | #include <QTimer> |
| qmake: | QT += core |
| Наследует: | QObject |
Свойства
|
|
- 1 свойство унаследовано от 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, PointerToMemberFunction 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 |
- 32 открытые функции унаследованы от QObject
Открытые слоты
| void | start(int msec) |
| void | start() |
| void | stop() |
- 1 открытый слот унаследован от QObject
Сигналы
| void | timeout() |
- 2 сигнала унаследованы от QObject
Статические открытые члены
| 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) |
| const QMetaObject | staticMetaObject |
- 10 статических открытых членов унаследованы от QObject
Переопределённые защищённые функции
| virtual void | timerEvent(QTimerEvent *e) override |
- 9 защищённых функций унаследованы от QObject
Подробное описание
Класс QTimer предоставляет таймеры с повторением и однократного срабатывания.
Класс QTimer предоставляет высокоуровневый интерфейс программирования для таймеров. Для его использования создайте QTimer, подключите его сигнал timeout() к соответствующим слотам и вызовите start(). После этого он будет излучать сигнал timeout() с постоянными интервалами.
Пример таймера на одну секунду (1000 миллисекунд) (из примера Аналоговые часы):
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(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.
Все типы таймеров могут сработать позже, чем ожидалось, если система загружена или не может обеспечить необходимую точность. В таком случае переполнения таймаута 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.
[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, PointerToMemberFunction 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().
[slot] void QTimer::start(int msec)
Запускает или перезапускает таймер с интервалом ожидания msec миллисекунд.
Если таймер уже запущен, он будет остановлен и перезапущен.
Если singleShot равен true, таймер будет активирован только один раз.
[slot] void QTimer::start()
Эта функция перегружает start().
Запускает или перезапускает таймер с интервалом ожидания, указанным в interval.
Если таймер уже запущен, он будет остановлен и перезапущен.
Если singleShot равен true, таймер будет активирован только один раз.
void QTimer::start(std::chrono::milliseconds msec)
Это перегруженная функция.
Запускает или перезапускает таймер с интервалом ожидания msec миллисекунд.
Если таймер уже запущен, он будет остановлен и перезапущен.
Если singleShot равен true, таймер будет активирован только один раз.
Функция была добавлена в Qt 5.8.
[slot] void QTimer::stop()
Останавливает таймер.
См. также start().
[signal] void QTimer::timeout()
Этот сигнал испускается, когда таймер достигает истечения времени.
Примечание: Это приватный сигнал. Он может быть использован в подключениях сигналов, но не может быть испущен пользователем.
См. также interval, start() и stop().
[override virtual protected] void QTimer::timerEvent(QTimerEvent *e)
Переопределено из QObject::timerEvent().
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.12/qtimer.html