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はイベントクラスの一部です。
プロパティ
|
|
パブリック関数
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 が真の場合、タイマーは一度だけ起動されます。
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 を返します。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。