QTimer Class
La clase QTimer proporciona temporizadores repetitivos y de disparo único. Más...
| Cabecera: | #include <QTimer> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core)target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| Hereda: | QObject |
- Lista de todos los miembros, incluidos los heredados
- Miembros obsoletos
- QTimer es parte de Clases de Eventos.
Propiedades
|
|
Funciones públicas
| QTimer(QObject *parent = nullptr) | |
| virtual | ~QTimer() |
| QBindable<bool> | bindableActive() |
| QBindable<int> | bindableInterval() |
| QBindable<bool> | bindableSingleShot() |
| QBindable<Qt::TimerType> | bindableTimerType() |
| QMetaObject::Connection | callOnTimeout(Functor &&slot) |
| QMetaObject::Connection | callOnTimeout(const QObject *context, Functor &&slot, Qt::ConnectionType connectionType = Qt::AutoConnection) |
(since 6.8) Qt::TimerId | id() const |
| 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 interval) |
| int | timerId() const |
| Qt::TimerType | timerType() const |
Ranuras públicas
Señales
| void | timeout() |
Miembros públicos estáticos
| void | singleShot(Duration interval, Functor &&functor) |
| void | singleShot(Duration interval, Qt::TimerType timerType, Functor &&functor) |
| void | singleShot(Duration interval, const QObject *context, Functor &&functor) |
| void | singleShot(Duration interval, Qt::TimerType timerType, const QObject *context, Functor &&functor) |
| void | singleShot(std::chrono::nanoseconds nsec, const QObject *receiver, const char *member) |
| void | singleShot(std::chrono::nanoseconds nsec, Qt::TimerType timerType, const QObject *receiver, const char *member) |
Funciones protegidas reimplementadas
| virtual void | timerEvent(QTimerEvent *e) override |
Descripción Detallada
La clase QTimer proporciona una interfaz de programación de alto nivel para temporizadores. Para usarlo, crea un QTimer, conecta su señal timeout() a las ranuras apropiadas, y llama a start(). A partir de ese momento, emitirá la señal timeout() a intervalos constantes.
Ejemplo para un temporizador de un segundo (1000 milisegundos) (del ejemplo Reloj analógico ):
QTimer *timer = new QTimer(this); connect(timer, &QTimer::timeout, this, QOverload<>::of(&AnalogClock::update)); timer->start(1000);
A partir de entonces, la ranura update() se llama cada segundo.
Puede configurar un temporizador para que se agote sólo una vez llamando a setSingleShot(true). También puede utilizar la función estática QTimer::singleShot() para llamar a una ranura después de un intervalo especificado:
QTimer::singleShot(200, this, &Foo::updateCaption);
En aplicaciones multihilo, puede utilizar QTimer en cualquier hilo que tenga un bucle de eventos. Para iniciar un bucle de eventos desde un subproceso no GUI, utilice QThread::exec(). Qt utiliza el thread affinity del temporizador para determinar qué hilo emitirá la señal timeout(). Debido a esto, debes iniciar y detener el temporizador en su subproceso; no es posible iniciar un temporizador desde otro subproceso.
Como caso especial, un QTimer con un tiempo de espera de 0 expirará tan pronto como sea posible, aunque el orden entre temporizadores cero y otras fuentes de eventos no está especificado. Los temporizadores cero pueden usarse para hacer algo de trabajo mientras se sigue proporcionando una interfaz de usuario ágil:
QTimer *timer = new QTimer(this); connect(timer, &QTimer::timeout, this, &Foo::processOneThing); timer->start();
A partir de entonces, processOneThing() será llamado repetidamente. Debe ser escrito de tal manera que siempre vuelva rápidamente (normalmente después de procesar un dato) para que Qt pueda entregar eventos a la interfaz de usuario y detener el temporizador tan pronto como haya hecho todo su trabajo. Esta es la forma tradicional de implementar trabajo pesado en aplicaciones GUI, pero como el multithreading está hoy en día disponible en más y más plataformas, esperamos que los objetos QTimer de cero milisegundos sean gradualmente reemplazados por QThreads.
Precisión y resolución de los temporizadores
La precisión de los temporizadores depende del sistema operativo y el hardware subyacentes. La mayoría de las plataformas admiten una resolución de 1 milisegundo, aunque la precisión del temporizador no será igual a esta resolución en muchas situaciones del mundo real.
La precisión también depende de timer type. Para Qt::PreciseTimer, QTimer intentará mantener la precisión en 1 milisegundo. Los temporizadores precisos nunca expirarán antes de lo esperado.
Para los tipos Qt::CoarseTimer y Qt::VeryCoarseTimer, QTimer puede despertarse antes de lo esperado, dentro de los márgenes para esos tipos: 5% del intervalo para Qt::CoarseTimer y 500 ms para Qt::VeryCoarseTimer.
Todos los tipos de temporizador pueden agotarse más tarde de lo previsto si el sistema está ocupado o no puede proporcionar la precisión solicitada. En tal caso de rebasamiento del tiempo de espera, Qt emitirá timeout() sólo una vez, aunque hayan expirado varios tiempos de espera, y luego reanudará el intervalo original.
Alternativas a QTimer
Qt 6.8 introdujo QChronoTimer. La principal diferencia entre las dos clases, es que QChronoTimer soporta un mayor rango de intervalo y una mayor precisión (std::chrono::nanoseconds). Para QTimer el intervalo máximo soportado es de ±24 días, mientras que para QChronoTimer es de ±292 años (menos posibilidades de desbordamiento con intervalos mayores que std::numeric_limits<int>::max()). Si sólo necesitas una resolución de milisegundos y un intervalo de ±24 días, puedes seguir usando QTimer.
Otra alternativa es reimplementar el método QObject::timerEvent() en tu clase (que debe ser una subclase de QObject), y utilizar uno de los siguientes enfoques:
- Usando QBasicTimer, una clase-valor ligera que envuelve un ID de temporizador. Puedes iniciar el temporizador con QBasicTimer::start() y detenerlo con QBasicTimer::stop(). Usted puede manejar el evento en su reimplemneted timerEvent().
- Un método de más bajo nivel es manipular los IDs del temporizador directamente. Para iniciar el temporizador llame a QObject::startTimer(), almacenando el ID devuelto. Para detener el temporizador llame a QObject::killTimer(). Puedes manejar el evento en tu reimplementación de timerEvent(). Este enfoque suele ser más engorroso que utilizar QBasicTimer.
Una desventaja de usar timerEvent() es que algunas características de alto nivel, como temporizadores de disparo único y señales, no están soportadas.
Algunos sistemas operativos limitan el número de temporizadores que se pueden utilizar; Qt intenta evitar estas limitaciones.
Ver también QBasicTimer, QTimerEvent, QObject::timerEvent(), Temporizadores, y Reloj Analógico.
Documentación de Propiedades
[bindable read-only] active : bool
Nota: Esta propiedad soporta enlaces QProperty.
Esta propiedad booleana es true si el temporizador está en marcha; en caso contrario es false.
Funciones de acceso:
| bool | isActive() const |
[bindable] interval : int
Nota: Esta propiedad soporta QProperty bindings.
Esta propiedad contiene el intervalo de tiempo de espera en milisegundos.
El valor por defecto de esta propiedad es 0. Un QTimer con un intervalo de tiempo de espera de 0 expirará tan pronto como todos los eventos de la cola de eventos del sistema de ventanas hayan sido procesados.
Nota: Mantener el bucle de eventos ocupado con un temporizador a cero está destinado a causar problemas y un comportamiento altamente errático de la UI.
Establecer el intervalo de un temporizador en ejecución cambiará el intervalo, stop() y luego start() el temporizador, y adquirirá un nuevo id(). Si el temporizador no se está ejecutando, sólo se cambia el intervalo.
A partir de Qt 6.10, establecer un intervalo negativo resultará en una advertencia en tiempo de ejecución y el valor se restablecerá a 1ms. Antes de Qt 6.10, un temporizador Qt permitía establecer un intervalo negativo pero se comportaba de forma sorprendente (por ejemplo, detenía el temporizador si estaba en marcha o no lo iniciaba).
Funciones de acceso:
| int | interval() const |
| void | setInterval(int msec) |
| void | setInterval(std::chrono::milliseconds value) |
Ver también singleShot.
[read-only] remainingTime : int
Esta propiedad contiene el tiempo restante en milisegundos
Devuelve el valor restante del temporizador en milisegundos que quedan hasta el tiempo de espera. Si el temporizador está inactivo, el valor devuelto será -1. Si el temporizador está vencido, el valor devuelto será 0.
Funciones de acceso:
| int | remainingTime() const |
Véase también interval.
[bindable] singleShot : bool
Nota: Esta propiedad soporta QProperty bindings.
Esta propiedad indica si el temporizador es de disparo único.
Un temporizador de disparo único se dispara una sola vez, los temporizadores que no son de disparo único se disparan cada interval milisegundos.
El valor por defecto de esta propiedad es false.
Funciones de acceso:
| bool | isSingleShot() const |
| void | setSingleShot(bool singleShot) |
Véase también interval y singleShot().
[bindable] timerType : Qt::TimerType
Nota: Esta propiedad admite los enlaces QProperty.
controla la precisión del temporizador
El valor por defecto de esta propiedad es Qt::CoarseTimer.
Funciones de acceso:
| Qt::TimerType | timerType() const |
| void | setTimerType(Qt::TimerType atype) |
Véase también Qt::TimerType.
Documentación de las funciones miembro
[explicit] QTimer::QTimer(QObject *parent = nullptr)
Construye un temporizador con la dirección parent.
[virtual noexcept] QTimer::~QTimer()
Destruye el temporizador.
template <typename Functor> QMetaObject::Connection QTimer::callOnTimeout(Functor &&slot)
Crea una conexión desde la señal timeout() del temporizador a slot. Devuelve un "handle" a la conexión.
Este método se proporciona por conveniencia. Es equivalente a llamar:
Nota: Esta sobrecarga no está disponible cuando QT_NO_CONTEXTLESS_CONNECT está definido, en su lugar utilice la sobrecarga callOnTimeout() que toma un objeto de contexto.
Véase también QObject::connect() y timeout().
template <typename Functor> QMetaObject::Connection QTimer::callOnTimeout(const QObject *context, Functor &&slot, Qt::ConnectionType connectionType = Qt::AutoConnection)
Crea una conexión desde la señal timeout() a slot para ser colocada en un bucle de eventos específico de context, y devuelve un handle a la conexión.
Este método se proporciona por conveniencia. Es equivalente a llamar a
Esta función sobrecarga QTimer::callOnTimeout().
Véase también QObject::connect() y timeout().
[since 6.8] Qt::TimerId QTimer::id() const
Devuelve un Qt::TimerId que representa el ID del temporizador si el temporizador está en marcha; en caso contrario devuelve Qt::TimerId::Invalid.
Esta función se introdujo en Qt 6.8.
Véase también Qt::TimerId.
std::chrono::milliseconds QTimer::intervalAsDuration() const
Devuelve el intervalo de este temporizador como un objeto std::chrono::milliseconds.
Véase también interval.
bool QTimer::isActive() const
Devuelve true si el temporizador está en marcha; en caso contrario devuelve false.
Nota: Función Getter para la propiedad active.
std::chrono::milliseconds QTimer::remainingTimeAsDuration() const
Devuelve el tiempo restante de este objeto temporizador como un objeto std::chrono::milliseconds. Si este temporizador está vencido o retrasado, el valor devuelto es std::chrono::milliseconds::zero(). Si no se ha podido encontrar el tiempo restante o el temporizador no está en marcha, esta función devuelve una duración negativa.
Véase también remainingTime().
[static] template <typename Duration, typename Functor> void QTimer::singleShot(Duration interval, const QObject *context, Functor &&functor)
[static] template <typename Duration, typename Functor> void QTimer::singleShot(Duration interval, Qt::TimerType timerType, const QObject *context, Functor &&functor)
[static] template <typename Duration, typename Functor> void QTimer::singleShot(Duration interval, Functor &&functor)
[static] template <typename Duration, typename Functor> void QTimer::singleShot(Duration interval, Qt::TimerType timerType, Functor &&functor)
Esta función estática llama a functor después de interval.
Es muy conveniente utilizar esta función porque no es necesario molestarse con un timerEvent o crear un objeto local QTimer.
Si se especifica context, se llamará a functor sólo si el objeto context no ha sido destruido antes de que se produzca el intervalo. El functor se ejecutará entonces el hilo de context. El hilo del contexto debe tener un bucle de eventos Qt en ejecución.
Si functor es una función miembro de context, entonces la función será llamada sobre el objeto.
El parámetro interval puede ser un int (interpretado como una cuenta de milisegundos) o un tipo std::chrono que implícitamente se convierte a nanosegundos.
A partir de Qt 6.10, establecer un intervalo negativo provocará una advertencia en tiempo de ejecución y el valor se restablecerá a 1ms. Antes de Qt 6.10 un temporizador Qt Timer permitía establecer un intervalo negativo pero se comportaba de formas sorprendentes (por ejemplo detener el temporizador si estaba en marcha o no iniciarlo en absoluto).
Nota: En versiones de Qt anteriores a la 6.8, las sobrecargas de crono tomaban chrono::milisegundos, no chrono::nanosegundos. El compilador hará la conversión automáticamente, pero la conversión puede desbordarse para recuentos de milisegundos extremadamente grandes.
Nota: Esta función es reentrante.
Véase también start().
[static] void QTimer::singleShot(std::chrono::nanoseconds nsec, const QObject *receiver, const char *member)
Esta función estática llama a una ranura después de un intervalo de tiempo dado.
Es muy conveniente utilizar esta función porque no es necesario molestarse con un timerEvent o crear un objeto local QTimer.
receiver es el objeto receptor y member es la ranura. El intervalo de tiempo se indica en el objeto de duración nsec.
A partir de Qt 6.10, establecer un intervalo negativo resultará en una advertencia en tiempo de ejecución y el valor se restablecerá a 1ms. Antes de Qt 6.10 un temporizador Qt Timer permitía establecer un intervalo negativo pero se comportaba de formas sorprendentes (por ejemplo detener el temporizador si estaba en ejecución o no iniciarlo en absoluto).
Nota: En versiones de Qt anteriores a la 6.8, esta función tomaba chrono::milisegundos, no chrono::nanosegundos. El compilador hará la conversión automáticamente, pero la conversión puede desbordarse para recuentos de milisegundos extremadamente grandes.
Esta es una función sobrecargada.
Nota: Esta función es reentrante.
Véase también start().
[static] void QTimer::singleShot(std::chrono::nanoseconds nsec, Qt::TimerType timerType, const QObject *receiver, const char *member)
Esta función estática llama a una ranura después de un intervalo de tiempo dado.
Es muy conveniente utilizar esta función porque no es necesario molestarse con un timerEvent o crear un objeto local QTimer.
receiver es el objeto receptor y member es la ranura. El intervalo de tiempo se indica en el objeto de duración nsec. El timerType afecta a la precisión del temporizador.
A partir de Qt 6.10, establecer un intervalo negativo resultará en una advertencia en tiempo de ejecución y el valor se restablecerá a 1ms. Antes de Qt 6.10, un temporizador Qt permitía establecer un intervalo negativo pero se comportaba de forma sorprendente (por ejemplo, detenía el temporizador si estaba en marcha o no lo iniciaba en absoluto).
Nota: En versiones de Qt anteriores a la 6.8, esta función tomaba chrono::milisegundos, no chrono::nanosegundos. El compilador hará la conversión automáticamente, pero la conversión puede desbordarse para recuentos de milisegundos extremadamente grandes.
Esta es una función sobrecargada.
Nota: Esta función es reentrante.
Véase también start().
[slot] void QTimer::start(int msec)
Inicia o reinicia el temporizador con un intervalo de tiempo de espera de msec milisegundos.
Esto equivale a:
timer.setInterval(msec); timer.start();
Si el temporizador ya está en marcha, será stopped y reiniciado. Esto también cambiará su id().
Si singleShot es verdadero, el temporizador se activará sólo una vez.
A partir de Qt 6.10, establecer un intervalo negativo resultará en una advertencia en tiempo de ejecución y el valor se restablecerá a 1ms. Antes de Qt 6.10 un temporizador Qt te permitía establecer un intervalo negativo pero se comportaba de formas sorprendentes (por ejemplo parar el temporizador si estaba en marcha o no iniciarlo en absoluto).
Nota: Mantener el bucle de eventos ocupado con un temporizador cero puede causar problemas y un comportamiento errático de la interfaz de usuario.
Nota: Esta ranura está sobrecargada. Para conectarse a esta ranura:
// Connect using qOverload:
connect(sender, &SenderClass::signal,
timer, qOverload(&QTimer::start));
// Or using a lambda as wrapper:
connect(sender, &SenderClass::signal,
timer, [receiver = timer](int msec) { receiver->start(msec); }); [slot] void QTimer::start()
Inicia o reinicia el temporizador con el tiempo de espera especificado en interval.
Si el temporizador ya está en marcha, será stopped y reiniciado. Esto también cambiará su id().
Si singleShot es verdadero, el temporizador se activará sólo una vez.
Nota: Mantener el bucle de eventos ocupado con un temporizador a cero está destinado a causar problemas y un comportamiento muy errático de la interfaz de usuario.
Nota: Esta ranura está sobrecargada. Para conectarse a esta ranura:
// Connect using qOverload:
connect(sender, &SenderClass::signal,
timer, qOverload<>(&QTimer::start));
// Or using a lambda as wrapper:
connect(sender, &SenderClass::signal,
timer, [receiver = timer]() { receiver->start(); });void QTimer::start(std::chrono::milliseconds interval)
Inicia o reinicia el temporizador con un tiempo de espera de duración interval milisegundos.
Esto equivale a:
timer.setInterval(interval); timer.start();
Si el temporizador ya está en marcha, se stopped reiniciará. Esto también cambiará su id().
Si singleShot es verdadero, el temporizador se activará sólo una vez.
A partir de Qt 6.10, establecer un intervalo negativo resultará en una advertencia en tiempo de ejecución y el valor se restablecerá a 1ms. Antes de Qt 6.10 un temporizador Qt te permitía establecer un intervalo negativo pero se comportaba de formas sorprendentes (por ejemplo parar el temporizador si estaba en marcha o no iniciarlo en absoluto).
Nota: Mantener el bucle de eventos ocupado con un temporizador cero puede causar problemas y un comportamiento errático de la interfaz de usuario.
Esta es una función sobrecargada.
[slot] void QTimer::stop()
Detiene el temporizador.
Véase también start().
[private signal] void QTimer::timeout()
Esta señal se emite cuando el temporizador se agota.
Nota: Se trata de una señal privada. Puede ser utilizada en conexiones de señales pero no puede ser emitida por el usuario.
Véase también interval, start(), y stop().
[override virtual protected] void QTimer::timerEvent(QTimerEvent *e)
Reimplementa: QObject::timerEvent(QTimerEvent *event).
int QTimer::timerId() const
Devuelve el ID del temporizador si el temporizador está en marcha; en caso contrario devuelve -1.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.