TapHandler QML Type

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

Import Statement: import QtQuick
Inherits:

SinglePointHandler

プロパティ

シグナル

詳細説明

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

有効なタップジェスチャの検出はgesturePolicy に依存します。デフォルト値は DragThreshold で、押下と放 置が空間的にも時間的にも近接している必要があります。この場合、DragHandler は受動的な掴みだけで機能するため、他のアイテムや入力ハンドラへのイベント配信を妨げません。したがって、デフォルトの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 ()を超えてはなりません。

MouseArea およびQt 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 が無効になっている場合、すべてのイベントが拒否され、シグナルは出力されません。


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 を変更することで修正できない場合、いくつかのケースは、このハンドラ、あるいはTapHandler が反応するのを防ぐべき別のハンドラで、grabPermissions を調整する方がよい。


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]

マウスまたはタッチポイントが押されたときは常に真を保持し、押されてからの動きは現在の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

このハンドラが操作するアイテム。

デフォルトでは、ハンドラが宣言されているアイテム(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()

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

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


singleTapped(eventPoint eventPoint, Qt::MouseButton button)

このシグナルは、parent アイテムが1回タップされたときに発せられます。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 です。


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