本页内容

Qt Quick 输入处理程序

Qt Quick 输入处理程序是一组 QML 类型,用于处理用户界面中来自键盘、触摸、鼠标和触控笔的events devices 输入。与事件处理项(如MouseArea 和Flickable )不同,输入处理程序明确属于非视觉组件,占用内存更少,且设计用于大规模部署:每个交互方面对应一个处理程序实例。 每个输入处理程序实例都会代表其parent 项处理特定的事件。因此,视觉和行为方面的关注点得到了更好的分离,且行为是通过更细粒度的组合构建而成的。

《Qt Quick 示例——指针处理程序》展示了这些处理程序的一些用例。

现有的Keys 附加属性在概念上与此类似,因此我们将面向指点设备的处理程序与Keys 统称为输入处理程序集。我们预计将在Qt的未来版本中提供更多附加属性的用例。

输入处理程序

DragHandler

拖拽处理程序

HoverHandler

鼠标和数位板悬停处理程序

KeyNavigation

支持使用方向键进行键控导航

Keys

为项(Item)提供键位处理功能

PinchHandler

捏合手势处理程序

PointHandler

响应单点触控的处理程序

TapHandler

处理轻触和点击的处理程序

WheelHandler

鼠标滚轮处理程序

主要功能

部分主要功能包括:

  • 处理处于焦点状态的项内的按键操作
  • 处理诸如轻点或拖动等手势,无论这些手势来自何种设备
  • 以不同方式处理来自不同类别设备的操作
  • 每个项可以拥有不限数量的处理程序

操作项的处理程序

某些处理程序仅需在项目内部声明,即可实现交互功能:

import QtQuick

Rectangle {
    width: 100
    height: 100
    color: "lightsteelblue"
    DragHandler { }
}

处理器的属性与信号

所有处理程序都具有可在绑定中使用的属性,以及可用于响应输入的信号:

import QtQuick

Rectangle {
    id: button
    signal clicked

    width: 150; height: 50; radius: 3
    color: tapHandler.pressed ? "goldenrod" : hoverHandler.hovered ? "wheat" : "beige"
    border.color: activeFocus ? "brown" : "transparent"
    focus: true

    HoverHandler {
        id: hoverHandler
    }

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

    Keys.onEnterPressed: button.clicked()
}

指针抓取

指针处理程序的一个重要概念是其执行的抓取类型。项所能进行的唯一抓取类型是独占抓取:例如,若调用 `QPointerEvent::setExclusiveGrabber()`,后续的鼠标移动和鼠标释放事件将仅发送给该对象。(关于此独占性的变通方法,请参阅 `QQuickItem::setFiltersChildMouseEvents()` 和 `QQuickItem::childMouseEventFilter()`。) 然而,指针处理程序(Pointer Handlers)还提供了一种额外的机制:非独占抓取(passive grab )。鼠标和触摸事件(press )的传递是按Z轴从上到下的顺序遍历所有Item的:首先处理每个Item的子处理程序,然后才是Item 本身。 当按下事件被传递时,处理程序可根据需要选择被动抓取或独占抓取。如果选择被动抓取,则即使场景中的其他项或处理程序进行了任何类型的抓取(无论是被动还是独占),它也能保证接收到更新和释放事件。 某些处理程序(例如PointHandler )只能与被动抓取配合使用;另一些则需要独占抓取;还有一些可以在被动抓取状态下“潜伏”,直到检测到正在执行手势,然后才从被动抓取过渡到独占抓取。TapHandler 的抓取行为详见configurable 。

当请求抓取转换时,PointerHandler::grabPermissions 、QQuickItem::keepMouseGrab() 和QQuickItem::keepTouchGrab() 用于控制是否允许该转换。

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