本页内容

Qt Quick 示例 - 指针处理程序

展示了如何在交互式组件中使用Qt Quick 输入处理程序。

Qt Quick Controls 包含预先构建的组件,这些组件足以满足多种用户界面的需求;但有时您可能需要“从头开始”编写此类组件。在这种情况下,您将需要大量使用指针处理程序。本节收集了一系列简短示例,展示如何实现一些常见和不常见的交互模式。

如果您将示例构建为可执行文件,则可以从顶级ListView 中选择页面。TouchpointFeedbackSprite 和MouseFeedbackSprite 组件演示了如何使用PointHandler 来反馈用户使用指针设备时的操作:这些组件在整个示例中始终可见,且不会干扰其他任何地方的交互。 如果您需要制作用户界面的视频或现场演示,这些组件非常方便重复使用。

此外,还可以使用qml 工具在命令行上运行某些单独的 QML 文件,作为快速参考,以了解如何构建特定类型的组件。

TapHandler

TapHandler 演示:包含用于处理有效鼠标点击和手势策略选项的复选框

“tap”页面演示了如何检测触摸屏的轻触、长按以及不同按钮的鼠标点击。您还可以尝试不同的gesturePolicy 值。

多点触控按钮

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

三个按钮,各自采用不同的 gesturePolicy 值,分别用于发射气球、导弹和战斗机

扇形菜单

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

灰色触摸区域,提示长按以调出上下文菜单

点处理程序

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

主菜单列出了十二个指针处理程序示例,依次为:tap、multibuttons、pieMenu、single point handler、hover sidebar 和 joystick

“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 。

音频调音台,配有五个垂直通道推子,标有“通道 1”至“通道 5”

地图

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

显示各大洲并叠加比例尺信息的世界地图

模拟 Flickable

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

此外,还有一个滑出式“抽屉”组件,其中包含若干由指针处理程序驱动的控件。

带字体大小滑块的 QML 代码查看器,显示 DragHandler 和 BoundaryRule 的代码

示例项目 @ code.qt.io

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