En esta página

QChronoTimer Class

La clase QChronoTimer proporciona temporizadores repetitivos y de disparo único. Más...

Cabecera: #include <QChronoTimer>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Desde: Qt 6.8
Hereda: QObject

Propiedades

Funciones públicas

QChronoTimer(QObject *parent = nullptr)
QChronoTimer(std::chrono::nanoseconds nsec, QObject *parent = nullptr)
virtual ~QChronoTimer() override
QBindable<bool> bindableActive()
QBindable<std::chrono::nanoseconds> bindableInterval()
QBindable<bool> bindableSingleShot()
QBindable<Qt::TimerType> bindableTimerType()
QMetaObject::Connection callOnTimeout(const QObject *context, Functor &&slot, Qt::ConnectionType connectionType = Qt::AutoConnection)
Qt::TimerId id() const
std::chrono::nanoseconds interval() const
bool isActive() const
bool isSingleShot() const
std::chrono::nanoseconds remainingTime() const
void setInterval(std::chrono::nanoseconds nsec)
void setSingleShot(bool singleShot)
void setTimerType(Qt::TimerType atype)
Qt::TimerType timerType() const

Ranuras públicas

void start()
void stop()

Señales

void timeout()

Funciones protegidas reimplementadas

virtual void timerEvent(QTimerEvent *e) override

Descripción Detallada

La clase QChronoTimer proporciona una interfaz de programación de alto nivel para temporizadores. Para usarlo, crea un QChronoTimer, ya sea pasando el intervalo al constructor, o estableciéndolo después de la construcción usando setInterval(), 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. Por ejemplo:

        auto *timer = new QChronoTimer(1s, this);
        connect(timer, &QChronoTimer::timeout, this, &MyWidget::processOneThing);
        timer->start();
        QChronoTimer *timer = new QChronoTimer(this);
        connect(timer, &QChronoTimer::timeout, this, &MyWidget::processOneThing);
        timer->setInterval(1s);
        timer->start();

Puedes configurar un temporizador para que se agote sólo una vez llamando a setSingleShot(true).

Nota: QChronoTimer no tiene métodos estáticos singleShot(), ya que los de QTimer ya funcionan con tipos de crono y resolución de nanosegundos.

En aplicaciones multihilo, puedes usar QChronoTimer en cualquier hilo que tenga un bucle de eventos. Para iniciar un bucle de eventos desde un hilo no-GUI, utilice QThread::exec(). Qt utiliza el thread affinity del temporizador para determinar qué subproceso emitirá la señal timeout(). Debido a esto, debes iniciar y detener el temporizador en su hilo; no es posible iniciar un temporizador desde otro hilo.

Como caso especial, un QChronoTimer con un tiempo de espera de 0ns expirará tan pronto como sea posible, aunque el orden entre temporizadores cero y otras fuentes de eventos no está especificado. Los temporizadores cero se pueden utilizar para hacer algo de trabajo mientras se sigue proporcionando una interfaz de usuario sensible:

        // The default interval is 0ns
        QTimer *timer = new QTimer(this);
        connect(timer, &QTimer::timeout, this, &MyWidget::processOneThing);
        timer->start();

A partir de entonces, processOneThing() será llamado repetidamente. Debería escribirse de tal manera que siempre retorne rápidamente (por ejemplo, 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 el trabajo pesado en las aplicaciones GUI, pero como el multithreading está cada vez disponible en más plataformas, una alternativa moderna es hacer el trabajo pesado en un hilo distinto del hilo (principal) de la GUI. Qt tiene la clase QThread, que puede utilizarse para conseguirlo.

Precisión y resolución del temporizador

La precisión de los temporizadores depende del sistema operativo subyacente y del hardware. La mayoría de las plataformas soportan solicitar precisión de nano-segundos para los temporizadores (por ejemplo, nanosleep de libc), aunque la precisión del temporizador no será igual a esta resolución en muchas situaciones del mundo real.

Puedes configurar timer type para indicar a QChronoTimer qué precisión debe solicitar al sistema.

Para Qt::PreciseTimer, QChronoTimer intentará mantener la precisión en 1ns. Los temporizadores precisos nunca expirarán antes de lo esperado.

Para los tipos Qt::CoarseTimer y Qt::VeryCoarseTimer, QChronoTimer puede despertar antes de lo esperado, dentro de los márgenes para esos tipos:

Todos los tipos de temporizador pueden agotarse más tarde de lo esperado 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 QChronoTimer

QChronoTimer proporciona una resolución de nanosegundos y un rango de ±292 años (menos posibilidades de desbordamiento de enteros si el intervalo es mayor que std::numeric_limits<int>::max()). Si sólo necesita una resolución de milisegundos y un intervalo de ±24 días, puede seguir utilizando la clase clásica QTimer.

Otra alternativa es reimplementar el método QObject::timerEvent() en su clase (que debe ser una subclase de QObject), y utilizar uno de los siguientes enfoques:

  • Usando QBasicTimer, una clase de valor ligero 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 hace todo lo posible para 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 admite enlaces QProperty.

Esta propiedad booleana es true si el temporizador está en marcha; en caso contrario false.

Funciones de acceso:

bool isActive() const

[bindable] interval : std::chrono::nanoseconds

Nota: Esta propiedad soporta QProperty bindings.

Esta propiedad contiene el intervalo de tiempo de espera

El valor por defecto de esta propiedad es 0ns.

Un QChronoTimer con un tiempo de espera de 0ns expirará tan pronto como todos los eventos en la cola de eventos del sistema de ventanas hayan sido procesados.

Si se ajusta el intervalo de un temporizador en ejecución, se cambiará el intervalo, stop() y luego start() el temporizador, y se 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:

std::chrono::nanoseconds interval() const
void setInterval(std::chrono::nanoseconds nsec)

Ver también singleShot.

[read-only] remainingTime : std::chrono::nanoseconds

Esta propiedad contiene el tiempo restante

Devuelve la duración restante hasta el tiempo de espera.

Si el temporizador está inactivo, la duración devuelta será negativa.

Si el temporizador está vencido, la duración devuelta será 0ns.

Funciones de acceso:

std::chrono::nanoseconds 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 sólo una vez, los temporizadores que no son de disparo único se disparan cada interval.

El valor por defecto de esta propiedad es false.

Funciones de acceso:

bool isSingleShot() const
void setSingleShot(bool singleShot)

Véase también interval.

[bindable] timerType : Qt::TimerType

Nota: Esta propiedad es compatible con 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] QChronoTimer::QChronoTimer(QObject *parent = nullptr)

Construye un temporizador con la dirección parent, utilizando el intervalo por defecto, 0ns.

[explicit] QChronoTimer::QChronoTimer(std::chrono::nanoseconds nsec, QObject *parent = nullptr)

Construye un temporizador con la dirección parent, utilizando un intervalo de nsec.

[override virtual noexcept] QChronoTimer::~QChronoTimer()

Destruye el temporizador.

template <typename Functor> QMetaObject::Connection QChronoTimer::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, con tipo de conexión connectionType, y devuelve un handle a la conexión.

Este método se proporciona por conveniencia. Es equivalente a llamar a

QObject::connect(timer, &QChronoTimer::timeout, context, slot, connectionType);

Véase también QObject::connect() y timeout().

Qt::TimerId QChronoTimer::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.

Véase también Qt::TimerId.

bool QChronoTimer::isActive() const

Devuelve true si el temporizador está en marcha; en caso contrario devuelve false.

Nota: Función Getter para la propiedad active.

[slot] void QChronoTimer::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.

[slot] void QChronoTimer::stop()

Detiene el temporizador.

Véase también start().

[private signal] void QChronoTimer::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 QChronoTimer::timerEvent(QTimerEvent *e)

Reimplementa: QObject::timerEvent(QTimerEvent *event).

© 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.