QTimer Class
QTimerクラスは、繰り返しタイマーとシングル・ショット・タイマーを提供します。詳細...
ヘッダー | #include <QTimer> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
継承: | QObject |
- 継承されたメンバを含むすべてのメンバのリスト
- 非推奨メンバー
- QTimer はEvent Classes に含まれます。
プロパティ
|
|
パブリック機能
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 | 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::CoarseTimer とQt::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イベントループが実行されていなければなりません。
functor がcontext のメンバ関数の場合、その関数はオブジェクト上で呼び出されます。
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 への接続を作成する。接続へのハンドルを返す。
このメソッドは便宜上提供されています。呼び出しと同じです:
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() および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 がtrueの場合、タイマーは1回だけ起動します。
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()
このシグナルはタイマーがタイムアウトしたときに発せられる。
注意: これはプライベート・シグナルです。シグナル接続で使用することはできますが、ユーザーが発することはできません。
interval 、start()、stop()も参照のこと 。
[override virtual protected]
void QTimer::timerEvent(QTimerEvent *e)
再実装:QObject::timerEvent(QTimerEvent *event).
int QTimer::timerId() const
タイマーが実行中であればタイマーのIDを返し、そうでなければ-1を返す。
© 2025 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.