このページでは

QChronoTimer Class

QChronoTimer クラスは、繰り返しタイマーとワンショットタイマーを提供します。詳細...

ヘッダー: #include <QChronoTimer>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
以下のように: Qt 6.8
継承元: QObject

プロパティ

パブリック関数

QChronoTimer(QObject *parent = nullptr)
QChronoTimer(std::chrono::nanoseconds nsec, QObject *parent = nullptr)
virtual ~QChronoTimer() override
QBindable<bool> bindableActive()
QBindable<std::chrono::nanoseconds> bindableInterval()
QBindable<bool> bindableSingleShot()
QBindable<Qt::TimerType> bindableTimerType()
QMetaObject::Connection callOnTimeout(const QObject *context, Functor &&slot, Qt::ConnectionType connectionType = Qt::AutoConnection)
Qt::TimerId id() const
std::chrono::nanoseconds interval() const
bool isActive() const
bool isSingleShot() const
std::chrono::nanoseconds remainingTime() const
void setInterval(std::chrono::nanoseconds nsec)
void setSingleShot(bool singleShot)
void setTimerType(Qt::TimerType atype)
Qt::TimerType timerType() const

パブリックスロット

void start()
void stop()

シグナル

void timeout()

再実装された保護関数

virtual void timerEvent(QTimerEvent *e) override

詳細な説明

QChronoTimer クラスは、タイマー用の高レベルなプログラミングインターフェースを提供します。これを使用するには、コンストラクタに間隔を渡すか、あるいはsetInterval() を使用して構築後に間隔を設定して QChronoTimer を作成し、そのtimeout() シグナルを適切なスロットに接続し、start() を呼び出します。 それ以降、タイマーは一定の間隔でtimeout()シグナルを発行します。例えば:

        auto *timer = new QChronoTimer(1s, this);
        connect(timer, &QChronoTimer::timeout, this, &MyWidget::processOneThing);
        timer->start();
        QChronoTimer *timer = new QChronoTimer(this);
        connect(timer, &QChronoTimer::timeout, this, &MyWidget::processOneThing);
        timer->setInterval(1s);
        timer->start();

setSingleShot(true) を呼び出すことで、タイマーを 1 回のみ動作させるように設定できます。

注:QChronoTimer には singleShot() 静的メソッドはありません。QTimer の singleShot() メソッドは、すでに chrono 型およびナノ秒単位の分解能に対応しているためです。

マルチスレッドアプリケーションでは、イベントループを持つ任意のスレッドで QChronoTimer を使用できます。GUI 以外のスレッドからイベントループを開始するには、QThread::exec() を使用します。 Qt は、タイマーの `thread affinity ` を使用して、どのスレッドが `timeout()` シグナルを発生させるかを決定します。このため、タイマーはそのスレッド内で開始および停止させる必要があり、別のスレッドからタイマーを開始することはできません。

特例として、タイムアウトが0ns に設定されたQChronoTimerは、可能な限り早くタイムアウトしますが、ゼロタイマーと他のイベントソースとの間の実行順序は未定義です。ゼロタイマーを使用すると、応答性の高いユーザーインターフェースを維持しつつ、一部の処理を実行することができます。

        // The default interval is 0ns
        QTimer *timer = new QTimer(this);
        connect(timer, &QTimer::timeout, this, &MyWidget::processOneThing);
        timer->start();

それ以降、processOneThing() が繰り返し呼び出されます。Qtがユーザーインターフェースにイベントを配信し、すべての処理が完了次第すぐにタイマーを停止できるように、この関数は常に(例えば、1つのデータ項目を処理した後など)速やかに戻るよう記述する必要があります。 これはGUIアプリケーションで負荷の高い処理を実装する従来の方法ですが、マルチスレッドがより多くのプラットフォームで利用可能になるにつれ、GUI(メイン)スレッド以外のスレッドで負荷の高い処理を行うことが、現代的な代替手段となっています。Qtには、これを実現するために使用できるQThread クラスがあります。

精度とタイマーの分解能

タイマーの精度は、基盤となるオペレーティングシステムやハードウェアに依存します。ほとんどのプラットフォームでは、タイマーに対してナノ秒単位の精度を要求することが可能ですが(例:libcのnanosleep )、実際の多くの状況では、タイマーの精度はこの分解能に等しくなることはありません。

timer type を設定することで、QChronoTimer にシステムからどの精度を要求するかを指定できます。

Qt::PreciseTimer の場合、QChronoTimer は精度を1ns に保つよう努めます。高精度タイマーは、予想よりも早くタイムアウトすることは決してありません。

Qt::CoarseTimer およびQt::VeryCoarseTimer の各タイプの場合、QChronoTimer は、それらのタイプに定められた許容範囲内で、予想より早く起動することがあります。

システムがビジー状態であるか、要求された精度を提供できない場合、すべてのタイマータイプで、予想より遅れてタイムアウトすることがあります。このようなタイムアウトオーバーランの場合、Qtは、たとえ複数のタイムアウトが期限切れになったとしても、timeout()を1回だけ発火し、その後、元の間隔を再開します。

QChronoTimerの代替手段

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 : std::chrono::nanoseconds

注:この プロパティは、QProperty のバインディングに対応しています。

このプロパティはタイムアウト間隔を保持します

このプロパティのデフォルト値は `0ns` です。

タイムアウトが0ns の `QChronoTimer ` は、ウィンドウシステムのイベントキュー内のすべてのイベントが処理され次第、タイムアウトになります。

実行中のタイマーの間隔を設定すると、間隔が変更され、stop()、続いてstart() がタイマーに対して実行され、新しいid() が取得されます。タイマーが実行されていない場合は、間隔のみが変更されます。

Qt 6.10 以降、負のインターバルを設定すると、実行時警告が発生し、値は 1ms にリセットされます。 Qt 6.10 以前では、Qt Timer で負のインターバルを設定することは可能でしたが、予期しない動作(例えば、タイマーが実行中であれば停止したり、まったく開始されなかったりすることなど)が発生していました。

アクセス関数:

std::chrono::nanoseconds interval() const
void setInterval(std::chrono::nanoseconds nsec)

singleShotも参照してください 。

[read-only] remainingTime : std::chrono::nanoseconds

このプロパティには、残り時間が格納されます

タイムアウトまでの残り時間を返します。

タイマーが非アクティブな場合、返される時間は負の値になります。

タイマーが期限切れの場合、返される時間は `0ns` になります。

アクセス関数:

std::chrono::nanoseconds remainingTime() const

「interval」も参照してください 。

[bindable] singleShot : bool

注:この プロパティは、QProperty のバインディングに対応しています。

このプロパティは、タイマーがシングルショットタイマーであるかどうかを示します

シングルショット・タイマーは 1 回のみ作動し、シングルショット以外のタイマーは「interval 」ごとに作動します。

このプロパティのデフォルト値はfalse です。

アクセス関数:

bool isSingleShot() const
void setSingleShot(bool singleShot)

「interval」も参照してください 。

[bindable] timerType : Qt::TimerType

注:この プロパティは、QProperty バインディングに対応しています。

タイマーの精度を制御します

このプロパティのデフォルト値は「Qt::CoarseTimer 」です。

アクセス関数:

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

「Qt::TimerType」も参照してください 。

メンバー関数のドキュメント

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

指定されたparent に基づき、デフォルトの間隔0ns を使用してタイマーを作成します。

[explicit] QChronoTimer::QChronoTimer(std::chrono::nanoseconds nsec, QObject *parent = nullptr)

指定されたparent を用いて、間隔nsec でタイマーを作成します。

[override virtual noexcept] QChronoTimer::~QChronoTimer()

タイマーを破棄します。

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

timeout() 信号からslot への接続を作成し、これをcontext の特定のイベントループに配置します。接続タイプはconnectionType であり、接続へのハンドルを返します。

このメソッドは利便性のために提供されています。以下の呼び出しと同等です:

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

QObject::connect() およびtimeout()も参照してください 。

Qt::TimerId QChronoTimer::id() const

タイマーが実行中の場合は、タイマーIDを表すQt::TimerId を返します。そうでない場合は、Qt::TimerId::Invalid を返します。

Qt::TimerIdも参照してください 。

bool QChronoTimer::isActive() const

タイマーが実行中の場合は `true ` を返し、そうでない場合は `false` を返します。

注: プロパティ `active`のゲッター 関数です。

[slot] void QChronoTimer::start()

interval で指定されたタイムアウト時間に基づいて、タイマーを開始または再起動します。

タイマーがすでに実行中の場合は、stopped となり、再起動されます。これにより、id() の値も変更されます。

singleShot がtrueの場合、タイマーは1回のみ起動されます。

[slot] void QChronoTimer::stop()

タイマーを停止します。

start()も参照してください 。

[private signal] void QChronoTimer::timeout()

このシグナルは、タイマーがタイムアウトしたときに送信されます。

注:これは プライベートシグナルです。シグナル接続では使用できますが、ユーザーが発行することはできません。

関連項目: interval 、start()、およびstop()。

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

QObject::timerEvent(QTimerEvent *event) を再実装します。

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