Sur cette page

QTimer Class

La classe QTimer permet de créer des minuteries répétitives et ponctuelles. En savoir plus...

En-tête : #include <QTimer>
CMake : find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake : QT += core
Hérite de : QObject

Propriétés

Fonctions publiques

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

Emplacements publics

void start(int msec)
void start()
void stop()

Signaux

void timeout()

Membres publics statiques

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)

Fonctions protégées réimplémentées

virtual void timerEvent(QTimerEvent *e) override

Description détaillée

La classe QTimer fournit une interface de programmation de haut niveau pour les minuteries. Pour l'utiliser, créez un objet QTimer, connectez son signal timeout() aux slots appropriés, puis appelez la fonction start(). À partir de ce moment, il émettra le signal timeout() à intervalles réguliers.

Exemple de minuterie d'une seconde (1 000 millisecondes) (tiré de l'exemple « Analog Clock ») :

    QTimer *timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, QOverload<>::of(&AnalogClock::update));
    timer->start(1000);

Dès lors, le slot ` update() ` est appelé toutes les secondes.

Vous pouvez configurer un minuteur pour qu’il ne se déclenche qu’une seule fois en appelant setSingleShot(true). Vous pouvez également utiliser la fonction statique QTimer::singleShot() pour appeler un slot après un intervalle spécifié :

    QTimer::singleShot(200, this, &Foo::updateCaption);

Dans les applications multithread, vous pouvez utiliser QTimer dans n’importe quel thread disposant d’une boucle d’événements. Pour démarrer une boucle d’événements à partir d’un thread non-GUI, utilisez QThread::exec(). Qt utilise la fonction ` thread affinity ` du minuteur pour déterminer quel thread émettra le signal ` timeout()`. C'est pourquoi vous devez démarrer et arrêter le minuteur dans son propre thread ; il n'est pas possible de démarrer un minuteur à partir d'un autre thread.

Dans un cas particulier, un QTimer avec un délai d’expiration de 0 expirera dès que possible, bien que l’ordre d’exécution entre les timers à délai nul et les autres sources d’événements ne soit pas spécifié. Les timers à délai nul peuvent être utilisés pour effectuer certaines tâches tout en conservant une interface utilisateur réactive :

    QTimer *timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, &Foo::processOneThing);
    timer->start();

À partir de ce moment-là, la fonction ` processOneThing() ` sera appelée à plusieurs reprises. Elle doit être écrite de manière à toujours renvoyer rapidement un résultat (généralement après le traitement d’un élément de données) afin que Qt puisse transmettre les événements à l’interface utilisateur et arrêter le minuteur dès qu’il a terminé tout son travail. Il s'agit de la méthode traditionnelle pour implémenter des tâches lourdes dans les applications GUI, mais comme le multithreading est aujourd'hui disponible sur de plus en plus de plateformes, on s'attend à ce que les objets QTimer à temps zéro soient progressivement remplacés par des objets QThread.

Précision et résolution du minuteur

La précision des temporisateurs dépend du système d'exploitation et du matériel sous-jacents. La plupart des plateformes prennent en charge une résolution de 1 milliseconde, bien que la précision du temporisateur ne corresponde pas toujours à cette résolution dans de nombreuses situations concrètes.

La précision dépend également de l’ timer type. Pour les objets de type « Qt::PreciseTimer », QTimer s’efforcera de maintenir une précision de 1 milliseconde. Les temporisateurs « Precise » n’expireront jamais plus tôt que prévu.

Pour les types Qt::CoarseTimer et Qt::VeryCoarseTimer, QTimer peut se réveiller plus tôt que prévu, dans les limites fixées pour ces types : 5 % de l’intervalle pour Qt::CoarseTimer et 500 ms pour Qt::VeryCoarseTimer.

Tous les types de minuteurs peuvent expirer plus tard que prévu si le système est occupé ou incapable de fournir la précision requise. Dans un tel cas de dépassement du délai d'expiration, Qt émettra timeout() une seule fois, même si plusieurs délais d'expiration ont expiré, puis reprendra l'intervalle d'origine.

Alternatives à QTimer

Qt 6.8 a introduit QChronoTimer. La principale différence entre les deux classes réside dans le fait que QChronoTimer prend en charge une plage d’intervalles plus large et une précision supérieure (std::chrono::nanoseconds). Pour QTimer, l’intervalle maximal pris en charge est de ±24 jours, tandis que pour QChronoTimer, il est de ±292 ans (moins de risques de débordement d’entier avec des intervalles supérieurs à std::numeric_limits<int>::max()). Si vous n'avez besoin que d'une résolution en millisecondes et d'une plage de ±24 jours, vous pouvez continuer à utiliser QTimer.

Une autre alternative consiste à réimplémenter la méthode QObject::timerEvent() dans votre classe (qui doit être une sous-classe de QObject), et à utiliser l’une des approches suivantes :

  • Utiliser ` QBasicTimer`, une classe de valeur légère encapsulant un identifiant de minuteur. Vous pouvez démarrer le minuteur avec ` QBasicTimer::start()` et l’arrêter avec ` QBasicTimer::stop()`. Vous pouvez gérer l’événement dans votre méthode ` timerEvent()` réimplémentée.
  • timerEventUne méthode plus basique consiste à manipuler directement les identifiants de minuteur. Pour démarrer le minuteur, appelez ` QObject::startTimer()`, en enregistrant l’identifiant renvoyé. Pour l’arrêter, appelez ` QObject::killTimer()`. Vous pouvez gérer l’événement dans votre méthode ` QBasicTimer()` réimplémentée. Cette approche est généralement plus fastidieuse que l’utilisation de ` `.

L'utilisation de ` timerEvent()` présente l'inconvénient de ne pas prendre en charge certaines fonctionnalités de haut niveau, telles que les minuteries à déclenchement unique et les signaux.

Certains systèmes d’exploitation limitent le nombre de temporisateurs pouvant être utilisés ; Qt tente de contourner ces limitations.

Voir également QBasicTimer, QTimerEvent, QObject::timerEvent(), Temporisateurs et Horloge analogique.

Documentation sur les propriétés

[bindable read-only] active : bool

Remarque : cette propriété prend en charge les liaisons de type « QProperty ».

Cette propriété booléenne prend la valeur « true » si le minuteur est en cours ; sinon, elle prend la valeur «false».

Fonctions d'accès :

bool isActive() const

[bindable] interval : int

Remarque : cette propriété prend en charge les liaisons de type « QProperty ».

Cette propriété définit l'intervalle de délai d'expiration en millisecondes

La valeur par défaut de cette propriété est 0. Un « QTimer » dont le délai d'expiration est de 0 expirera dès que tous les événements de la file d'attente du système de fenêtrage auront été traités.

Remarque : le fait de maintenir la boucle d’événements occupée avec un minuteur à intervalle nul entraînera inévitablement des problèmes et un comportement très erratique de l’interface utilisateur.

La modification de l'intervalle d'un minuteur en cours d'exécution modifie l'intervalle, appelle ` stop()` puis ` start()` sur le minuteur, et obtient une nouvelle ` id()`. Si le minuteur n'est pas en cours d'exécution, seul l'intervalle est modifié.

À partir de Qt 6.10, la définition d’un intervalle négatif entraînera un avertissement d’exécution et la valeur sera réinitialisée à 1 ms. Avant Qt 6.10, un Qt Timer vous permettait de définir un intervalle négatif, mais se comportait de manière imprévisible (par exemple, il pouvait arrêter le minuteur s'il était en cours d'exécution ou ne pas le démarrer du tout).

Fonctions d'accès :

int interval() const
void setInterval(int msec)
void setInterval(std::chrono::milliseconds value)

Voir également singleShot.

[read-only] remainingTime : int

Cette propriété contient le temps restant en millisecondes

Renvoie la durée restante du minuteur, en millisecondes, jusqu'à l'expiration du délai. Si le minuteur est inactif, la valeur renvoyée est -1. Si le minuteur a expiré, la valeur renvoyée est 0.

Fonctions d'accès :

int remainingTime() const

Voir également interval.

[bindable] singleShot : bool

Remarque : cette propriété prend en charge les liaisons de type « QProperty ».

Cette propriété indique si le minuteur est un minuteur à déclenchement unique

Un minuteur à déclenchement unique ne se déclenche qu'une seule fois, tandis que les minuteurs non à déclenchement unique se déclenchent toutes les interval millisecondes.

La valeur par défaut de cette propriété est false.

Fonctions d'accès :

bool isSingleShot() const
void setSingleShot(bool singleShot)

Voir également interval et singleShot().

[bindable] timerType : Qt::TimerType

Remarque : cette propriété prend en charge les liaisons de type « QProperty ».

détermine la précision du minuteur

La valeur par défaut de cette propriété est Qt::CoarseTimer.

Fonctions d'accès :

Qt::TimerType timerType() const
void setTimerType(Qt::TimerType atype)

Voir également Qt::TimerType.

Documentation des fonctions membres

[explicit] QTimer::QTimer(QObject *parent = nullptr)

Crée un minuteur avec l'parent on fournie.

[virtual noexcept] QTimer::~QTimer()

Supprime le minuteur.

template <typename Functor> QMetaObject::Connection QTimer::callOnTimeout(Functor &&slot)

Crée une connexion entre le signal ` timeout()` du temporisateur et ` slot`. Renvoie un descripteur de connexion.

Cette méthode est fournie à titre de commodité. Elle équivaut à l'appel suivant :

QObject::connect(timer, &QTimer::timeout, timer, slot, Qt::DirectConnection);

Remarque : cette surcharge n'est pas disponible lorsque QT_NO_CONTEXTLESS_CONNECT est défini ; utilisez à la place la surcharge callOnTimeout() qui prend un objet de contexte.

Voir également QObject::connect() et timeout().

template <typename Functor> QMetaObject::Connection QTimer::callOnTimeout(const QObject *context, Functor &&slot, Qt::ConnectionType connectionType = Qt::AutoConnection)

Crée une connexion entre le signal ` timeout()` et ` slot ` afin de l'intégrer dans une boucle d'événements spécifique de ` context`, puis renvoie un descripteur vers cette connexion.

Cette méthode est fournie à des fins de commodité. Elle équivaut à appeler :

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

Cette fonction surcharge QTimer::callOnTimeout().

Voir également QObject::connect() et timeout().

[since 6.8] Qt::TimerId QTimer::id() const

Renvoie un objet ` Qt::TimerId ` représentant l'identifiant du minuteur si celui-ci est en cours d'exécution ; sinon, renvoie ` Qt::TimerId::Invalid`.

Cette fonction a été introduite dans Qt 6.8.

Voir également Qt::TimerId.

std::chrono::milliseconds QTimer::intervalAsDuration() const

Renvoie l'intervalle de ce minuteur sous la forme d'un objet ` std::chrono::milliseconds `.

Voir aussi interval.

bool QTimer::isActive() const

Renvoie « true » si le minuteur est en cours d'exécution ; sinon, renvoie « false ».

Remarque : fonctiongetter pour la propriété active.

std::chrono::milliseconds QTimer::remainingTimeAsDuration() const

Renvoie le temps restant dans cet objet « timer » sous la forme d’un objet « std::chrono::milliseconds ». Si ce « timer » est arrivé à échéance ou en retard, la valeur renvoyée est « std::chrono::milliseconds::zero() ». Si le temps restant n’a pas pu être déterminé ou si le « timer » n’est pas en cours d’exécution, cette fonction renvoie une durée négative.

Voir également remainingTime().

[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)

[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)

Cette fonction statique appelle functor après interval.

Cette fonction est très pratique, car elle vous évite d’avoir à vous soucier d’un objet ` timerEvent ` ou à créer un objet ` QTimer ` local.

Si context est spécifié, alors functor ne sera appelé que si l'objet context n'a pas été détruit avant que l'intervalle ne se produise. Le foncteur sera alors exécuté sur le thread de context. Le thread du contexte doit disposer d'une boucle d'événements Qt en cours d'exécution.

Si functor est une fonction membre de context, alors la fonction sera appelée sur l’objet.

Le paramètre ` interval ` peut être de type ` int ` (interprété comme un nombre de millisecondes) ou de type ` std::chrono `, qui est implicitement converti en nanosecondes.

À partir de Qt 6.10, la définition d’un intervalle négatif entraînera un avertissement d’exécution et la valeur sera réinitialisée à 1 ms. Avant Qt 6.10, un Timer Qt vous permettait de définir un intervalle négatif, mais se comportait de manière imprévisible (par exemple, il pouvait arrêter le minuteur s’il était en cours d’exécution ou ne pas le démarrer du tout).

Remarque : dans les versions de Qt antérieures à la version 6.8, les surcharges de chrono prenaient en paramètre chrono::milliseconds, et non chrono::nanoseconds. Le compilateur effectuera automatiquement la conversion pour vous, mais celle-ci peut entraîner un débordement pour des nombres de millisecondes extrêmement élevés.

Remarque : cette fonction est réentrante.

Voir également ` start()`.

[static] void QTimer::singleShot(std::chrono::nanoseconds nsec, const QObject *receiver, const char *member)

Cette fonction statique appelle un slot au bout d’un intervalle de temps donné.

Cette fonction est très pratique, car elle vous évite d’avoir à vous soucier d’un « timerEvent » ou de créer un objet « local QTimer ».

L'receiver est l'objet récepteur et l'member est le slot. L'intervalle de temps est spécifié dans l'objet de durée nsec.

À partir de Qt 6.10, la définition d’un intervalle négatif entraîne un avertissement d’exécution et la valeur est réinitialisée à 1 ms. Avant Qt 6.10, un Qt Timer vous permettait de définir un intervalle négatif, mais se comportait de manière imprévisible (par exemple, il pouvait arrêter le minuteur s'il était en cours d'exécution ou ne pas le démarrer du tout).

Remarque : dans les versions de Qt antérieures à la 6.8, cette fonction prenait en paramètre des chrono::milliseconds, et non des chrono::nanoseconds. Le compilateur effectue automatiquement la conversion, mais celle-ci peut entraîner un débordement pour des nombres de millisecondes extrêmement élevés.

Il s’agit d’une fonction surchargée.

Remarque : cette fonction est réentrante.

Voir également ` start()`.

[static] void QTimer::singleShot(std::chrono::nanoseconds nsec, Qt::TimerType timerType, const QObject *receiver, const char *member)

Cette fonction statique appelle un slot au bout d'un intervalle de temps donné.

Cette fonction est très pratique, car elle vous évite d’avoir à vous soucier d’un « timerEvent » ou de créer un objet « local QTimer ».

L'receiver est l'objet récepteur et l'member est le slot. L'intervalle de temps est spécifié dans l'objet de durée nsec. L'timerType e influe sur la précision du minuteur.

À partir de Qt 6.10, la définition d’un intervalle négatif entraîne un avertissement d’exécution et la valeur est réinitialisée à 1 ms. Avant Qt 6.10, un Qt Timer vous permettait de définir un intervalle négatif, mais se comportait de manière imprévisible (par exemple, il pouvait arrêter le chronomètre s’il était en cours d’exécution ou ne pas le démarrer du tout).

Remarque : dans les versions de Qt antérieures à la version 6.8, cette fonction prenait en paramètre des chrono::milliseconds, et non des chrono::nanoseconds. Le compilateur effectuera automatiquement la conversion, mais celle-ci peut entraîner un débordement pour des nombres de millisecondes extrêmement élevés.

Il s’agit d’une fonction surchargée.

Remarque : cette fonction est réentrante.

Voir également ` start()`.

[slot] void QTimer::start(int msec)

Lance ou relance le chronomètre avec un délai d'expiration de msec millisecondes.

Cela équivaut à :

timer.setInterval(msec);
timer.start();

Si le minuteur est déjà en cours, il sera réinitialisé à stopped et redémarré. Cela modifiera également sa valeur « id » ().

Si singleShot est vrai, le minuteur ne sera activé qu’une seule fois.

À partir de Qt 6.10, la définition d'un intervalle négatif entraînera un avertissement d'exécution et la valeur sera réinitialisée à 1 ms. Avant Qt 6.10, un Qt Timer vous permettait de définir un intervalle négatif, mais se comportait de manière imprévisible (par exemple, il pouvait arrêter le minuteur s’il était en cours d’exécution ou ne pas le démarrer du tout).

Remarque : le fait de maintenir la boucle d’événements occupée avec un timer à intervalle nul est susceptible de causer des problèmes et un comportement très erratique de l’interface utilisateur.

Remarque : ce slot est surchargé. Pour vous connecter à ce slot :

// 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); });
Pour plus d’exemples et d’approches, consultez la section « Connexion à des slots surchargés ».

[slot] void QTimer::start()

Lance ou relance le chronomètre avec le délai d'expiration spécifié dans ` interval`.

Si le minuteur est déjà en cours d'exécution, il sera désactivé ( stopped ) puis redémarré. Cela modifiera également sa propriété « id » ().

Si singleShot est vrai, le minuteur ne sera activé qu’une seule fois.

Remarque : maintenir la boucle d’événements occupée avec un minuteur à durée nulle entraînera inévitablement des problèmes et un comportement très erratique de l’interface utilisateur.

Remarque : ce slot est surchargé. Pour vous connecter à ce slot :

// 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(); });
Pour plus d’exemples et d’approches, consultez la section « Connexion à des slots surchargés ».

void QTimer::start(std::chrono::milliseconds interval)

Lance ou relance le chronomètre avec un délai d'expiration de interval millisecondes.

Cela revient à :

timer.setInterval(interval);
timer.start();

Si le minuteur est déjà en cours, il sera désactivé ( stopped ) puis relancé. Cela modifiera également sa valeur « id » ().

Si singleShot est vrai, le minuteur ne sera activé qu’une seule fois.

À partir de Qt 6.10, la définition d’un intervalle négatif entraînera un avertissement d’exécution et la valeur sera réinitialisée à 1 ms. Avant Qt 6.10, un Qt Timer vous permettait de définir un intervalle négatif, mais se comportait de manière imprévisible (par exemple, il s'arrêtait s'il était en cours d'exécution ou ne démarrait tout simplement pas).

Remarque : le fait de maintenir la boucle d’événements occupée avec un minuteur à intervalle nul est susceptible de causer des problèmes et un comportement très erratique de l’interface utilisateur.

Il s’agit d’une fonction surchargée.

[slot] void QTimer::stop()

Arrête le chronomètre.

Voir aussi start().

[private signal] void QTimer::timeout()

Ce signal est émis lorsque le délai de la minuterie est écoulé.

Remarque : il s'agit d'un signal privé. Il peut être utilisé dans les connexions de signaux, mais ne peut pas être émis par l'utilisateur.

Voir également interval, start() et stop().

[override virtual protected] void QTimer::timerEvent(QTimerEvent *e)

Réimplémente : QObject::timerEvent(QTimerEvent *event).

int QTimer::timerId() const

Renvoie l'identifiant du minuteur s'il est en cours d'exécution ; sinon, renvoie -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.