Класс QTimer
Класс QTimer предоставляет повторяющие и одноразовые таймеры. Подробнее...
| Заголовок: | #include <QTimer> |
| 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 в любом потоке, имеющем цикл обработки событий. Чтобы запустить цикл обработки событий из потока, не являющегося GUI-потоком, используйте 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 миллисекунда, хотя точность таймера не будет соответствовать этому разрешению во многих реальных ситуациях.
Точность также зависит от типа таймера timer type. Для 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.
[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()
Удаляет таймер.
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().
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().
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().
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] 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] 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] template <typename Functor> void QTimer::singleShot(int msec, Functor functor)
Это перегруженный метод.
Этот статический метод вызывает functor после заданного интервала времени.
Использовать его очень удобно, так как вам не нужно беспокоиться о timerEvent или создавать локальный объект QTimer.
Интервал времени составляет msec миллисекунд.
Примечание: Этот метод является реентерабельным.
Этот метод был добавлен в Qt 5.4.
См. также start().
[static] template <typename Functor> void QTimer::singleShot(int msec, Qt::TimerType timerType, Functor functor)
Это перегруженный метод.
Этот статический метод вызывает functor после заданного интервала времени.
Использовать его очень удобно, так как вам не нужно беспокоиться о timerEvent или создавать локальный объект QTimer.
Интервал времени составляет msec миллисекунд. timerType влияет на точность таймера.
Примечание: Этот метод является реентерабельным.
Этот метод был добавлен в Qt 5.4.
См. также start().
[static] 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] 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] 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.15/qtimer.html