本页内容

PointerDeviceHandler QML Type

具有设备特定约束条件的指针事件抽象处理程序。更多内容...

Import Statement: import QtQuick
Inherits:

PointerHandler

Inherited By:

DragHandler, HoverHandler, MultiPointHandler, PinchHandler, PointHandler, SinglePointHandler, TapHandler, and WheelHandler

Status: Technology preview

此类型处于技术预览阶段,可能会有变动。

属性

信号

  • canceled(eventPoint point)
  • grabChanged(PointerDevice::GrabTransition transition, eventPoint point)

详细说明

一个用于处理程序的中间类(未注册为 QML 类型),允许根据设备类型、指针类型或键盘修饰键进行过滤。

属性文档

acceptedButtons : flags

可触发此指针处理程序的鼠标按钮。

默认情况下,此属性设置为Qt.LeftButton 。它可以设置为鼠标按钮的“或”组合,并将忽略来自其他按钮的事件。

例如,可以通过两个处理程序使控件对左键和右键点击做出不同的响应:

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

注意: 在触摸屏上轻点 或用数位板笔轻点,会模拟点击鼠标左键。可通过acceptedDevices 或acceptedPointerTypes 更改此行为。

acceptedDevices : flags

可以触发此指针处理程序的指针设备类型。

默认情况下,此属性设置为PointerDevice.AllDevices 。若将其设置为设备类型的“或”组合,则会忽略来自不匹配设备的事件。

例如,可以通过两个处理程序使控件对鼠标和手写笔的点击做出一种响应,对触摸屏的轻触做出另一种响应:

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 可以包含两个同类型的处理程序,其中一个仅在按下所需的键盘修饰键时才被启用:

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

若将“acceptedModifiers ”设置为修饰键的“或”组合,则意味着必须按下所有这些修饰键才能激活该处理程序:

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必须按下数字小键盘上的按键。
GroupSwitchModifier仅限 X11(除非在 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 。若将其设置为设备类型的“或”组合,则会忽略来自不匹配的devices 的事件。

例如,可以通过两个处理程序使某个控件以某种方式响应鼠标、触摸和触控笔的点击,但若在图形输入板上用橡皮擦工具轻点该控件,则将其删除:

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]

当该输入处理程序通过成功独占获取一个或多个事件点(eventPoints ),从而承担起处理这些事件点的全部责任时,此方法将返回true 。这意味着它会根据这些事件点的移动情况实时更新其属性,并主动操作其事件点数组(target )(如有)。

cursorShape : Qt::CursorShape

当“active ”的值设为true 时,该属性将保存鼠标悬停在parent 项上时显示的光标形状。

可用的光标形状包括:

  • Qt.ArrowCursor
  • Qt.UpArrowCursor
  • Qt.CrossCursor
  • Qt.WaitCursor
  • Qt.IBeamCursor
  • Qt.SizeVerCursor
  • Qt.SizeHorCursor
  • Qt.SizeBDiagCursor
  • Qt.SizeFDiagCursor
  • Qt.SizeAllCursor
  • Qt.BlankCursor
  • Qt.SplitV光标
  • Qt.SplitHCursor
  • Qt.指手光标
  • Qt.禁止光标
  • Qt.什么是这个光标
  • Qt.BusyCursor
  • Qt.张开手形光标
  • Qt.紧握手形光标
  • Qt.拖拽复制光标
  • Qt.拖动移动光标
  • Qt.DragLinkCursor

默认值未设置,这将使parent 项的cursor 显示出来。通过将该属性设置为undefined,可以将其重置为初始状态。

注意:当 此属性未被设置,或已被设置为undefined时 ,若读取其值,将返回Qt.ArrowCursor 。

另请参阅 Qt::CursorShape 、QQuickItem::cursor() 和HoverHandler::cursorShape 。

dragThreshold : int

用户必须将eventPoint 拖动多少像素,该操作才会被视为拖动手势。

默认值取决于平台和屏幕分辨率。将其设置为 undefined 可将其重置为默认值。不同处理程序在拖动手势开始时的行为各不相同。

enabled : bool

如果禁用了PointerHandler ,它将拒绝所有事件,且不会发出任何信号。

如果PointerHandler 的parent 为disabled ,则该处理程序也将被有效禁用,即使enabled 属性仍为true 。

注意: HoverHandler 的行为有所不同:有关更多信息,请参阅其enabled 属性的文档。

grabPermissions : flags

此属性指定了当该处理程序的逻辑决定接管独占抓取时,或者当被其他处理程序请求批准接管或取消抓取时,所适用的权限。

常量描述
PointerHandler.TakeOverForbidden该处理程序既不会从任何类型的 Item 或 Handler 处获取抓取权限,也不会向其授予抓取权限。
PointerHandler.CanTakeOverFromHandlersOfSameType该处理程序可以从同一类的另一个处理程序那里接管独占抓取。
PointerHandler.CanTakeOverFromHandlersOfDifferentType该处理程序可以从任何类型的处理程序手中接管独占抓取。
PointerHandler.CanTakeOverFromItems此处理程序可以从任何类型的项目上获取独占抓取权限。
PointerHandler.CanTakeOverFromAnything此处理程序可以从任何类型的项目或处理程序那里获取排他性抓取权限。
PointerHandler.ApprovesTakeOverByHandlersOfSameType此处理程序允许同一类的另一个处理程序获取抓取。
PointerHandler.ApprovesTakeOverByHandlersOfDifferentType此处理程序允许任何类型的处理程序获取抓取。
PointerHandler.ApprovesTakeOverByItems此处理程序允许任何类型的 Item 获取抓取。
PointerHandler.ApprovesCancellation该处理程序允许将其抓取对象设置为 null。
PointerHandler.ApprovesTakeOverByAnything此处理程序允许任何类型的 Item 或 Handler 获取抓取操作。

默认值为PointerHandler.CanTakeOverFromItems | PointerHandler.CanTakeOverFromHandlersOfDifferentType | PointerHandler.ApprovesTakeOverByAnything ,这允许大多数接管情况,但可避免例如两个 PinchHandler 争夺同一触点的情况。

margin : real

这是超出parent 控件边界、eventPoint 可以激活此处理程序的区域。例如,在PinchHandler 中,当target 同时也是parent 时,将此距离设置为至少相当于普通用户手指宽度的一半会很有用,这样即使parent 被缩放至非常小的尺寸,仍可执行捏合手势。 或者,如果将基于TapHandler 的按钮放置在屏幕边缘附近,则可利用此特性来符合菲茨定律:即使该按钮在视觉上距离屏幕边缘有几像素的间距,也能对屏幕边缘处的鼠标点击做出响应。

默认值为 0。

带有周围边距区域的矩形,用于扩展触摸检测

parent : Item

Item 是处理程序的作用域;Item是其被声明的对象。处理程序将代表该Item处理事件,这意味着如果指针事件的至少一个eventPoints 发生在Item的内部,则该事件与该Item相关。初始时target() 的值与Item相同,但可以被重新赋值。

另请参阅 target 以及QObject::parent()。

target : Item

该处理程序将操作的项。

默认情况下,它与parent 相同,即声明该处理程序的那个Item。不过,有时将目标设置为另一个Item会很有用,以便在某个Item中处理事件但操作另一个Item;或者null ,以禁用默认行为并执行其他操作。

Signal 文档

canceled(eventPoint point)

如果该处理器已经获取了给定的point ,当该获取被另一个指针处理器或项目夺走时,将发出此信号。

注意: 对应的处理程序 是onCanceled 。

grabChanged(PointerDevice::GrabTransition transition, eventPoint point)

当抓取状态发生与该处理程序相关的变化时,会发出此信号。

transition (动词)说明发生了什么。point (对象)是被抓取或释放的点。

transition 的有效值包括:

常量描述
PointerDevice.GrabExclusive该处理程序已承担起处理point 的主要责任。
PointerDevice.UngrabExclusive该处理程序已放弃其先前的独占占用。
PointerDevice.CancelGrabExclusive该处理程序的独占控制权已被接管或取消。
PointerDevice.GrabPassive该处理程序已获得被动占用,用于监视point 。
PointerDevice.UngrabPassive该处理程序已放弃其先前的被动抓取。
PointerDevice.CancelGrabPassive该处理程序之前的被动占用已异常终止。

注: 相应的处理程序 为onGrabChanged 。

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