タイマー
QObjectは、すべてのQtオブジェクトの基底クラスであり、Qtにおける基本的なタイマー機能を提供します。QObject::startTimer() を使用すると、引数としてミリ秒単位の間隔を指定してタイマーを開始できます。この関数は、一意の整数型のタイマーIDを返します。その後、そのタイマーIDを使用してQObject::killTimer() を明示的に呼び出すまで、タイマーは一定の間隔で発火し続けます。
タイマーIDを直接扱う代わりに、QBasicTimer を使用することもできます。QBasicTimer は、タイマーIDをラップした値クラス(RAII)です。 タイマーは `QBasicTimer::start()` で開始し、`QBasicTimer::stop()` で停止します(後者は破棄時にも呼び出されます)。QBasicTimer を使用するには、クラス(QObject のサブクラスである必要があります)内で `timerEvent()` を再実装し、そこでタイマーイベントを処理する必要があります。
このメカニズムが機能するためには、アプリケーションがイベントループ内で実行されている必要があります。イベントループはQCoreApplication::exec() で開始できます。 Qt Widgets アプリケーションについては、QApplication::exec() を参照してください。タイマーが発火すると、アプリケーションはQTimerEvent を送信し、タイマーイベントが処理されるまで制御の流れはイベントループを離れます。これは、アプリケーションが他の処理で忙しい間はタイマーが発火できないことを意味します。 言い換えれば、タイマーの精度はアプリケーションの粒度によって異なります。また、タイマーの精度は基盤となるオペレーティングシステムやハードウェアにも依存します。短い間隔はシステムスケジューラによって丸められたり遅延したりする可能性があり、システムがビジー状態の場合、すべてのタイマータイプが要求された時刻よりも遅れてタイムアウトする可能性があります。タイマーの分解能およびQt::TimerType の詳細については、QTimer のドキュメントを参照してください。
マルチスレッドアプリケーションでは、イベントループを持つ任意のスレッドでタイマー機構を使用できます。GUI スレッド以外からイベントループを開始するには、QThread::exec() を使用します。 Qt では、オブジェクトの `thread affinity ` を使用して、どのスレッドが `QTimerEvent` を配信するかを決定します。このため、すべてのタイマーはオブジェクトのスレッド内で開始および停止する必要があります。別のスレッドでオブジェクトのタイマーを開始することはできません。
タイマー機能の主要なAPIはQTimer です。QTimer は間隔を符号付き整数で格納するため、サポートされる最大間隔は符号付き整数に収まるミリ秒数に制限されます(実際には、約24日間の期間に相当します)。
Qt 6.8 では、QChronoTimer クラスが導入されました。これら 2 つのクラスの主な違いは、QChronoTimer がより広い間隔範囲とより高い精度をサポートしている点です(std::chrono::nanoseconds )。QTimer の場合、サポートされる最大間隔は ±24 日ですが、QChronoTimer の場合は ±292 年です。 ミリ秒単位の分解能と±24日の範囲のみでよい場合は、引き続きQTimer を使用できます。なお、QChronoTimer が存在するのは、主にQTimer の精度をstd::chrono::nanoseconds に変更するとバイナリ互換性が破綻してしまうためです。
QTimer は、タイマーが起動した際にシグナルを発する通常のタイマーを提供し、QObject を継承しているため、ほとんどの Qt プログラムの所有権構造にうまく適合します。通常の使用方法は以下の通りです:
QTimer *timer = new QTimer(1s, this);
connect(timer, &QTimer::timeout, this, &MyWidget::processOneThing);
timer->start();
auto *timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &MyWidget::processOneThing);
timer->setInterval(1s);
timer->start();QTimer オブジェクトをthis オブジェクトの子にすることで、this が破棄された際に、タイマーも破棄されるようにします。次に、timeout()シグナルを処理を行うスロットに接続します。タイマーの間隔は、コンストラクタに引数として渡すか、後でsetInterval()を使用して設定することができます。
QTimer また、ワンショットタイマー用の静的関数も提供されています。例えば:
MyWidget widget;
QTimer::singleShot(200ms, &widget, &MyWidget::updateCaption);このコード行が実行されてから200ms後に、updateCaption() スロットが呼び出されます。
QTimer が機能するためには、アプリケーションにイベントループが必要です。つまり、どこかでQCoreApplication::exec() を呼び出す必要があります。タイマーイベントは、イベントループが実行されている間のみ配信されます。
マルチスレッドアプリケーションでは、イベントループを持つ任意のスレッドで `QTimer ` を使用できます。GUI スレッド以外からイベントループを開始するには、`QThread::exec()` を使用します。 Qt XML では、タイマーの `thread affinity ` を使用して、どのスレッドが `timeout()` シグナルを発生させるかを決定します。このため、タイマーはそのスレッド内で開始および停止させる必要があります。別のスレッドからタイマーを開始することはできません。
「Analog Clock」の例では、QTimer を使用して、一定間隔でウィジェットを再描画する方法を示しています。AnalogClock の実装からは、次のように記述されています。
AnalogClock::AnalogClock(QWidget *parent)
: QWidget(parent)
{
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, QOverload<>::of(&AnalogClock::update));
timer->start(1000);
setWindowTitle(tr("Analog Clock"));
resize(200, 200);
}QTimer は1秒ごとに、QWidget::update()スロットを呼び出して、時計の表示を更新します。
© 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.