Класс QTimer
Класс QTimer предоставляет таймеры с повтором и однократного срабатывания. Подробнее...
| Заголовок: | #include <QTimer> |
| qmake: | QT += core |
| Наследует: | QObject |
Свойства
|
|
- 1 свойство унаследовано от QObject
Открытые функции
| QTimer(QObject *parent = Q_NULLPTR) | |
| ~QTimer() | |
| int | interval() const |
| bool | isActive() const |
| bool | isSingleShot() const |
| int | remainingTime() const |
| void | setInterval(int msec) |
| void | setSingleShot(bool singleShot) |
| void | setTimerType(Qt::TimerType atype) |
| int | timerId() const |
| Qt::TimerType | timerType() const |
- 31 открытая функция унаследована от 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) |
- 11 статических открытых членов унаследованы от QObject
Переопределенные защищенные функции
| virtual void | timerEvent(QTimerEvent *e) |
- 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 с нулевыми миллисекундами таймаута постепенно будут заменены на QThreads.
Точность и разрешение таймера
Точность таймеров зависит от операционной системы и аппаратного обеспечения. Большинство платформ поддерживают разрешение 1 миллисекунда, хотя точность таймера не всегда соответствует этому разрешению в реальных условиях.
Точность также зависит от типа таймера. Для Qt::PreciseTimer QTimer будет пытаться сохранить точность 1 миллисекунда. Точные таймеры также никогда не сработают раньше ожидаемого времени.
Для типов Qt::CoarseTimer и Qt::VeryCoarseTimer QTimer может сработать раньше ожидаемого времени, в пределах допустимых отклонений для этих типов: 5% от интервала для Qt::CoarseTimer и 500 мс для Qt::VeryCoarseTimer.
Все типы таймеров могут сработать позже ожидаемого времени, если система загружена или не может обеспечить требуемую точность. В этом случае переполнения таймаута Qt вызовет activated() только один раз, даже если истекло несколько таймаутов, а затем возобновит исходный интервал.
Альтернативы QTimer
Альтернативой использованию QTimer является вызов QObject::startTimer() для вашего объекта и переопределение обработчика события QObject::timerEvent() в вашем классе (который должен наследовать QObject). Недостатком является то, что timerEvent() не поддерживает такие высокоуровневые функции, как однократные таймеры или сигналы.
Другой вариант — QBasicTimer. Обычно он менее сложен, чем прямое использование QObject::startTimer(). Смотрите Таймеры для обзора всех трёх подходов.
Некоторые операционные системы ограничивают количество используемых таймеров; Qt пытается обойти эти ограничения.
END_OF_DOCUMENT_MARKERСм. также QBasicTimer, QTimerEvent, QObject::timerEvent(), Таймеры, Пример аналоговых часов и Пример волнистой линии.
Документация свойств
active : const bool
Это булево свойство равно true если таймер запущен, иначе равно false.
Это свойство было добавлено в Qt 4.3.
Функции доступа:
| bool | isActive() const |
interval : int
Это свойство содержит интервал таймаута в миллисекундах
Значение по умолчанию для этого свойства равно 0. Таймер QTimer с интервалом таймаута 0 сработает, как только все события в очереди событий системы окон будут обработаны.
Изменение интервала активного таймера меняет его timerId.
Функции доступа:
| int | interval() const |
| void | setInterval(int msec) |
См. также 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 = Q_NULLPTR)
Создает таймер с заданным parent.
QTimer::~QTimer()
Удаляет таймер.
bool QTimer::isActive() const
Возвращает true если таймер запущен (ожидает); в противном случае возвращает false.
Примечание: Функция-получатель для свойства active.
[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. Поток получателя должен иметь работающий цикл событий 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. Поток получателя должен иметь работающий цикл событий 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 object.
Интервал времени составляет msec миллисекунд.
Если 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. Поток контекста должен иметь работающий цикл событий Qt.
Примечание: Эта функция является реентерабельной.
Данная функция была представлена в Qt 5.4.
См. также start().
[slot] void QTimer::start(int msec)
Запускает или перезапускает таймер с интервалом таймаута msec миллисекунд.
Если таймер уже запущен, он будет остановлен и перезапущен.
Если singleShot имеет значение true, таймер будет активирован только один раз.
[slot] void QTimer::start()
Эта функция перегружает start().
Запускает или перезапускает таймер с таймаутом, указанным в interval.
Если таймер уже запущен, он будет остановлен и перезапущен.
Если singleShot имеет значение true, таймер будет активирован только один раз.
[slot] void QTimer::stop()
Останавливает таймер.
См. также start().
[signal] void QTimer::timeout()
Этот сигнал генерируется при истечении таймаута.
Примечание: Это частный сигнал. Он может использоваться в соединениях сигналов, но не может генерироваться пользователем.
См. также interval, start() и stop().
[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/archives/qt-5.6/qtimer.html