QTimer Class

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

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

プロパティ

パブリック関数

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 msec)
int timerId() const
Qt::TimerType timerType() const

パブリック・スロット

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

シグナル

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ミリ秒)タイマーの例(アナログ時計の例より):

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

以降、update() スロットが1秒ごとに呼び出される。

setSingleShot(true)を呼び出すことで、タイマーを一度だけタイムアウトするように設定できます。静的なQTimer::singleShot ()関数を使用して、指定した間隔の後にスロットを呼び出すこともできます:

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

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

他のスレッドからタイマーを開始することはできません。特殊なケースとして、タイムアウトが0のQTimerはできるだけ早くタイムアウトしますが、ゼロタイマーと他のイベント発生源の間の順序は指定されていません。ゼロ・タイマーを使用することで、キビキビしたユーザー・インターフェイスを提供しながら、いくつかの作業を行うことができます:

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

以降、processOneThing() が繰り返し呼び出される。それ以降、 は繰り返し呼び出されます。Qt がユーザーインターフェースにイベントを配信し、すべての処理を終えるとすぐにタイマーを停止できるように、タイマーは常に素早く(通常は1つのデータ項目を処理した後に)戻るように記述する必要があります。これは、GUIアプリケーションで重い作業を実装する伝統的な方法ですが、最近ではマルチスレッドがより多くのプラットフォームで利用できるようになってきているため、ゼロミリ秒のQTimerオブジェクトは徐々にQThreadsに取って代わられると予想されます。

精度とタイマーの分解能

タイマーの精度は、基盤となるオペレーティング・システムとハードウェアに依存する。ほとんどのプラットフォームは1ミリ秒の分解能をサポートしていますが、タイマーの精度は多くの実世界の状況ではこの分解能に等しくありません。

精度はtimer type にも依存します。Qt::PreciseTimer の場合、QTimerは精度を1ミリ秒に保とうとします。また、正確なタイマーは予想より早くタイムアウトすることはありません。

Qt::CoarseTimerQt::VeryCoarseTimer タイプの場合、QTimer はこれらのタイプのマージンの範囲内で、予想よりも早く目覚めることがあります:Qt::CoarseTimer では間隔の 5%、Qt::VeryCoarseTimer では 500 ms です。

システムがビジー状態であったり、要求された精度を提供できない場合、すべてのタイ マー型は予想より遅れてタイムアウトする可能性がある。このようなタイムアウト・オーバーランの場合、Qt はtimeout() を一度だけ、たとえ複数のタイムアウトがあったとしても出力します。

QTimerの代替

Qt 6.8 ではQChronoTimer が導入されました。この2つのクラスの主な違いは、QChronoTimer がより大きな間隔範囲とより高い精度 (std::chrono::nanoseconds) をサポートしていることです。QTimerの場合、サポートされる最大間隔は±24日ですが、QChronoTimer の場合は±292年です(std::numeric_limits<int>::max() よりも長い間隔でも、インタージャ・オーバーフローの可能性は低くなります)。ミリ秒の分解能と±24日の範囲だけが必要であれば、QTimerを使い続けることができる。

別の方法としては、QObject::timerEvent() メソッドをクラス(QObject のサブクラスである必要があります)に再実装し、以下のいずれかのアプローチを使用する方法があります:

  • タイマー ID をラップする軽量な値クラスであるQBasicTimer を使用する。QBasicTimer::start() でタイマーを開始し、QBasicTimer::stop() でタイマーを停止します。イベントを処理するには、timerEvent() を使用します。
  • より低レベルな方法は、タイマーIDを直接操作することです。タイマーを開始するには、QObject::startTimer ()を呼び、返されたIDを保存する。タイマーを停止するには、QObject::killTimer ()を呼び出す。再実装したtimerEvent ()でイベントを処理できる。この方法は通常、QBasicTimer を使用するよりも面倒である。

timerEvent() を使用することの欠点は、シングル・ショット・タイマーやシグナ ルなどの高レベルの機能がサポートされていないことである。

オペレーティング・システムによっては、使用できるタイマーの数が制限されています。

QBasicTimer,QTimerEvent,QObject::timerEvent(),Timers,Analog Clockも参照してください

プロパティの説明

[bindable read-only] active : bool

注意: このプロパティは、QProperty バインディングをサポートしています。

この boolean プロパティは、タイマーが動作している場合はtrue となり、そうでない場合は false となる。

[bindable] interval : int

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

このプロパティは、タイムアウト間隔をミリ秒単位で保持します。

このプロパティのデフォルト値は0です。タイムアウト間隔が0のQTimer 、ウィンドウシステムのイベントキュー内のすべてのイベントが処理されるとすぐにタイムアウトします。

実行中のタイマーのインターバルを設定すると、インターバルが変更され、stop ()、次にstart ()、新しいid ()を取得する。タイマーが実行中でない場合は、インターバルのみが変更される。

singleShotも参照のこと

[read-only] remainingTime : const int

このプロパティは、残り時間をミリ秒単位で保持します。

タイマーの残り時間をミリ秒単位で返します。タイマーが非アクティブの場合、返される値は -1 となり、タイマーが期限切れの場合、返される値は 0 となります。

アクセス関数:

int remainingTime() const

intervalも参照

[bindable] singleShot : bool

注意: このプロパティは、QProperty バインディングをサポートしています。

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

シングルショットタイマーは一度だけ発火し、シングルショットタイマーでないタイマーはinterval ミリ秒ごとに発火します。

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

interval およびsingleShot()も参照してください

[bindable] timerType : Qt::TimerType

注意: このプロパティは、QProperty バインディングをサポートしています。

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

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

Qt::TimerTypeも参照

メンバ関数ドキュメント

[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, Qt::TimerType timerType, const QObject *context, Functor &&functor)

[static] template <typename Duration, typename Functor> void QTimer::singleShot(Duration interval, const QObject *context, Functor &&functor)

この静的関数は、interval の後にfunctor を呼び出します。

この関数を使うと、わざわざtimerEvent を用意したり、ローカルのQTimer オブジェクトを作成したりする必要がないため、非常に便利です。

context が指定された場合、インターバルが発生する前にcontext オブジェクトが破棄されていない場合にのみ、functor が呼び出されます。このファンクタは、context のスレッドで実行されます。 コンテキストのスレッドでは、Qtイベントループが実行されていなければなりません。

functorcontext のメンバ関数の場合、その関数はオブジェクト上で呼び出されます。

interval パラメータには、int (ミリ秒カウントとして解釈される)、または暗黙的にナノ秒に変換されるstd::chrono 型を指定できます。

注意: 6.8より前のバージョンのQtでは、chronoのオーバーロードはchrono::nanosecondsではなくchrono::millisecondsでした。コンパイラは自動的に変換してくれますが、ミリ秒数が極端に大きい場合はオーバーフローする可能性があります。

注意:この関数はリエントラントである。

start()も参照

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

与えられたparent でタイマーを構築します。

[virtual noexcept] QTimer::~QTimer()

タイマーを破棄します。

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

タイマーのtimeout() シグナルからslot への接続を作成する。接続へのハンドルを返します。

このメソッドは便宜上提供されている。を呼び出すのと同じです:

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

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)

この関数は、callOnTimeout() をオーバーロードします。

context の特定のイベント・ループに配置するために、timeout() シグナルからslot への接続を作成し、その接続へのハンドルを返します。

このメソッドは便宜上提供されている。を呼び出すのと同じです:

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

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] void QTimer::singleShot(std::chrono::nanoseconds nsec, const QObject *receiver, const char *member)

これはオーバーロードされた関数です。

この静的関数は、与えられた時間間隔の後にスロットを呼び出します。

この関数を使うと、わざわざtimerEvent を用意したり、ローカルのQTimer オブジェクトを作成したりする必要がないので、非常に便利です。

receiver が受信オブジェクトで、member がスロットです。時間間隔は duration オブジェクトnsec で与えられます。

Note: 6.8より前のバージョンのQtでは、この関数は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 がスロットです。時間間隔はdurationオブジェクトnsec で与えられる。timerType はタイマーの精度に影響します。

注意: 6.8より前のバージョンのQtでは、この関数はchrono::nanosecondsではなく、chrono::millisecondsを受け取っていました。コンパイラは自動的に変換してくれますが、ミリ秒のカウントが極端に大きい場合はオーバーフローする可能性があります。

注意:この関数はリエントラントである。

start()も参照のこと

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

msec ミリ秒のタイムアウト間隔でタイマーを開始または再起動する。

タイマーがすでに動作している場合は、stopped 、再起動される。また、id() も変更されます。

singleShot がtrueの場合、タイマーは一度だけ起動される。これと同じである:

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

注意: ゼロ・タイマーでイベント・ループを忙しくしておくと、UIの動作が不安定になり、トラブルの原因になります。

[slot] void QTimer::start()

この関数はstart()をオーバーロードします。

interval で指定されたタイムアウトでタイマーを開始または再起動します。

タイマーがすでに動作している場合は、stopped 、再起動されます。また、id ()も変更されます。

singleShot が真の場合、タイマーは一度だけ起動されます。

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

これはオーバーロードされた関数です。

msec ミリ秒のタイムアウトでタイマーを開始または再起動します。

タイマーがすでに動いている場合は、stopped 、再起動されます。また、id ()も変更されます。

singleShot がtrueの場合、タイマーは一度だけ起動される。これは以下と等価である:

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

[slot] void QTimer::stop()

タイマーを停止します。

start()も参照

[private signal] void QTimer::timeout()

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

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

intervalstart()、stop()参照のこと。

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

再実装:QObject::timerEvent(QTimerEvent *event)。

int QTimer::timerId() const

タイマーが実行中であればタイマーの ID を返し、そうでなければ -1 を返します。

本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。