QTouchEvent Class

QTouchEventクラスは、タッチイベントを記述するパラメータを含んでいます。詳細...

Header: #include <QTouchEvent>
CMake: find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake: QT += gui
Inherits: QPointerEvent

パブリック関数

QTouchEvent(QEvent::Type eventType, const QPointingDevice *device = nullptr, Qt::KeyboardModifiers modifiers = Qt::NoModifier, const QList<QEventPoint> &touchPoints = {})
QObject *target() const
QEventPoint::States touchPointStates() const

再実装パブリック関数

virtual bool isBeginEvent() const override
virtual bool isEndEvent() const override
virtual bool isUpdateEvent() const override

詳細説明

タッチ・イベントの有効化

タッチイベントは、タッチデバイス(タッチスクリーンやトラックパッドなど)上の1つ以上のタッチポイントを押したり、離したり、動かしたりしたときに発生します。タッチイベントを受信するには、ウィジェットにQt::WA_AcceptTouchEvents 属性を設定し、グラフィックアイテムにacceptTouchEvents 属性を true に設定する必要があります。

QAbstractScrollArea ベースのウィジェットを使用する場合は、スクロールエリアのviewportQt::WA_AcceptTouchEvents 属性を有効にする必要があります。

QMouseEvent と同様に、Qt はウィジェット内で最初に押されたタッチ・ポイントを自動的に取得し、ウィジェットはタッチ・ポイントが離されるまで、そのタッチ・ポイントのすべての更新を受け取ります。また、複数のウィジェットが同時にタッチイベントを受信することもあります。

イベント処理

すべてのタッチイベントはQEvent::TouchBegin,QEvent::TouchUpdate,QEvent::TouchEnd またはQEvent::TouchCancel 型です。ウィジェットにはQWidget::event() またはQAbstractScrollArea::viewportEvent() を、グラフィック・ビューのアイテムにはQGraphicsItem::sceneEvent() を再実装して、タッチ・イベントを受け取ります。

ウィジェットとは異なり、QWindowsは常にタッチ イベントを受け取ります。QWindow を直接操作する場合は、QWindow::touchEvent() を再実装すれば十分です。

QEvent::TouchUpdateQEvent::TouchEnd イベントは、QEvent::TouchBegin イベントを受け入れたウィジェットまたはアイテムに送られます。QEvent::TouchBegin イベントが受け入れられず、イベントフィルターによってフィルターされない場合、次のQEvent::TouchBegin が送られるまで、それ以降のタッチイベントは送られない。

システムによっては、QEvent::TouchCancel のタイプのイベントを送るかもしれない。このイベントを受信すると、アプリケーションはアクティブなタッチシーケンス全体を無視するよう要求される。例えば、コンポジットされたシステムでは、コンポジターが特定のジェスチャーをシステ ム全体のジェスチャーとして扱うことを決定する場合があります。このような決定が行われる(ジェスチャが認識される)たびに、QEvent::TouchCancel イベントがクライアントに通知されるため、クライアントはそれに応じて状態を更新できます。

pointCount() およびpoint() 関数を使用すると、個々のタッチ・ポイントにアクセスして反復処理できます。

points()関数は、イベントに含まれるすべてのタッチポイントのリストを返す。このリストは、QEvent::TouchCancel イベントの場合など、空である可能性があることに注意。各ポイントはQEventPoint クラスのインスタンスである。QEventPoint::State enumは、タッチ・ポイントが持つ可能性のあるさまざまな状態を記述する。

注: points() のリストは決して部分的なものではありません:タッチイベントは常に、イベントが送信されたウィンドウまたはウィジェットをターゲットとする、既存の物理的なタッチコンタクトごとにタッチポイントを含みます。例えば、すべてのタッチが同じウィンドウまたはウィジェットをターゲットにしていると仮定すると、points().count()==2 の条件を持つイベントは、タッチスクリーンまたはタッチパッドに触れている指の数がちょうど2本であることを意味することが保証されます。

イベントの配信と伝播

デフォルトでは、QGuiApplication は QTouchEvent の最初のタッチポイントをQMouseEvent に変換します。これにより、通常は QTouchEvent を処理しない既存のウィジェットでタッチイベントを有効にすることができます。これを行う際に必要ないくつかの特別な考慮事項については、以下を参照してください。

QEvent::TouchBegin は、ウィジェットに送信される最初のタッチイベントです。 イベントには、レシーバがイベントを希望するかどうかを示す特別な accept フラグが含まれます。デフォルトでは、イベントは受け付けられます。タッチイベントがウィジェットで処理されない場合は、 () を呼び出す必要があります。 イベントは、ウィジェットが () でイベントを受け入れるか、イベント・フィルタがイベントを消費するまで、親ウィジェット・チェーンに伝搬されます。QGraphicsItems の場合、 イベントはマウス下のアイテムに伝搬されます(QGraphicsItems のマウスイベント伝搬と同様)。QEvent::TouchBegin ignore QEvent::TouchBegin accept QEvent::TouchBegin

タッチポイントのグループ化

前述のように、複数のウィジェットが同時に QTouchEvent を受信する可能性があります。しかし、Qt は、QEvent::TouchBegin イベントを同じウィジェットに重複して送信しないようにします。例えば、QGroupBox 内の 2 つの別々のウィジェットにユーザがタッチし、両方のウィジェットがQEvent::TouchBegin イベントを無視した場合、伝搬中に理論上起こり得ます。

これを避けるために、Qt は以下のルールで新しいタッチポイントをグループ化します:

  • 最初のタッチポイントが検出されると、まず画面上の位置によって、次に伝播ルールによって、移動先のウィジェットが決定されます。
  • 追加のタッチ ポイントが検出されると、Qt はまず、新しいタッチ ポイントの下にあるウィジェットの祖先または子孫にアクティブなタッチ ポイントがあるかどうかを確認します。存在する場合、新しいタッチ ポイントは最初のタッチ ポイントとグループ化され、新しいタッチ ポイントは 1 つの QTouchEvent で最初のタッチ ポイントを処理したウィジェットに送信されます。(新しいタッチポイントの下のウィジェットはイベントを受信しません)。

これにより、QTouchEvent の順序が常に正しいことを確認しながら、兄弟ウィジェットが独立してタッチイベントを処理できるようになります。

マウス・イベントとタッチ・イベントの合成

QTouchEvent の配信は、QMouseEvent の配信とは独立しています。アプリケーションフラグQt::AA_SynthesizeTouchForUnhandledMouseEventsQt::AA_SynthesizeMouseForUnhandledTouchEvents を使用して、タッチイベントからマウスイベント、マウスイベントからタッチイベントへの自動合成を有効または無効にできます。

注意点

  • 前述のように、タッチイベントを有効にするということは、複数のウィジェットが同時にタッチイ ベントを受信できることを意味します。QTouchEvents のデフォルトのQWidget::event() 処理と組み合わせることで、タッチ・ユーザー・インターフェイスのデザインに大きな柔軟性が生まれます。注意しなければならないことがあります。例えば、ユーザーが1本の指でQSlider を動かし、もう1本の指でQPushButton を押している可能性があります。これらのウィジェットが発するシグナルはインターリーブされます。
  • QTouchEventイベント・ハンドラ内のexec()メソッド(例えば、QDialog::exec()やQMenu::exec())の1つを使用したイベント・ループへの再帰はサポートされていません。複数のイベント受信者が存在するため、再帰は、イベントの損失や予期しない無限再帰などの問題を引き起こす可能性があります。
  • QTouchEvent は、mouse grab またはactive pop-up widget の影響を受けません。アクティブなタッチ・ポイントが複数あるときにポップアップを開いたり、マウスをつかんだりしたときの QTouchEvent の動作は未定義です。

QEventPoint,QEventPoint::State,Qt::WA_AcceptTouchEvents, およびQGraphicsItem::acceptTouchEvents()も参照してください

メンバ関数ドキュメント

[explicit] QTouchEvent::QTouchEvent(QEvent::Type eventType, const QPointingDevice *device = nullptr, Qt::KeyboardModifiers modifiers = Qt::NoModifier, const QList<QEventPoint> &touchPoints = {})

与えられたeventType,device,touchPoints, およびイベント発生時の現在のキーボードmodifiers で QTouchEvent を構築します。

[override virtual] bool QTouchEvent::isBeginEvent() const

このイベントが新しく押されたタッチポイントを少なくとも 1 つ含む場合、true を返します。

[override virtual] bool QTouchEvent::isEndEvent() const

このイベントが新しく離されたタッチポイントを少なくとも 1 つ含む場合、true を返します。

[override virtual] bool QTouchEvent::isUpdateEvent() const

このイベントが新たに押されたタッチ ポイントまたは新たに離されたタッチ ポイントを含まない場合、true を返します。

QObject *QTouchEvent::target() const

イベントが発生したウィンドウ内のターゲット オブジェクトを返します。これは通常、QWidget またはQQuickItem です。 特定のターゲットがない場合は 0 になることがあります。

QEventPoint::States QTouchEvent::touchPointStates() const

このイベントのすべてのタッチポイントの状態のビット OR を返します。

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