このページでは

TapHandler QML Type

タップとクリックのハンドラ。もっと見る...

Import Statement: import QtQuick
Inherits:

SinglePointHandler

プロパティ

信号

詳細説明

TapHandler は、タッチスクリーンのタップまたはマウスのクリックのハンドラです。

有効なタップジェスチャの検出はgesturePolicy に依存します。デフォルト値は DragThreshold で、押下と解放が空間的にも時間的にも近接している必要があります。この場合、TapHandler はパッシブグラブのみで機能するため、他のアイテムや入力ハンドラへのイベント配信を妨げません。したがって、デフォルトのgesturePolicy は、バインディングおよび/または JavaScript コールバックを持つ TapHandler を追加して、既存のコントロールまたはアイテムの動作を変更する場合に便利です。

QPushButtonボタンを押してから気が変わったら、クリックをキャンセルするためにボタンの端からずっとドラッグする必要があります。この使用例では、gesturePolicyTapHandler.ReleaseWithinBounds に設定します。

import QtQuick

Rectangle {
    id: button
    signal clicked
    property alias text: buttonLabel.text

    height: Math.max(Screen.pixelDensity * 7, buttonLabel.implicitHeight * 1.2)
    width: Math.max(Screen.pixelDensity * 11, buttonLabel.implicitWidth * 1.3)
    radius: 3
    property color dark: Qt.darker(palette.button, 1.3)
    gradient: Gradient {
        GradientStop { position: 0.0; color: tapHandler.pressed ? dark : palette.button }
        GradientStop { position: 1.0; color: dark }
    }

    TapHandler {
        id: tapHandler
        gesturePolicy: TapHandler.ReleaseWithinBounds
        onTapped: button.clicked()
    }

    Text {
        id: buttonLabel
        text: "Click Me"
        color: palette.buttonText
        anchors.centerIn: parent
    }
}

マルチタップジェスチャー(ダブルタップ、トリプルタップなど)の場合、移動距離はマウスでQStyleHints::mouseDoubleClickDistance ()、タッチでQStyleHints::touchDoubleTapDistance ()を超えてはならず、タップ間の時間はQStyleHints::mouseDoubleClickInterval ()を超えてはなりません。

MouseAreaQt Quick Examples - Pointer Handlersも参照してください

プロパティのドキュメント

acceptedButtons : flags

このポインタハンドラを起動できるマウスボタン。

デフォルトでは、このプロパティはQt.LeftButton に設定されています。 マウスボタンの OR の組み合わせに設定することができ、他のボタンからのイベントは無視されます。

例えば、コントロールが左クリックと右クリックに異なる方法で反応するように、2つのハンドラを設定することができます:

Item {
    TapHandler {
        onTapped: console.log("left clicked")
    }
    TapHandler {
        acceptedButtons: Qt.RightButton
        onTapped: console.log("right clicked")
    }
}

注: タッチスクリーンをタップしたり、グラフィックタブレットのスタイラスをタップしたりすると、マウスの左ボタンをクリックしたことになります。この動作はacceptedDevices またはacceptedPointerTypes で変更できます。

acceptedDevices : flags

このポインタハンドラを起動できるポインティングデバイスのタイプ。

デフォルトでは、このプロパティはPointerDevice.AllDevices に設定されています。 デバイスタイプの OR の組み合わせに設定すると、一致しないデバイスからのイベントは無視されます。

例えば、マウスやスタイラスのクリックに反応するコントロールと、タッチスクリーンのタップに反応するコントロールを、2つのハンドラで使い分けることができます:

Item {
   TapHandler {
       acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad | PointerDevice.Stylus
       onTapped: console.log("clicked")
   }
   TapHandler {
       acceptedDevices: PointerDevice.TouchScreen
       onTapped: console.log("tapped")
   }
}

注意: すべてのプラットフォームがマウスとタッチパッドを区別できるわけではありません。区別できるプラットフォームでは、マウスとタッチパッドの動作を同じにしたい場合がよくあります。

acceptedModifiers : flags

このプロパティが設定されると、ポインタ・イベントに反応するために、指定されたキーボード修飾キーが押されることを要求し、そうでなければ無視する。

このプロパティがQt.KeyboardModifierMask (デフォルト値)に設定されている場合、PointerHandler は修飾キーを無視する。

例えば、Item は同じタイプのハンドラを2つ持つことができ、そのうちの1つは、必要なキーボード修飾子が押された場合にのみ有効になる:

Item {
   TapHandler {
       acceptedModifiers: Qt.ControlModifier
       onTapped: console.log("control-tapped")
   }
   TapHandler {
       acceptedModifiers: Qt.NoModifier
       onTapped: console.log("tapped")
   }
}

acceptedModifiers を修飾キーの OR の組み合わせに設定した場合、ハンドラを有効にするには、それらの修飾キーがすべて押されなければならないことを意味します:

Item {
   TapHandler {
       acceptedModifiers: Qt.ControlModifier | Qt.AltModifier | Qt.ShiftModifier
       onTapped: console.log("control-alt-shift-tapped")
   }
}

使用可能な修飾子は以下の通りです:

定数説明
NoModifier修飾キーは使用できません。
ShiftModifierキーボードのShiftキーが押されていなければならない。
ControlModifierキーボードの Ctrl キーが押されていなければならない。
AltModifierキーボードのAltキーが押されていること。
MetaModifierキーボードのMetaキーが押されていなければならない。
KeypadModifierキーパッドのボタンが押されていること。
GroupSwitchModifierX11のみ(Windowsではコマンドライン引数で有効にしない)。キーボードのMode_switchキーが押されていなければならない。
KeyboardModifierMaskハンドラーは、どの修飾子が押されたかは気にしない。

複数のハンドラと複数の修飾子フラグの組み合わせで実現できるよりもさらに複雑な動作が必要な場合は、JavaScriptコードで修飾子をチェックできます:

Item {
    TapHandler {
        onTapped:
            switch (point.modifiers) {
            case Qt.ControlModifier | Qt.AltModifier:
                console.log("CTRL+ALT");
                break;
            case Qt.ControlModifier | Qt.AltModifier | Qt.MetaModifier:
                console.log("CTRL+META+ALT");
                break;
            default:
                console.log("other modifiers", point.modifiers);
                break;
            }
    }
}

Qt::KeyboardModifierも参照してください

acceptedPointerTypes : flags

このポインタハンドラをアクティブにできるポインティングデバイス(指、スタイラス、消しゴムなど)のタイプ。

デフォルトでは、このプロパティはPointerDevice.AllPointerTypes に設定されています。 デバイスタイプの OR の組み合わせに設定すると、一致しないdevices からのイベントは無視されます。

たとえば、マウス、タッチ、スタイラスのクリックには何らかの方法で反応するが、グラフィック・タブレットの消しゴムツールでタップすると自身を削除するようなコントロールを、2つのハンドラで作成することができます:

Rectangle {
   id: rect
   TapHandler {
       acceptedPointerTypes: PointerDevice.Generic | PointerDevice.Finger | PointerDevice.Pen
       onTapped: console.log("clicked")
   }
   TapHandler {
       acceptedPointerTypes: PointerDevice.Eraser
       onTapped: rect.destroy()
   }
}

active : bool [read-only]

これは、この入力ハンドラが1つ以上のeventPoints 、それらのポ イントの排他的なグラブに成功することで、それらのハンドラをハンドリングす るための唯一の責任を取ったときはいつでも、true を保持する。これは、この入力ハンドラが、それらのイベントポイントの動きに応じてその プロパティを最新に保ち、target (もしあれば)を積極的に操作してい ることを意味する。

cursorShape : Qt::CursorShape

このプロパティは、activetrue である間、マウスがparent アイテムの上に置かれたときに表示されるカーソル形状を保持します。

利用可能なカーソル形状は以下の通りです:

  • Qt.ArrowCursor
  • Qt.UpArrowCursor
  • Qt.CrossCursor
  • Qt.WaitCursor
  • Qt.IBeamCursor
  • Qt.SizeVerCursor
  • Qt.SizeHorCursor
  • Qt.SizeBDiagCursor
  • Qt.SizeFDiagCursor
  • Qt.SizeAllCursor
  • Qt.BlankCursor
  • Qt.SplitVCursor
  • Qt.SplitHCursor
  • Qt.PointingHandCursor
  • Qt.ForbiddenCursor
  • Qt.WhatsThisCursor
  • Qt.BusyCursor
  • Qt.OpenHandCursor
  • Qt.ClosedHandCursor
  • Qt.DragCopyCursor
  • Qt.DragMoveCursor
  • Qt.DragLinkCursor

デフォルト値は設定されていないため、parent アイテムのcursor が表示されます。このプロパティは、undefined に設定することで、同じ初期状態に戻すことができます。

注意: このプロパティが設定されていない場合、またはundefined に設定されている場合、値を読み取るとQt.ArrowCursor を返します。

Qt::CursorShapeQQuickItem::cursor()、HoverHandler::cursorShapeも参照のこと

dragThreshold : int

ドラッグ ジェスチャとして扱うために、ユーザーがeventPoint をドラッグする距離をピクセル単位で指定します。

デフォルト値はプラットフォームと画面解像度によって異なります。undefinedに設定することで、デフォルト値に戻すことができます。ドラッグ ジェスチャが開始したときの動作は、ハンドラによって異なります。

enabled : bool

PointerHandler が無効化されると、すべてのイベントを拒否し、シグナルは発せられない。

PointerHandlerparentdisabled の場合、enabled プロパティがtrue のままでも、ハンドラは事実上無効になる。

注: HoverHandler は異なる動作をします。詳しくはenabled プロパティのドキュメントを参照してください。

exclusiveSignals : enumeration [since 6.5]

singleTapped() とdoubleTapped() シグナルの排他性を決定する。

定数説明
NotExclusive(デフォルト)singleTapped() とdoubleTapped() は、それぞれユーザが1回または2回タップしたときに即座に発せられます。
SingleTapsingleTapped() は、ユーザが1回タップすると即座に発せられ、doubleTapped() は発せられない。
DoubleTapdoubleTapped() は、ユーザーが2回タップすると即座に発せられ、singleTapped() は発せられない。
(SingleTap | DoubleTap)どちらの信号もQStyleHints::mouseDoubleClickInterval()まで遅延されるため、singleTapped()またはdoubleTapped()のどちらかを発することはできるが、両方を発することはできない。しかし、mouseDoubleClickInterval 内に3回以上のタップが発生すると、どちらのシグナルも発せられない。

注: tapped() やtapCountChanged() などの残りのシグナルは、このプロパティに関係なく、常に即座に発信されます。

このプロパティはQt 6.5で導入されました。

gesturePolicy : enumeration

タップまたは長押しジェスチャーが認識されるための空間的制約。さらに、longPressThreshold が経過する前にリリースされなければならないという制約もある。これらの制約が満たされない場合、tapped シグナルは発せられず、tapCount はインクリメントされない。空間制約に違反した場合、pressed 、保持された時間に関係なく、直ちにtrueからfalseに遷移する。

gesturePolicy は、後述するグラブの動作にも影響する。

定数説明
TapHandler.DragThreshold

プレス時のグラブ:パッシブ

(デフォルト値)eventPoint が大きく動いてはいけません。マウス、指、またはスタイラスがシステム全体のドラッグしきい値 (QStyleHints::startDragDistance) を超えて移動した場合、デバイスまたは指が押されたままであっても、タップジェスチャはキャンセルされます。このポリシーは、TapHandler が他の入力ハンドラ(たとえばDragHandler )やイベント処理アイテム(たとえば Qt Quick Controlsこの場合、TapHandler は排他的なグラブを取らず、単にpassive grab を取るからです。つまり、DragThreshold は、既存の動作を補強するのに特に便利です。別のアイテムやハンドラがすでに反応しているときでも、タップ/クリック/長押しに反応し、おそらく UI の別のレイヤーでも反応します。次のスニペットは、1つのコンポーネントで使用される1つのTapHandler 。しかし、コンポーネントのインスタンスを2つ重ねると、受動的なグラブはイベント伝播を止めないので、それらの両方でプレスが発生したときに、それらの両方のハンドラが同時に反応するのがわかります:
Item {
    width: 120; height: 80

    component Button : Rectangle {
        TapHandler {
            id: tapHandler
            gesturePolicy: TapHandler.DragThreshold // the default
            onTapped: tapFlash.start()
        }
    }

    Button { x: 10; y: 10 }
    Button { x: 30; y: 30 }
}
TapHandler.WithinBounds

プレス時のグラブ:排他的

eventPointparent アイテムの境界を離れると、タップジェスチャはキャンセルされます。TapHandler は押されるとexclusive grab を取りますが、境界の制約が満たされなくなるとすぐにグラブを解除します。
TapHandler {
    id: tapHandler
    gesturePolicy: TapHandler.WithinBounds
    onTapped: tapFlash.start()
}
TapHandler.ReleaseWithinBounds

プレス時のグラブ:排他的

リリース時(マウスボタンが離されるか、指が持ち上げられる)、eventPointparent アイテムの境界の外にある場合、タップジェスチャは認識されません。これは、ボタンウィジェットの典型的な動作に対応しています。ボタンの外側をドラッグすることでクリックをキャンセルでき、リリース前にボタンの内側をドラッグして戻ることで変更することもできます。このジェスチャーを検出するには、TapHandler が押下時にexclusive grab を取得し、離すまで保持する必要があることに注意してください。
TapHandler {
    id: tapHandler
    gesturePolicy: TapHandler.ReleaseWithinBounds
    onTapped: tapFlash.start()
}
TapHandler.DragWithinBounds

押下時につかむ:排他的

押されたとき、TapHandlerexclusive grab を取ります。その後、eventPointparent アイテムの境界内でドラッグできます。timeHeld プロパティはカウントを続け、longPressed() シグナルはドラッグ距離に関係なく発せられます。ただし、WithinBounds と同様に、ポイントが境界を離れると、タップ・ジェスチャーはcanceled() となり、active() は false となり、timeHeld はカウントを停止します。これは、単一のTapHandler が押下を検出し、timeHeld が「開く」アニメーションを駆動し、ユーザーがメニュー項目にドラッグして離すことができ、メニューを含む親シーンの境界を離れることがない、メニューのような押下-ドラッグ-離すコンポーネントの実装に適しています。この値は Qt 6.3 で追加されました。
TapHandler {
    id: menuPopupHandler
    gesturePolicy: TapHandler.DragWithinBounds
    onPressedChanged:
        if (pressed) {
            menu.x = point.position.x - menu.width / 2
            menu.y = point.position.y - menu.height / 2
        } else {
            feedback.text = menu.highlightedMenuItem
            selectFlash.start()
        }
    onCanceled: feedback.text = "canceled"
}

Qt Quick Examples - Pointer Handlersは、これらの使用例を示しています。

注意: TapHandler が他の動作と衝突するようなケースで反応していることがわかったら、最初に試 すべきことは、どのgesturePolicy が適切かを考えることです。gesturePolicy を変更しても直らない場合は、grabPermissions を調整した方がよいケースもあります。このハンドラか、TapHandler が反応しないようにする別のハンドラのどちらかで調整するのがよいでしょう。

grabPermissions : flags

このプロパティは、このハンドラのロジックが排他グラブを引き継ぐことを決定した場合、または他のハンドラからグラブの引き継ぎやキャンセルを承認するよう求められた場合のパーミッションを指定します。

定数説明
PointerHandler.TakeOverForbiddenこのハンドラは、ItemまたはHandlerのどのタイプからもグラブ許可を取らず、与えません。
PointerHandler.CanTakeOverFromHandlersOfSameTypeこのハンドラは、同じクラスの他のハンドラから排他的グラブを取ることができます。
PointerHandler.CanTakeOverFromHandlersOfDifferentTypeこのハンドラは、あらゆる種類のハンドラから排他的なグラブを取ることができます。
PointerHandler.CanTakeOverFromItemsこのハンドラは、どのタイプのItemからも排他的グラブを取ることができます。
PointerHandler.CanTakeOverFromAnythingこのハンドラは、どのタイプのアイテムまたはハンドラからも排他的グラブを取ることができます。
PointerHandler.ApprovesTakeOverByHandlersOfSameTypeこのハンドラーは、同じクラスの他のハンドラーがグラブを取ることを許可します。
PointerHandler.ApprovesTakeOverByHandlersOfDifferentTypeこのハンドラーは、あらゆる種類のハンドラーにグラブを取る許可を与えます。
PointerHandler.ApprovesTakeOverByItemsこのハンドラーは、あらゆる種類のItemがグラブを取ることを許可します。
PointerHandler.ApprovesCancellationこのハンドラは、そのグラブが null に設定されることを許可します。
PointerHandler.ApprovesTakeOverByAnythingこのハンドラはどのタイプのItemやハンドラにもグラブを取る許可を与えます。

デフォルトはPointerHandler.CanTakeOverFromItems | PointerHandler.CanTakeOverFromHandlersOfDifferentType | PointerHandler.ApprovesTakeOverByAnything で、ほとんどの引き継ぎシナリオを許可しますが、例えば2つのPinchHandlerが同じタッチポイントを取り合うことを避けます。

longPressThreshold : real

値が0 より大きい場合、長押しジェスチャをトリガしてlongPressed() シグナルを発するために、eventPoint が押されなければならない時間(秒)。この制限時間前にポイントが離された場合、gesturePolicy 制約が満たされていれば、タップを検出することができます。longPressThreshold0 の場合、タイマーは無効になり、信号は発せられない。longPressThresholdundefined に設定されている場合、代わりにデフォルト値が使用され、このプロパティから読み出すことができます。

デフォルト値は、秒に変換されたQStyleHints::mousePressAndHoldInterval() です。

margin : real

eventPoint がこのハンドラを起動できる、parent アイテムの境界を超えたマージン。例えば、targetparent でもあるようなPinchHandler では、parent が非常に小さいサイズに縮小されてもピンチジェスチャーが可能なように、一般的なユーザーの指の幅の半分以上の距離に設定すると便利です。また、TapHandler ベースのボタンが画面の端の近くに配置されている場合、フィッツの法則に準拠するために使用することができます:ボタンが視覚的に端から数ピクセル離れていても、画面の端でマウスクリックに反応します。

デフォルト値は0です。

parent : Item

ハンドラのスコープであるItem; それが宣言されたItem。ハンドラはこのItemに代わってイベントを処理する。つまり、ポインタイベントは、そのeventPoints の少なくとも1つがItemの内部で発生する場合に関連する。最初はtarget() が同じであるが、再割り当てが可能である。

target およびQObject::parent()も参照

point : handlerPoint [read-only]

eventPoint 現在扱われている点。現在扱われている点がない場合、このオブジェクトはデフォルト値(すべての座標が0)にリセットされる。

pressed : bool [read-only]

マウスまたはタッチポイントが押されるたびにtrueを保持し、押されてからの動きは現在のgesturePolicy に準拠する。eventPoint が離されるか、ポリシーに違反すると、pressed はfalse に変わる。

tapCount : int [read-only]

1つのジェスチャーとみなされる時間と空間の制約の中で発生したタップの数。ボタンが変更されると、カウンタは1にリセットされる。たとえば、トリプルタップを検出するには、次のように記述します:

Rectangle {
    width: 100; height: 30
    signal tripleTap
    TapHandler {
        acceptedButtons: Qt.AllButtons
        onTapped: if (tapCount == 3) tripleTap()
    }
}

target : Item

このハンドラが操作するItem。

デフォルトでは、ハンドラが宣言されているItem(parent )と同じである。しかし、あるItem内のイベントを処理しながら別のItemを操作するために、ターゲットを別のItemに設定したり、null 、デフォルトの動作を無効にして、代わりに別の動作を行うために、ターゲットを別のItemに設定すると便利な場合がある。

timeHeld : real [read-only]

ドラッグのしきい値を超えることなく、押されたポイントが保持されている時間(秒)。レンダリングされるフレームごとに少なくとも1回更新され、長押しによってトリガーされるアクションの進行状況を示すアニメーションをレンダリングすることができます。また、長押しの長さに応じて、一連のアクションのいずれかをトリガーすることも可能です。

ゼロ未満の値は、このハンドラのItem 内にポイントが保持されていないことを意味する。

注: gesturePolicyTapHandler.DragWithinBounds に設定されている場合、timeHeld は、押された点がドラッグしきい値を超えて移動してもカウントを停止せず、点がparent アイテムのbounds から離れたときのみカウントを停止する。

シグナル・ドキュメント

canceled(eventPoint point)

このハンドラがすでに与えられたpoint をグラブしている場合、グラブが別のポインタハンドラまたはアイテムによって盗まれると、このシグナルが発行されます。

注: 対応するハンドラはonCanceled です。

doubleTapped(eventPoint eventPoint, Qt::MouseButton button)

この信号は、parent アイテムが短い時間 (QStyleHints::mouseDoubleClickInterval()) と距離 (QStyleHints::mouseDoubleClickDistance() またはQStyleHints::touchDoubleTapDistance()) の間に 2 回タップされたときに発せられる。このシグナルは常にsingleTappedtappedtapCountChanged の後に発生する。eventPoint シグナル・パラメータには、タップされたポイントに関するリリース・イベントの情報が含まれ、button はクリックされたmouse button であり、タッチスクリーンではNoButton である。

注: 対応するハンドラはonDoubleTapped です。

grabChanged(PointerDevice::GrabTransition transition, eventPoint point)

このシグナルは、グラブがこのハンドラに関連する何らかの方法で変更されたときに発せられる。

transition (動詞)は何が起こったかを示す。point (オブジェクト)は、グラブされた、またはグラブされなかったポイントです。

transition の有効な値は以下の通りです:

定数説明
PointerDevice.GrabExclusiveこのハンドラは、point を処理するための主要な責任を取った。
PointerDevice.UngrabExclusiveこのハンドラは、以前の排他的グラブを放棄した。
PointerDevice.CancelGrabExclusiveこのハンドラの排他的グラブは引き継がれたかキャンセルされた。
PointerDevice.GrabPassiveこのハンドラは、point を監視するために、パッシブグラブを獲得した。
PointerDevice.UngrabPassiveこのハンドラーは以前のパッシブグラブを放棄した。
PointerDevice.CancelGrabPassiveこのハンドラの前のパッシブグラブが異常終了した。

注: 対応するハンドラはonGrabChanged

longPressed()

このシグナルは、parent アイテムが押され、longPressThreshold を超える時間保持されたときに発せられます。 つまり、タッチポイントやボタンを長押ししても、どの動きもドラッグしきい値を超えない場合、timeHeldlongPressThreshold を超えた時点で、longPressed シグナルが発せられます。

注: 対応するハンドラはonLongPressed です。

singleTapped(eventPoint eventPoint, Qt::MouseButton button)

この信号は、parent アイテムが一度タップされたときに発せられる。QStyleHints::mouseDoubleClickInterval を超える時間が経過すると、再度タップすることができますが、次のタップまでの時間が短い場合、tapCount が増加します。eventPoint シグナル・パラメータには、タップされたポイントに関するリリース・イベントの情報が含まれ、button はクリックされたmouse button であり、タッチスクリーンではNoButton である。

注: 対応するハンドラはonSingleTapped です。

tapCountChanged()

このシグナルは、parent アイテムが(指定された時間と距離の範囲内で)1回以上タップされ、現在のtapCount が前のtapCount と異なるときに発せられる。

注: 対応するハンドラはonTapCountChanged

tapped(eventPoint eventPoint, Qt::MouseButton button)

この信号は、parent アイテムがタップされるたびに発せられる。

つまり、longPressThreshold 以下の時間内にタッチポイントまたはボタンを押してから離すと、どのような動きもドラッグしきい値を超えないため、tapped シグナルがリリース時に発信されます。eventPoint シグナル・パラメータには、タップされたポイントに関するリリース・イベントの情報が含まれ、button はクリックされたmouse button 、タッチスクリーンではNoButton です。

import QtQuick

Rectangle {
    width: 100
    height: 100

    TapHandler {
        acceptedButtons: Qt.LeftButton | Qt.RightButton
        onTapped: (eventPoint, button)=> console.log("tapped", eventPoint.device.name,
                                             "button", button,
                                             "@", eventPoint.scenePosition)
    }
}

注: 対応するハンドラはonTapped です。

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