Sur cette page

QTimer Class

La classe QTimer fournit des minuteries répétitives et à coup unique. Plus d'informations...

En-tête : #include <QTimer>
CMake : find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake : QT += core
Héritages : 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 temporisateurs. Pour l'utiliser, créez un QTimer, connectez son signal timeout() aux emplacements appropriés et appelez start(). À partir de ce moment, il émettra le signal timeout() à intervalles constants.

Exemple d'un timer d'une seconde (1000 millisecondes) (tiré de l'exemple de l'horloge analogique ) :

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

À partir de ce moment, le slot update() est appelé toutes les secondes.

Vous pouvez configurer un timer pour qu'il ne s'arrête 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 qui possède une boucle d'événements. Pour démarrer une boucle d'événements à partir d'un thread non-GUI, utilisez QThread::exec(). Qt utilise le thread affinity de la minuterie pour déterminer quel thread émettra le signal timeout(). Pour cette raison, vous devez démarrer et arrêter la minuterie dans son fil d'exécution ; il n'est pas possible de démarrer une minuterie à partir d'un autre fil d'exécution.

Dans un cas particulier, un QTimer avec un timeout de 0 se termine le plus tôt possible, bien que l'ordre entre les timers zéro et les autres sources d'événements ne soit pas spécifié. Les temporisateurs zéro peuvent être utilisés pour effectuer un certain travail tout en fournissant une interface utilisateur rapide :

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

À partir de ce moment, processOneThing() sera appelé à plusieurs reprises. Il doit être écrit de telle sorte qu'il retourne toujours rapidement (typiquement après avoir traité un élément de données) afin que Qt Quick puisse fournir des événements à l'interface utilisateur et arrêter le minuteur dès qu'il a fait tout son travail. C'est la façon traditionnelle de mettre en œuvre des travaux lourds dans les applications GUI, mais comme le multithreading devient aujourd'hui disponible sur de plus en plus de plates-formes, nous nous attendons à ce que les objets QTimer de zéro milliseconde soient progressivement remplacés par des objets QThreads.

Précision et résolution de la minuterie

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

La précision dépend également de timer type. Pour Qt::PreciseTimer, QTimer essaiera de maintenir la précision à 1 milliseconde. Les minuteries précises ne s'arrêteront 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 marges prévues pour ces types : 5 % de l'intervalle pour Qt::CoarseTimer et 500 ms pour Qt::VeryCoarseTimer.

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

Alternatives à QTimer

Qt 6.8 a introduit QChronoTimer. La principale différence entre les deux classes est que QChronoTimer prend en charge une plus grande plage d'intervalles et une plus grande précision (std::chrono::nanoseconds). Pour QTimer, l'intervalle maximal pris en charge est de ±24 jours, alors que pour QChronoTimer, il est de ±292 ans (moins de risques de débordement de l'index avec des intervalles plus longs que std::numeric_limits<int>::max()). Si vous n'avez besoin que d'une résolution de l'ordre de la milliseconde et d'un intervalle de ±24 jours, vous pouvez continuer à utiliser QTimer.

Une autre solution 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 :

  • Utilisation de QBasicTimer, une classe de valeur légère contenant un ID de minuterie. Vous pouvez démarrer la minuterie avec QBasicTimer::start() et l'arrêter avec QBasicTimer::stop(). Vous pouvez gérer l'événement dans votre version réimplémentée de timerEvent().
  • Une méthode de plus bas niveau consiste à manipuler directement les ID de la minuterie. Pour démarrer la minuterie, appelez QObject::startTimer(), en stockant l'ID renvoyée. Pour arrêter la minuterie, appelez QObject::killTimer(). Vous pouvez gérer l'événement dans votre version réimplémentée de timerEvent(). Cette approche est généralement plus lourde que l'utilisation de QBasicTimer.

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 et les signaux à action unique.

Certains systèmes d'exploitation limitent le nombre de temporisateurs qui peuvent être utilisés ; Qt essaie de contourner ces limitations.

Voir aussi QBasicTimer, QTimerEvent, QObject::timerEvent(), Timers, et Analog Clock.

Documentation sur les propriétés

[bindable read-only] active : bool

Remarque : Cette propriété prend en charge les liaisons QProperty.

Cette propriété booléenne est true si la minuterie est en cours d'exécution, sinon false.

Fonctions d'accès :

bool isActive() const

[bindable] interval : int

Remarque : Cette propriété prend en charge les liaisons QProperty.

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

La valeur par défaut de cette propriété est 0. Un site QTimer avec un intervalle de temporisation de 0 se terminera dès que tous les événements de la file d'attente des événements du système de fenêtres auront été traités.

Remarque : le fait de maintenir la boucle d'événements occupée avec une temporisation de zéro ne peut qu'entraîner des problèmes et un comportement très erratique de l'interface utilisateur.

Le réglage de l'intervalle d'une minuterie en cours d'exécution modifiera l'intervalle, stop() puis start() la minuterie, et acquerra une nouvelle id(). Si la minuterie 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 réinitialisation de la valeur à 1ms. Avant Qt 6.10, une minuterie Qt vous permettait de définir un intervalle négatif mais se comportait de manière surprenante (par exemple en arrêtant la minuterie si elle était en cours d'exécution ou en ne la démarrant pas du tout).

Fonctions d'accès :

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

Voir aussi singleShot.

[read-only] remainingTime : int

Cette propriété contient le temps restant en millisecondes

Renvoie la valeur restante de la minuterie en millisecondes jusqu'à la fin du délai. Si la minuterie est inactive, la valeur renvoyée sera -1. Si la minuterie est en retard, la valeur renvoyée sera 0.

Fonctions d'accès :

int remainingTime() const

Voir également interval.

[bindable] singleShot : bool

Remarque : Cette propriété prend en charge les liaisons QProperty.

Cette propriété indique si la minuterie est une minuterie à déclenchement unique

Une minuterie à action unique ne se déclenche qu'une seule fois, tandis que les minuteries à action non 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

Note : Cette propriété supporte les liens QProperty.

contrôle la précision de la minuterie

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 aussi Qt::TimerType.

Documentation sur les fonctions membres

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

Construit un timer avec l'adresse parent.

[virtual noexcept] QTimer::~QTimer()

Détruit la minuterie.

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

Crée une connexion entre le signal timeout() de la minuterie et slot. Elle renvoie un identifiant pour la connexion.

Cette méthode est fournie pour des raisons de commodité. Elle est équivalente à un appel :

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 plutôt la surcharge callOnTimeout() qui prend un objet contextuel.

Voir aussi 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 à partir du signal timeout() vers slot pour être placée dans une boucle d'événements spécifique de context, et renvoie une poignée vers la connexion.

Cette méthode est fournie pour des raisons de commodité. Elle est équivalente à l'appel :

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

Cette fonction surcharge QTimer::callOnTimeout().

Voir aussi QObject::connect() et timeout().

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

Retourne un Qt::TimerId représentant l'ID de la minuterie si la minuterie est en cours d'exécution ; sinon, retourne Qt::TimerId::Invalid.

Cette fonction a été introduite dans Qt 6.8.

Voir aussi Qt::TimerId.

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

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

Voir aussi interval.

bool QTimer::isActive() const

Renvoie true si la minuterie est en cours ; sinon, renvoie false.

Note : Fonction Getter 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 échu ou en retard, la valeur renvoyée est std::chrono::milliseconds::zero(). Si le temps restant n'a pas pu être trouvé 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, 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)

Cette fonction statique appelle functor après interval.

Il est très pratique d'utiliser cette fonction car il n'est pas nécessaire de s'occuper de timerEvent ou de créer un objet local QTimer.

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é dans le thread de context. Le thread du contexte doit avoir une boucle d'événements en cours d'exécution.

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

Le paramètre interval peut être un int (interprété comme un compte en millisecondes) ou un type std::chrono qui convertit implicitement en nanosecondes.

À partir de Qt 6.10, la définition d'un intervalle négatif entraînera un avertissement à l'exécution et la réinitialisation de la valeur à 1ms. Avant Qt 6.10, un Qt Timer vous permettait de définir un intervalle négatif mais se comportait de manière surprenante (par exemple en arrêtant le timer s'il était en cours d'exécution ou en ne le démarrant pas du tout).

Note : Dans les versions de Qt antérieures à la 6.8, les surcharges chrono prenaient chrono::millisecondes, et non chrono::nanosecondes. Le compilateur convertira automatiquement pour vous, mais la conversion peut déborder pour des nombres de millisecondes extrêmement importants.

Note : Cette fonction est réentrante.

Voir aussi start().

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

Cette fonction statique appelle un slot après un intervalle de temps donné.

Il est très pratique d'utiliser cette fonction car il n'est pas nécessaire de s'embarrasser d'un timerEvent ou de créer un objet local QTimer.

L'objet receiver est l'objet récepteur et l'objet member est le slot. L'intervalle de temps est indiqué dans l'objet duration nsec.

À partir de Qt 6.10, la définition d'un intervalle négatif entraînera un avertissement lors de l'exécution et la réinitialisation de la valeur à 1ms. Avant Qt 6.10, un Qt Timer vous permettait de définir un intervalle négatif mais se comportait de manière surprenante (par exemple en arrêtant le timer s'il était en cours d'exécution ou en ne le démarrant pas du tout).

Note : Dans les versions de Qt antérieures à la 6.8, cette fonction prenait chrono::millisecondes, et non chrono::nanosecondes. Le compilateur convertit automatiquement pour vous, mais la conversion peut déborder pour des nombres de millisecondes extrêmement importants.

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

Note : Cette fonction est réentrante.

Voir aussi start().

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

Cette fonction statique appelle un slot après un intervalle de temps donné.

Il est très pratique d'utiliser cette fonction car il n'est pas nécessaire de s'embarrasser d'un timerEvent ou de créer un objet local QTimer.

L'objet receiver est l'objet récepteur et l'objet member est le slot. L'intervalle de temps est indiqué dans l'objet duration nsec. L'objet timerType affecte la précision de la minuterie.

À partir de Qt 6.10, la définition d'un intervalle négatif entraînera un avertissement lors de l'exécution et la réinitialisation de la valeur à 1 ms. Avant Qt 6.10, une minuterie Qt vous permettait de définir un intervalle négatif mais se comportait de manière surprenante (par exemple en arrêtant la minuterie si elle était en cours d'exécution ou en ne la démarrant pas du tout).

Note : Dans les versions de Qt antérieures à la 6.8, cette fonction prenait chrono::millisecondes, et non chrono::nanosecondes. Le compilateur convertit automatiquement pour vous, mais la conversion peut déborder pour des nombres de millisecondes extrêmement importants.

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

Note : Cette fonction est réentrante.

Voir aussi start().

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

Démarre ou redémarre la minuterie avec un intervalle de temps de msec millisecondes.

Cela équivaut à :

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

Si la minuterie est déjà en cours d'exécution, elle sera stopped et redémarrée. Cela modifiera également sa valeur id().

Si singleShot est vrai, la minuterie ne sera activée qu'une seule fois.

À partir de Qt 6.10, la définition d'un intervalle négatif entraînera un avertissement lors de l'exécution et la réinitialisation de la valeur à 1ms. Avant Qt 6.10, un Qt Timer vous permettait de définir un intervalle négatif mais se comportait de manière surprenante (par exemple en arrêtant le timer s'il était en cours d'exécution ou en ne le démarrant pas du tout).

Note : Garder la boucle d'événement occupée avec une minuterie zéro est voué à causer des problèmes et un comportement très erratique de l'interface utilisateur.

Note : Ce slot est surchargé. Pour se 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, voir se connecter à des slots surchargés.

[slot] void QTimer::start()

Démarre ou redémarre la minuterie avec le délai spécifié dans interval.

Si la minuterie est déjà en cours d'exécution, elle sera stopped et redémarrée. Cela modifiera également son id().

Si singleShot est vrai, la minuterie ne sera activée qu'une seule fois.

Remarque : Le fait d'occuper la boucle d'événements avec une minuterie zéro ne peut qu'entraîner des problèmes et un comportement très erratique de l'interface utilisateur.

Note : Ce slot est surchargé. Pour se 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, voir se connecter à des slots surchargés.

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

Démarre ou redémarre la minuterie avec un délai d'attente d'une durée de interval millisecondes.

Cela équivaut à :

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

Si la minuterie est déjà en cours d'exécution, elle sera stopped et redémarrée. Cela modifiera également son id().

Si singleShot est vrai, la minuterie ne sera activée qu'une seule fois.

À partir de Qt 6.10, la définition d'un intervalle négatif entraînera un avertissement lors de l'exécution et la réinitialisation de la valeur à 1ms. Avant Qt 6.10, un Qt Timer vous permettait de définir un intervalle négatif mais se comportait de manière surprenante (par exemple en arrêtant le timer s'il était en cours d'exécution ou en ne le démarrant pas du tout).

Note : Garder la boucle d'événements occupée avec une minuterie zéro est voué à 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 la minuterie.

Voir également start().

[private signal] void QTimer::timeout()

Ce signal est émis lorsque la minuterie s'arrête.

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 aussi 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'ID du timer si le timer 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.