Qt Quick 示例 - 指针处理程序
展示了如何在交互式组件中使用Qt Quick 输入处理程序。
Qt Quick Controls 包含预先构建的组件,这些组件足以满足多种用户界面的需求;但有时您可能需要“从头开始”编写此类组件。在这种情况下,您将需要大量使用指针处理程序。本节收集了一系列简短示例,展示如何实现一些常见和不常见的交互模式。
如果您将示例构建为可执行文件,则可以从顶级ListView 中选择页面。TouchpointFeedbackSprite 和MouseFeedbackSprite 组件演示了如何使用PointHandler 来反馈用户使用指针设备时的操作:这些组件在整个示例中始终可见,且不会干扰其他任何地方的交互。 如果您需要制作用户界面的视频或现场演示,这些组件非常方便重复使用。
此外,还可以使用qml 工具在命令行上运行某些单独的 QML 文件,作为快速参考,以了解如何构建特定类型的组件。
TapHandler

“tap”页面演示了如何检测触摸屏的轻触、长按以及不同按钮的鼠标点击。您还可以尝试不同的gesturePolicy 值。
多点触控按钮
本页面包含三个自定义的Button 组件,它们的gesturePolicy 值各不相同:其中一个按钮要求您从按下到松开的整个过程中,始终将手指或鼠标保持在按钮内;另一个按钮即使您将鼠标拖出按钮范围,然后在松开前再次拖回按钮内,也会执行操作;还有一个按钮,如果您将鼠标稍微拖过system-wide drag threshold ,它就会退出按下状态。 如果你在触摸屏上尝试此示例,应该能够用不同的手指同时与这三个按钮进行交互。

扇形菜单
本页演示了如何编写一个适合触摸屏使用的扇形菜单,该菜单在长按激活时会通过动画效果显示出来。 你可以从中心位置向其中一个扇区拖动并松开手指来选择菜单项。如果你拖动到菜单外,或在菜单中间松开手指,则不会选中任何内容。如果你拖动到灰色视口外,菜单将被取消。

点处理程序
在“单点处理程序”页面中,PointHandler 会根据SinglePointHandler::point 和handlerPoint::device 中列出的部分属性提供反馈。如果您已将示例编译为可执行文件,则会同时看到此反馈以及主 pointerhandlers.qml 文件中 PointHandlers 提供的反馈。

“tablet canvas”页面使用PointHandler 来唯一识别不同的types of pointing devices ,因此,如果您将绘图板连接到计算机上,就可以使用不同类型的触控笔(如钢笔、喷笔或记号笔)在Canvas控件上进行绘制。 您可以使用触控笔橡皮擦“擦除”笔画(此处通过在上方绘制背景色来实现)。多个HoverHandlers 会提供关于检测到何种类型触控笔或橡皮擦的反馈。
HoverHandler
“悬停侧边栏”页面演示了如何检测鼠标同时悬停在按钮组件及其容器上的情况。通过设置HoverHandler::blocking 属性可禁用该传播机制。您可以在此尝试所有HoverHandler 和MouseArea 的组合,比较它们处理悬停检测的方式。此外,还使用了一个HoverHandler 来显示场景坐标系中的当前鼠标位置。
您还可以验证,当动画“平台”滑动至鼠标光标下方时,其上的HoverHandler 是否被悬停。
DragHandler
“操纵杆”页面仅包含一个DragHandler ,用于拖动Image 。一个带有AnchorChanges 的State 解锁了锚点,从而使拖动成为可能;而AnchorAnimation 则在松开时动画化旋钮返回中心位置的过程。

“fling animation”页面演示了 DragHandler::centroid::velocity 属性的一个用法,该属性仅将QEventPoint::velocity() 返回的值在 QML 中提供出来。本示例中使用的MomentumAnimation 组件展示了一种无需依赖更复杂的解决方案即可模拟物理特性(动量和摩擦)的方法。

PinchHandler
“pinch”页面演示了多个 PinchHandler:有些需要两根手指,有些需要三根手指,以执行常规的缩放、旋转和平移操作,其约束条件通过PinchHandler 的 axis min 和 max 属性进行管理。其中一个PinchHandler 实例用于操作不同的Rectangle 属性,而非位置、缩放和旋转。各种PinchHandler 属性以多种方式进行绑定。 您应该能够以独特的方式操作每个实例。某些项目还具有 DragHandlers 和 TapHandlers。

互操作性
滑块
“mixer”页面演示了在ListView 委托中使用多个处理程序的方法。您可以同时与多个Slider 组件进行交互,并可侧向轻扫ListView 。
- DragHandler 允许您在滑块旋钮可滑动的“轨道”上的任意位置开始拖动。由于默认的snapMode 是
DragHandler.SnapAuto,当您将滑块拖过system-wide drag threshold 后,旋钮将吸附到鼠标或触点正下方的中心位置。 - WheelHandler 会直接调整旋钮的
y属性Image 。 - BoundaryRule 可防止DragHandler 或WheelHandler 将旋钮拖动得太远。
- TapHandler 比典型的
Slider组件多提供了一种手势操作:您可以轻点旋钮。

地图
“地图”页面演示了如何拖动、变换和调整SVG Image 的比例。您应该能够放大地图上的特定位置;如果缩放级别发生显著变化,Image::sourceSize 会相应调整,要求以不同的分辨率重新渲染 SVG。 用两根手指垂直拖动会激活DragHandler ,该功能通过操作Rotation 变换来倾斜地图。

模拟 Flickable
“模拟 Flickable”页面尝试通过离散的指针处理程序和动画,重现Flickable 的大部分功能。Flickable 是一个复杂的组件,但在此您可以看到一种将它提供的各项行为分离的方法,以备您希望仅使用部分功能而避免其复杂性时使用。
此外,还有一个滑出式“抽屉”组件,其中包含若干由指针处理程序驱动的控件。

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