Auf dieser Seite

QTimer Class

Die Klasse „QTimer“ bietet Timer für wiederkehrende Ereignisse und einmalige Ereignisse. Mehr...

Header: #include <QTimer>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Erbt von: QObject

Eigenschaften

Öffentliche Funktionen

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

Öffentliche Slots

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

Signale

void timeout()

Statische öffentliche Mitglieder

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)

Neu implementierte geschützte Funktionen

virtual void timerEvent(QTimerEvent *e) override

Ausführliche Beschreibung

Die Klasse `QTimer` bietet eine hochrangige Programmierschnittstelle für Timer. Um sie zu verwenden, erstellen Sie einen `QTimer`, verbinden Sie dessen Signal ` timeout()` mit den entsprechenden Slots und rufen Sie ` start()` auf. Von da an sendet er in konstanten Intervallen das Signal ` timeout()`.

Beispiel für einen Timer mit einer Sekunde (1000 Millisekunden) (aus dem Beispiel „Analog Clock“ ):

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

Von da an wird der Slot „ update() “ jede Sekunde aufgerufen.

Sie können einen Timer so einstellen, dass er nur einmal abläuft, indem Sie ` setSingleShot(true)` aufrufen. Sie können auch die statische Funktion ` QTimer::singleShot()` verwenden, um einen Slot nach einem bestimmten Intervall aufzurufen:

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

In Multithread-Anwendungen können Sie `QTimer` in jedem Thread verwenden, der über eine Ereignisschleife verfügt. Um eine Ereignisschleife von einem Nicht-GUI-Thread aus zu starten, verwenden Sie ` QThread::exec()`. Qt verwendet die Funktion ` thread affinity ` des Timers, um zu bestimmen, welcher Thread das Signal ` timeout()` aussendet. Aus diesem Grund müssen Sie den Timer in seinem eigenen Thread starten und stoppen; es ist nicht möglich, einen Timer von einem anderen Thread aus zu starten.

Als Sonderfall läuft ein QTimer mit einer Timeout-Zeit von 0 so schnell wie möglich ab, wobei die Reihenfolge zwischen Zero-Timern und anderen Ereignisquellen nicht spezifiziert ist. Zero-Timer können verwendet werden, um bestimmte Aufgaben auszuführen und gleichzeitig eine reaktionsschnelle Benutzeroberfläche zu gewährleisten:

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

Von diesem Zeitpunkt an wird „ processOneThing() “ wiederholt aufgerufen. Die Funktion sollte so geschrieben sein, dass sie stets schnell zurückkehrt (typischerweise nach der Verarbeitung eines Datenelements), damit Qt Ereignisse an die Benutzeroberfläche übermitteln und den Timer stoppen kann, sobald er seine gesamte Arbeit erledigt hat. Dies ist die traditionelle Methode zur Implementierung rechenintensiver Aufgaben in GUI-Anwendungen, doch da Multithreading heutzutage auf immer mehr Plattformen verfügbar ist, gehen wir davon aus, dass „Zero-Millisecond“-QTimer-Objekte nach und nach durch „ QThread“ ersetzt werden.

Genauigkeit und Timer-Auflösung

Die Genauigkeit von Timern hängt vom zugrunde liegenden Betriebssystem und der Hardware ab. Die meisten Plattformen unterstützen eine Auflösung von 1 Millisekunde, obwohl die Genauigkeit des Timers in vielen praktischen Situationen nicht dieser Auflösung entspricht.

Die Genauigkeit hängt auch von der „ timer type “ ab. Bei „ Qt::PreciseTimer “ versucht QTimer, die Genauigkeit auf 1 Millisekunde zu halten. Präzise Timer laufen zudem niemals früher als erwartet ab.

Bei den Typen „ Qt::CoarseTimer “ und „ Qt::VeryCoarseTimer “ kann QTimer innerhalb der für diese Typen geltenden Toleranzen früher als erwartet aktiv werden: 5 % des Intervalls bei „ Qt::CoarseTimer “ und 500 ms bei „ Qt::VeryCoarseTimer “.

Alle Timer-Typen können später als erwartet ablaufen, wenn das System ausgelastet ist oder die geforderte Genauigkeit nicht gewährleisten kann. In einem solchen Fall einer Zeitüberschreitung löst Qt „ timeout()“ nur einmal aus, selbst wenn mehrere Zeitlimits abgelaufen sind, und setzt dann das ursprüngliche Intervall fort.

Alternativen zu QTimer

Mit Qt 6.8 wurde ` QChronoTimer` eingeführt. Der Hauptunterschied zwischen den beiden Klassen besteht darin, dass ` QChronoTimer ` einen größeren Intervallbereich und eine höhere Genauigkeit unterstützt (std::chrono::nanoseconds). Bei `QTimer` beträgt das maximal unterstützte Intervall ±24 Tage, während es bei ` QChronoTimer ` ±292 Jahre beträgt (geringere Wahrscheinlichkeit eines Ganzzahlüberlaufs bei Intervallen, die länger als std::numeric_limits<int>::max() sind). Wenn Sie lediglich eine Auflösung im Millisekundenbereich und einen Bereich von ±24 Tagen benötigen, können Sie weiterhin QTimer verwenden.

Eine weitere Alternative besteht darin, die Methode ` QObject::timerEvent()` in Ihrer Klasse neu zu implementieren (die eine Unterklasse von ` QObject` sein muss) und einen der folgenden Ansätze zu verwenden:

  • Verwenden Sie ` QBasicTimer`, eine schlanke Wertklasse, die eine Timer-ID umschließt. Sie können den Timer mit ` QBasicTimer::start()` starten und mit ` QBasicTimer::stop()` stoppen. Das Ereignis können Sie in Ihrer neu implementierten Methode ` timerEvent()` verarbeiten.
  • Eine eher low-level-orientierte Methode besteht darin, die Timer-IDs direkt zu bearbeiten. Um den Timer zu starten, rufen Sie ` QObject::startTimer()` auf und speichern Sie die zurückgegebene ID. Um den Timer zu stoppen, rufen Sie ` QObject::killTimer()` auf. Sie können das Ereignis in Ihrer neu implementierten Methode ` timerEvent()` verarbeiten. Dieser Ansatz ist in der Regel aufwändiger als die Verwendung von ` QBasicTimer`.

Ein Nachteil der Verwendung von ` timerEvent()` ist, dass einige hochrangige Funktionen, wie z. B. Einmal-Timer und Signale, nicht unterstützt werden.

Einige Betriebssysteme begrenzen die Anzahl der Timer, die verwendet werden dürfen; Qt versucht, diese Einschränkungen zu umgehen.

Siehe auch QBasicTimer, QTimerEvent, QObject::timerEvent(), Timer und Analoguhr.

Dokumentation zu den Eigenschaften

[bindable read-only] active : bool

Hinweis: Diese Eigenschaft unterstützt „ QProperty “-Bindungen.

Diese boolesche Eigenschaft ist „ true “, wenn der Timer läuft; andernfalls „false“.

Zugriffsfunktionen:

bool isActive() const

[bindable] interval : int

Hinweis: Diese Eigenschaft unterstützt „ QProperty “-Bindungen.

Diese Eigenschaft gibt das Zeitlimit in Millisekunden an

Der Standardwert für diese Eigenschaft ist 0. Ein „ QTimer “ mit einem Zeitlimit von 0 läuft ab, sobald alle Ereignisse in der Ereigniswarteschlange des Fenstersystems verarbeitet wurden.

Hinweis: Die Event-Loop mit einem Timer mit dem Wert 0zu belasten , führt unweigerlich zu Problemen und einem äußerst unvorhersehbaren Verhalten der Benutzeroberfläche.

Das Festlegen des Intervalls eines laufenden Timers ändert das Intervall, ruft „ stop()“ und anschließend „ start()“ für den Timer auf und liefert ein neues „ id()“. Läuft der Timer nicht, wird nur das Intervall geändert.

Ab Qt 6.10 führt die Festlegung eines negativen Intervalls zu einer Laufzeitwarnung und der Wert wird auf 1 ms zurückgesetzt. Vor Qt 6.10 konnte man bei einem Qt-Timer zwar ein negatives Intervall festlegen, dieser verhielt sich jedoch auf unerwartete Weise (z. B. wurde der Timer angehalten, wenn er bereits lief, oder gar nicht erst gestartet).

Zugriffsfunktionen:

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

Siehe auch singleShot.

[read-only] remainingTime : int

Diese Eigenschaft enthält die verbleibende Zeit in Millisekunden

Gibt den verbleibenden Wert des Timers in Millisekunden bis zum Ablauf der Zeitbegrenzung zurück. Ist der Timer inaktiv, beträgt der zurückgegebene Wert -1. Ist der Timer abgelaufen, beträgt der zurückgegebene Wert 0.

Zugriffsfunktionen:

int remainingTime() const

Siehe auch „ interval “.

[bindable] singleShot : bool

Hinweis: Diese Eigenschaft unterstützt „ QProperty “-Bindungen.

Diese Eigenschaft gibt an, ob es sich bei dem Timer um einen Einmal-Timer handelt

Ein Einmal-Timer wird nur einmal ausgelöst, während Nicht-Einmal-Timer alle interval Millisekunden ausgelöst werden.

Der Standardwert für diese Eigenschaft ist ` false`.

Zugriffsfunktionen:

bool isSingleShot() const
void setSingleShot(bool singleShot)

Siehe auch „ interval “ und „ singleShot()“.

[bindable] timerType : Qt::TimerType

Hinweis: Diese Eigenschaft unterstützt „ QProperty “-Bindungen.

Steuert die Genauigkeit des Timers

Der Standardwert für diese Eigenschaft ist „ Qt::CoarseTimer “.

Zugriffsfunktionen:

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

Siehe auch „ Qt::TimerType “.

Dokumentation zu den Member-Funktionen

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

Erstellt einen Timer mit der angegebenen „ parent “.

[virtual noexcept] QTimer::~QTimer()

Löscht den Timer.

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

Stellt eine Verbindung vom Signal „ timeout()“ des Timers zu „ slot “ her. Gibt ein Handle für die Verbindung zurück.

Diese Methode dient der Vereinfachung. Sie entspricht dem Aufruf von:

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

Hinweis: Diese Überladung ist nicht verfügbar, wenn ` QT_NO_CONTEXTLESS_CONNECT ` definiert ist. Verwenden Sie stattdessen die Überladung `callOnTimeout()`, die ein Kontext-Objekt entgegennimmt.

Siehe auch ` QObject::connect()` und ` timeout()`.

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

Stellt eine Verbindung vom Signal „ timeout()“ zu „ slot “ her, die in eine bestimmte Ereignisschleife von „ context “ eingefügt werden soll, und gibt ein Handle für die Verbindung zurück.

Diese Methode dient der Vereinfachung. Sie entspricht dem Aufruf von:

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

Diese Funktion überlädt „ QTimer::callOnTimeout()“.

Siehe auch QObject::connect() und timeout().

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

Gibt einen ` Qt::TimerId ` zurück, der die Timer-ID darstellt, wenn der Timer läuft; andernfalls wird ` Qt::TimerId::Invalid` zurückgegeben.

Diese Funktion wurde in Qt 6.8 eingeführt.

Siehe auch „ Qt::TimerId “.

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

Gibt das Intervall dieses Timers als „ std::chrono::milliseconds “-Objekt zurück.

Siehe auch „ interval “.

bool QTimer::isActive() const

Gibt „ true “ zurück, wenn der Timer läuft; andernfalls wird „ false “ zurückgegeben.

Hinweis: Getter -Funktion für die Eigenschaft „ active “.

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

Gibt die verbleibende Zeit in diesem Timer-Objekt als „ std::chrono::milliseconds “-Objekt zurück. Ist dieser Timer abgelaufen oder überfällig, lautet der Rückgabewert „ std::chrono::milliseconds::zero() “. Konnte die verbleibende Zeit nicht ermittelt werden oder läuft der Timer nicht, gibt diese Funktion eine negative Dauer zurück.

Siehe auch ` 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)

Diese statische Funktion ruft „ functor “ nach „ interval “ auf.

Die Verwendung dieser Funktion ist sehr praktisch, da Sie sich nicht um ein ` timerEvent ` kümmern oder ein lokales ` QTimer `-Objekt erstellen müssen.

Wenn „ context “ angegeben ist, wird „ functor “ nur dann aufgerufen, wenn das Objekt „ context “ vor Ablauf des Intervalls nicht zerstört wurde. Der Funktor wird dann im Thread von „ context “ ausgeführt. Der Thread des Kontexts muss über eine laufende Qt-Ereignisschleife verfügen.

Ist „ functor “ eine Mitgliedsfunktion von „ context “, wird die Funktion für das Objekt aufgerufen.

Der Parameter ` interval ` kann ein ` int ` (interpretiert als Millisekundenwert) oder ein Typ ` std::chrono ` sein, der implizit in Nanosekunden umgewandelt wird.

Ab Qt 6.10 führt die Festlegung eines negativen Intervalls zu einer Laufzeitwarnung, und der Wert wird auf 1 ms zurückgesetzt. Vor Qt 6.10 ließ sich bei einem Qt-Timer zwar ein negatives Intervall festlegen, das Verhalten war jedoch unvorhersehbar (beispielsweise wurde der Timer angehalten, wenn er lief, oder gar nicht erst gestartet).

Hinweis: In Qt-Versionen vor 6.8 nahmen die chrono-Überladungen chrono::milliseconds und nicht chrono::nanoseconds entgegen. Der Compiler führt die Konvertierung automatisch durch, bei extrem großen Millisekundenwerten kann es jedoch zu einem Überlauf kommen.

Hinweis: Diese Funktion ist reentrant.

Siehe auch ` start()`.

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

Diese statische Funktion ruft nach Ablauf eines bestimmten Zeitintervalls einen Slot auf.

Die Verwendung dieser Funktion ist sehr praktisch, da Sie sich nicht um ein „ timerEvent “ kümmern oder ein lokales „ QTimer “-Objekt erstellen müssen.

Das „ receiver “ ist das Empfängerobjekt und „ member “ ist der Slot. Das Zeitintervall wird im Dauerobjekt „ nsec “ angegeben.

Ab Qt 6.10 führt die Festlegung eines negativen Intervalls zu einer Laufzeitwarnung und der Wert wird auf 1 ms zurückgesetzt. Vor Qt 6.10 ließ sich bei einem Qt-Timer zwar ein negatives Intervall festlegen, das Verhalten war jedoch unvorhersehbar (beispielsweise wurde der Timer angehalten, wenn er lief, oder gar nicht erst gestartet).

Hinweis: In Qt-Versionen vor 6.8 nahm diese Funktion „chrono::milliseconds“ und nicht „chrono::nanoseconds“ entgegen. Der Compiler führt die Umwandlung automatisch durch, bei extrem großen Millisekundenwerten kann es jedoch zu einem Überlauf kommen.

Dies ist eine überladene Funktion.

Hinweis: Diese Funktion ist reentrant.

Siehe auch ` start()`.

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

Diese statische Funktion ruft nach Ablauf eines bestimmten Zeitintervalls einen Slot auf.

Die Verwendung dieser Funktion ist sehr praktisch, da Sie sich nicht um ein „ timerEvent “ kümmern oder ein lokales „ QTimer “-Objekt erstellen müssen.

receiver ist das Empfängerobjekt und member ist der Slot. Das Zeitintervall wird im Dauerobjekt nsec angegeben. timerType beeinflusst die Genauigkeit des Timers.

Ab Qt 6.10 führt die Festlegung eines negativen Intervalls zu einer Laufzeitwarnung, und der Wert wird auf 1 ms zurückgesetzt. Vor Qt 6.10 ließ sich bei einem Qt-Timer zwar ein negatives Intervall festlegen, das Verhalten war jedoch unvorhersehbar (beispielsweise wurde der Timer angehalten, wenn er lief, oder gar nicht erst gestartet).

Hinweis: In Qt-Versionen vor 6.8 nahm diese Funktion „chrono::milliseconds“ entgegen, nicht „chrono::nanoseconds“. Der Compiler führt die Umwandlung automatisch durch, doch bei extrem großen Millisekundenwerten kann es zu einem Überlauf kommen.

Dies ist eine überladene Funktion.

Hinweis: Diese Funktion ist reentrant.

Siehe auch ` start()`.

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

Startet oder setzt den Timer mit einer Zeitüberschreitungsdauer von msec Millisekunden zurück.

Dies entspricht:

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

Wenn der Timer bereits läuft, wird er nach Ablauf von stopped neu gestartet. Dadurch ändert sich auch der Wert von „ id()“.

Ist ` singleShot ` wahr, wird der Timer nur einmal aktiviert.

Ab Qt 6.10 führt die Angabe eines negativen Intervalls zu einer Laufzeitwarnung und der Wert wird auf 1 ms zurückgesetzt. Vor Qt 6.10 ließ sich bei einem Qt-Timer zwar ein negatives Intervall festlegen, das Verhalten war jedoch unvorhersehbar (beispielsweise wurde der Timer angehalten, wenn er lief, oder gar nicht erst gestartet).

Hinweis: Die Ereignis-Schleife mit einem Null-Timerzu belasten , führt zwangsläufig zu Problemen und einem äußerst unvorhersehbaren Verhalten der Benutzeroberfläche.

Hinweis: Dieser Slot ist überladen. So verbinden Sie sich mit diesem 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); });
Weitere Beispiele und Vorgehensweisen finden Sie unter „Anschließen an überladene Slots“.

[slot] void QTimer::start()

Startet oder setzt den Timer mit der in „ interval “ angegebenen Zeitüberschreitung zurück.

Wenn der Timer bereits läuft, wird er auf „ stopped “ gesetzt und neu gestartet. Dadurch ändert sich auch sein Wert für „ id()“.

Ist ` singleShot ` wahr, wird der Timer nur einmal aktiviert.

Hinweis: Die Event-Schleife mit einem Null-Timerzu belasten , führt zwangsläufig zu Problemen und einem äußerst unvorhersehbaren Verhalten der Benutzeroberfläche.

Hinweis: Dieser Slot ist überladen. So verbinden Sie sich mit diesem 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(); });
Weitere Beispiele und Vorgehensweisen finden Sie unter „An überladene Slots anbinden“.

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

Startet oder startet den Timer erneut mit einer Zeitüberschreitung von interval Millisekunden.

Dies entspricht:

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

Wenn der Timer bereits läuft, wird er auf „ stopped “ gesetzt und neu gestartet. Dadurch ändert sich auch sein Wert „ id()“.

Ist ` singleShot ` wahr, wird der Timer nur einmal aktiviert.

Ab Qt 6.10 führt die Festlegung eines negativen Intervalls zu einer Laufzeitwarnung und der Wert wird auf 1 ms zurückgesetzt. Vor Qt 6.10 ließ sich bei einem Qt-Timer zwar ein negatives Intervall festlegen, das Verhalten war jedoch unvorhersehbar (beispielsweise wurde der Timer gestoppt, wenn er lief, oder gar nicht erst gestartet).

Hinweis: Die Ereignisschleife mit einem Timer mit dem Wert Nullzu belasten , führt zwangsläufig zu Problemen und einem äußerst unvorhersehbaren Verhalten der Benutzeroberfläche.

Dies ist eine überladene Funktion.

[slot] void QTimer::stop()

Hält den Timer an.

Siehe auch „ start()“.

[private signal] void QTimer::timeout()

Dieses Signal wird ausgesendet, wenn der Timer abgelaufen ist.

Hinweis: Dies ist ein privates Signal. Es kann in Signalverbindungen verwendet werden, darf jedoch nicht vom Benutzer ausgelöst werden.

Siehe auch interval, start() und stop().

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

Implementiert: ` QObject::timerEvent(QTimerEvent *event)`.

int QTimer::timerId() const

Gibt die ID des Timers zurück, wenn dieser läuft; andernfalls wird -1 zurückgegeben.

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