QTimer Class
QTimer クラスは、繰り返しタイマーとワンショットタイマーを提供します。詳細...
| ヘッダー: | #include <QTimer> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| 継承元: | QObject |
- 継承されたメンバーを含む、すべてのメンバーの一覧
- 非推奨のメンバ
- QTimerはイベントクラスの一部です。
プロパティ
|
|
パブリック関数
| 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 |
パブリックスロット
シグナル
| void | timeout() |
静的パブリックメンバー
| 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) |
再実装されたプロテクト関数
| virtual void | timerEvent(QTimerEvent *e) override |
詳細な説明
QTimerクラスは、タイマー用の高レベルなプログラミングインターフェースを提供します。これを使用するには、QTimerインスタンスを作成し、そのtimeout()シグナルを適切なスロットに接続し、start()を呼び出します。それ以降、一定の間隔でtimeout()シグナルを発信します。
1秒(1000ミリ秒)のタイマーの例(「Analog Clock」の例より):
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, QOverload<>::of(&AnalogClock::update));
timer->start(1000);それ以降、update() スロットが1秒ごとに呼び出されます。
setSingleShot(true) を呼び出すことで、タイマーを 1 回だけタイムアウトするように設定できます。また、静的関数QTimer::singleShot() を使用して、指定した間隔後にスロットを呼び出すこともできます:
QTimer::singleShot(200, this, &Foo::updateCaption);マルチスレッドアプリケーションでは、イベントループを持つ任意のスレッドで QTimer を使用できます。GUI 以外のスレッドからイベントループを開始するには、QThread::exec() を使用します。 Qtは、タイマーのthread affinity を使用して、どのスレッドがtimeout()シグナルを発生させるかを決定します。このため、タイマーはそのスレッド内で開始および停止させる必要があり、別のスレッドからタイマーを開始することはできません。
特例として、タイムアウトが 0 の QTimer は可能な限り早くタイムアウトしますが、タイムアウトが 0 のタイマーと他のイベントソースとの間の処理順序は未定義です。タイムアウトが 0 のタイマーを使用すると、ユーザーインターフェースの応答性を維持しつつ、一部の処理を実行することができます:
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &Foo::processOneThing);
timer->start();それ以降、processOneThing() が繰り返し呼び出されます。この関数は、常に迅速に(通常は1つのデータ項目を処理した後)戻るよう記述する必要があります。そうすることで、Qtはユーザーインターフェースにイベントを配信し、すべての処理が完了次第、タイマーを停止させることができます。 これはGUIアプリケーションで負荷の高い処理を実装する従来の方法ですが、現在ではマルチスレッドがますます多くのプラットフォームで利用可能になっているため、ゼロミリ秒のQTimerオブジェクトは徐々にQThreadに置き換わっていくものと予想されます。
精度とタイマーの分解能
タイマーの精度は、基盤となるオペレーティングシステムとハードウェアに依存します。ほとんどのプラットフォームは 1 ミリ秒の分解能をサポートしていますが、実際の状況では、タイマーの精度がこの分解能と一致しない場合が多くあります。
精度は、timer type にも依存します。Qt::PreciseTimer の場合、QTimerは精度を1ミリ秒に保つよう努めます。また、Preciseタイマーは、予想よりも早くタイムアウトすることは決してありません。
Qt::CoarseTimer およびQt::VeryCoarseTimer タイプの場合、QTimerは、それぞれのタイプに設定された許容範囲内(Qt::CoarseTimer の場合は間隔の5%、Qt::VeryCoarseTimer の場合は500ミリ秒)で、予想より早く起動することがあります。
システムがビジー状態であるか、要求された精度を提供できない場合、すべてのタイマータイプでタイムアウトが予想より遅れる可能性があります。このようなタイムアウトオーバーランが発生した場合、Qtは複数のタイムアウトが切れたとしてもtimeout()を1回だけ発火し、その後、元の間隔を再開します。
QTimerの代替手段
Qt 6.8では、QChronoTimer が導入されました。これら2つのクラスの主な違いは、QChronoTimer の方がより広い間隔範囲とより高い精度をサポートしている点です(std::chrono::nanoseconds )。QTimerでサポートされる最大間隔は±24日であるのに対し、QChronoTimer では±292年です(std::numeric_limits<int>::max() を超える間隔でも整数オーバーフローが発生する可能性が低くなります)。 ミリ秒単位の分解能と±24日の範囲のみが必要な場合は、引き続きQTimerを使用できます。
別の方法として、自身のクラス(QObject のサブクラスである必要があります)でQObject::timerEvent()メソッドを再実装し、以下のいずれかのアプローチを採用することもできます:
- QBasicTimer を使用する方法です。これは、タイマーIDをラップする軽量な値クラスです。QBasicTimer::start()でタイマーを開始し、QBasicTimer::stop()で停止できます。イベントの処理は、再実装したtimerEvent()内で行うことができます。
- より低レベルな方法として、タイマーIDを直接操作する方法があります。タイマーを開始するには `QObject::startTimer()` を呼び出し、返されたIDを保存します。タイマーを停止するには `QObject::killTimer()` を呼び出します。イベントの処理は、再実装した `timerEvent()` で行えます。このアプローチは、通常、`QBasicTimer` を使用する場合よりも手間がかかります。
timerEvent() を使用するデメリットとして、シングルショットタイマーやシグナルといった一部の高度な機能がサポートされていない点が挙げられます。
一部のオペレーティングシステムでは、使用できるタイマーの数が制限されていますが、Qt ではこれらの制限を回避するよう努めています。
QBasicTimer 、QTimerEvent 、QObject::timerEvent()、タイマー、およびアナログクロックも参照してください 。
プロパティのドキュメント
[bindable read-only] active : bool
注:この プロパティは、QProperty バインディングに対応しています。
このブール型プロパティは、タイマーが実行中の場合はtrue 、それ以外の場合はfalseとなります。
アクセス関数:
| bool | isActive() const |
[bindable] interval : int
注:この プロパティは、QProperty バインディングに対応しています。
このプロパティは、タイムアウト間隔(ミリ秒単位)を保持します
このプロパティのデフォルト値は 0 です。タイムアウト間隔が 0 の `QTimer ` は、ウィンドウシステムのイベントキュー内のすべてのイベントが処理され次第、タイムアウトします。
注: タイムアウト間隔を 0 に設定したタイマーでイベントループを稼働させ続けると 、問題が発生し、UI の動作が著しく不安定になることが避けられません。
実行中のタイマーの間隔を設定すると、間隔が変更され、stop()、続いてstart() が実行され、新しいid() が取得されます。タイマーが実行されていない場合は、間隔のみが変更されます。
Qt 6.10 以降、負の間隔を設定すると、実行時警告が発生し、値は 1ms にリセットされます。 Qt 6.10 以前では、Qt Timer で負の間隔を設定することは可能でしたが、予期しない動作(例えば、タイマーが実行中であれば停止したり、まったく開始されなかったりすることなど)が発生していました。
アクセス関数:
| int | interval() const |
| void | setInterval(int msec) |
| void | setInterval(std::chrono::milliseconds value) |
singleShotも参照してください 。
[read-only] remainingTime : int
このプロパティには、残り時間がミリ秒単位で格納されます
タイムアウトまでの残り時間をミリ秒単位で返します。タイマーが非アクティブな場合、返される値は -1 になります。タイマーが期限切れの場合、返される値は 0 になります。
アクセス関数:
| int | remainingTime() const |
関連項目: interval 。
[bindable] singleShot : bool
注:この プロパティは、QProperty のバインディングに対応しています。
このプロパティは、タイマーがシングルショットタイマーであるかどうかを示します
シングルショット・タイマーは 1 回のみ作動し、シングルショット以外のタイマーはinterval ミリ秒ごとに作動します。
このプロパティのデフォルト値はfalse です。
アクセス関数:
| bool | isSingleShot() const |
| void | setSingleShot(bool singleShot) |
「 interval 」および「singleShot()」も参照してください 。
[bindable] timerType : Qt::TimerType
注:この プロパティは、QProperty のバインディングに対応しています。
タイマーの精度を制御します
このプロパティのデフォルト値は `Qt::CoarseTimer` です。
アクセス関数:
| Qt::TimerType | timerType() const |
| void | setTimerType(Qt::TimerType atype) |
「Qt::TimerType」も参照してください 。
メンバ関数のドキュメント
[explicit] QTimer::QTimer(QObject *parent = nullptr)
指定されたparent を使用してタイマーを作成します。
[virtual noexcept] QTimer::~QTimer()
タイマーを解除します。
template <typename Functor> QMetaObject::Connection QTimer::callOnTimeout(Functor &&slot)
タイマーのtimeout()シグナルからslot への接続を作成します。接続へのハンドルを返します。
このメソッドは利便性のために提供されています。これは、以下の呼び出しと同等です。
注: QT_NO_CONTEXTLESS_CONNECT が定義されている場合、この オーバーロードは利用できません。その場合は、コンテキストオブジェクトを受け取るcallOnTimeout()オーバーロードを使用してください。
QObject::connect() およびtimeout()も参照してください 。
template <typename Functor> QMetaObject::Connection QTimer::callOnTimeout(const QObject *context, Functor &&slot, Qt::ConnectionType connectionType = Qt::AutoConnection)
timeout() シグナルからslot への接続を作成し、これをcontext の特定のイベントループに配置するとともに、その接続へのハンドルを返します。
このメソッドは利便性のために提供されています。これは、以下の呼び出しと同等です:
この関数は、QTimer::callOnTimeout() をオーバーロードしています。
QObject::connect() およびtimeout()も参照してください 。
[since 6.8] Qt::TimerId QTimer::id() const
タイマーが実行中の場合は、タイマーIDを表すQt::TimerId を返します。そうでない場合は、Qt::TimerId::Invalid を返します。
この関数は Qt 6.8 で導入されました。
Qt::TimerIdも参照してください 。
std::chrono::milliseconds QTimer::intervalAsDuration() const
このタイマーのインターバルをstd::chrono::milliseconds オブジェクトとして返します。
「interval」も参照してください 。
bool QTimer::isActive() const
タイマーが実行中の場合は `true ` を返し、そうでない場合は `false` を返します。
注: プロパティactiveのゲッター 関数です。
std::chrono::milliseconds QTimer::remainingTimeAsDuration() const
このタイマーオブジェクトの残り時間を、std::chrono::milliseconds オブジェクトとして返します。このタイマーが期限切れまたは期限超過の場合、戻り値はstd::chrono::milliseconds::zero() となります。残り時間が確認できない場合や、タイマーが実行されていない場合、この関数は負の継続時間を返します。
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)
この静的関数は、interval の後にfunctor を呼び出します。
この関数を使用すると、timerEvent を気にかけたり、ローカルのQTimer オブジェクトを作成したりする必要がないため、非常に便利です。
context が指定されている場合、functor は、インターバルが発生する前にcontext オブジェクトが破棄されていない場合にのみ呼び出されます。その後、ファンクタはcontext のスレッドで実行されます。コンテキストのスレッドには、実行中の Qt イベントループが存在している必要があります。
functor がcontext のメンバ関数である場合、その関数はオブジェクトに対して呼び出されます。
interval パラメータは、int (ミリ秒数として解釈される)または、暗黙的にナノ秒に変換されるstd::chrono 型であることができます。
Qt 6.10 以降、負のインターバルを設定すると、実行時の警告が表示され、値は 1ms にリセットされます。 Qt 6.10 以前は、Qt Timer で負の間隔を設定することは可能でしたが、予期しない動作(例えば、タイマーが実行中であれば停止したり、まったく開始されなかったりすること)が発生していました。
注: Qt 6.8以前のバージョンでは 、chrono のオーバーロード関数は chrono::milliseconds を引数としており、chrono::nanoseconds ではありませんでした。コンパイラが自動的に変換を行いますが、ミリ秒数が極端に大きい場合、変換時にオーバーフローが発生する可能性があります。
注:この関数は再入可能です。
start()も参照してください 。
[static] void QTimer::singleShot(std::chrono::nanoseconds nsec, const QObject *receiver, const char *member)
この静的関数は、指定された時間間隔が経過した後にスロットを呼び出します。
timerEvent を気にかける必要も、ローカルのQTimer オブジェクトを作成する必要もないため、この関数を使用するのは非常に便利です。
receiver は受信オブジェクト、member はスロットです。時間間隔は、nsec オブジェクトで指定されます。
Qt 6.10 以降、負の間隔を設定すると、実行時の警告が表示され、値は 1ms にリセットされます。 Qt 6.10 以前では、Qt Timer で負の間隔を設定することは可能でしたが、予期しない動作(例えば、タイマーが実行中であれば停止したり、まったく開始されなかったりすること)が発生していました。
注: Qt 6.8以前のバージョンでは 、この関数は chrono::nanoseconds ではなく chrono::milliseconds を引数としていました。コンパイラが自動的に変換を行いますが、ミリ秒数が極端に大きい場合、変換時にオーバーフローが発生する可能性があります。
これはオーバーロードされた関数です。
注:この関数は再入可能です。
start()も参照してください 。
[static] void QTimer::singleShot(std::chrono::nanoseconds nsec, Qt::TimerType timerType, const QObject *receiver, const char *member)
この静的関数は、指定された時間間隔が経過した後にスロットを呼び出します。
timerEvent を気にかけたり、ローカルのQTimer オブジェクトを作成したりする必要がないため、この関数を使用するのは非常に便利です。
receiver は受信オブジェクト、member はスロットです。時間間隔は、nsec オブジェクトで指定されます。timerType は、タイマーの精度に影響します。
Qt 6.10以降、負の間隔を設定すると、実行時の警告が表示され、値は1msにリセットされます。 Qt 6.10 以前では、Qt Timer で負の間隔を設定することは可能でしたが、予期しない動作(例えば、タイマーが実行中であれば停止したり、まったく開始されなかったりすること)が生じることがありました。
注: Qt 6.8以前のバージョンでは 、この関数は chrono::nanoseconds ではなく chrono::milliseconds を引数としていました。コンパイラが自動的に変換を行いますが、ミリ秒数が極端に大きい場合、変換時にオーバーフローが発生する可能性があります。
これはオーバーロードされた関数です。
注:この関数は再入可能です。
start()も参照してください 。
[slot] void QTimer::start(int msec)
msec ミリ秒のタイムアウト間隔でタイマーを開始または再開します。
これは、以下の処理と同等です:
timer.setInterval(msec);
timer.start();タイマーがすでに実行中の場合は、stopped となり、再起動されます。これにより、id() も変更されます。
singleShot がtrueの場合、タイマーは1回だけ起動されます。
Qt 6.10 以降、負の間隔を設定すると、実行時警告が発生し、値は 1ms にリセットされます。 Qt 6.10 以前は、Qt Timer で負の間隔を設定することは可能でしたが、予期せぬ動作(たとえば、実行中のタイマーが停止したり、まったく開始されなかったり)が発生していました。
注: ゼロのタイマーでイベントループを占有し続けると 、必ずトラブルが発生し、UI の動作が極めて不安定になります。
注:この スロットは オーバーロードされています。このスロットに接続するには:
// 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()
interval で指定されたタイムアウト時間に基づいて、タイマーを開始または再起動します。
タイマーがすでに実行中の場合は、stopped となり、再起動されます。これにより、id() の値も変更されます。
singleShot が true の場合、タイマーは 1 回だけ起動されます。
注: ゼロタイマーによってイベントループを占有し続けると 、必ずトラブルが発生し、UI の動作が著しく不安定になります。
注:この スロットは オーバーロードされています。このスロットに接続するには:
// 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)
interval ミリ秒のタイムアウトを設定して、タイマーを開始または再開します。
これは以下と同等です:
timer.setInterval(interval);
timer.start();タイマーがすでに実行中の場合、stopped となり、再起動されます。これにより、id() の値も変更されます。
singleShot がtrueの場合、タイマーは1回のみ起動されます。
Qt 6.10 以降、負の間隔を設定すると、実行時警告が発生し、値が 1ms にリセットされます。 Qt 6.10 以前では、Qt Timer で負の間隔を設定することは可能でしたが、予期せぬ動作(例えば、実行中のタイマーが停止したり、まったく開始されなかったりすること)が発生していました。
注: ゼロのタイマーでイベントループを占有し続けると 、必ずトラブルが発生し、UI の動作が極めて不安定になります。
これはオーバーロードされた関数です。
[slot] void QTimer::stop()
タイマーを停止します。
start()も参照してください 。
[private signal] void QTimer::timeout()
このシグナルは、タイマーがタイムアウトしたときに送信されます。
注:これは プライベートシグナルです。シグナル接続では使用できますが、ユーザーが自ら発することはできません。
関連項目: interval 、start()、およびstop()。
[override virtual protected] void QTimer::timerEvent(QTimerEvent *e)
QObject::timerEvent(QTimerEvent *event) を再実装します。
int QTimer::timerId() const
タイマーが実行中の場合は、そのタイマーのIDを返します。そうでない場合は-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.