本页内容

QGestureRecognizer Class

QGestureRecognizer 类提供了手势识别的基础架构。更多内容...

头文件: #include <QGestureRecognizer>
CMake: find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake: QT += widgets

公共类型

flags Result
enum ResultFlag { Ignore, MayBeGesture, TriggerGesture, FinishGesture, CancelGesture, ConsumeEventHint }

公共函数

QGestureRecognizer()
virtual ~QGestureRecognizer()
virtual QGesture *create(QObject *target)
virtual QGestureRecognizer::Result recognize(QGesture *gesture, QObject *watched, QEvent *event) = 0
virtual void reset(QGesture *gesture)

静态公共成员

Qt::GestureType registerRecognizer(QGestureRecognizer *recognizer)
void unregisterRecognizer(Qt::GestureType type)

详细说明

手势识别器负责创建和管理QGesture 对象,并监听发送到QWidget 和QGraphicsObject 子类的输入事件。QGestureRecognizer是实现自定义手势的基类。

仅需为标准手势提供手势识别功能的开发者无需直接使用此类。框架会在后台自动创建实例。

有关 Qt 中手势处理的概述以及在应用程序中使用手势的信息,请参阅《Qt Widgets 和图形视图中的手势》文档。

手势识别

手势识别的过程包括过滤发送到特定对象的输入事件,并修改相关的QGesture 对象以包含有关用户输入的相关信息。

当框架调用create()来处理QWidget 或QGraphicsObject 子类的特定实例的用户输入时,便会创建手势。对于每个配置为使用手势的小部件或项目,都会创建一个QGesture 对象。

一旦为目标对象创建了QGesture ,手势识别器将在其recognize()处理函数中接收该对象的相关事件。

当手势被取消时,会调用reset()函数,从而使识别器有机会更新相应QGesture 对象中的相关属性。

支持新手势

要添加对新手势的支持,您需要继承自 QGestureRecognizer 来创建自定义识别器类,构建该类的实例,并通过调用QGestureRecognizer::registerRecognizer() 将其注册到应用程序中。您还可以继承QGesture 来创建自定义手势类,或者依靠动态属性来表达您想要处理的手势的具体细节。

您的自定义 QGestureRecognizer 子类需要重写recognize() 函数,以处理和过滤来自QWidget 和QGraphicsObject 子类的输入事件。尽管手势识别的逻辑在此函数中实现,但您可以将识别过程状态的持久信息存储在提供的QGesture 对象中。recognize() 函数必须返回一个QGestureRecognizer::Result 类型的值,该值表示给定手势和目标对象的识别状态。这将决定手势事件是否会被传递给目标对象。

如果您选择通过自定义的QGesture 子类来表示手势,则需要重写create()函数以构建您手势类的实例。同样,如果您的自定义手势对象在手势被取消时需要特殊处理,您可能还需要重写reset()函数。

另请参阅 QGesture 。

成员类型文档

enum QGestureRecognizer::ResultFlag
flags QGestureRecognizer::Result

该枚举描述了手势识别器状态机中当前事件过滤步骤的结果。

该结果由一个状态值(取值为 Ignore、MayBeGesture、TriggerGesture、FinishGesture 或 CancelGesture 之一)和一个可选提示(ConsumeEventHint)组成。

常量值描述
QGestureRecognizer::Ignore0x0001该事件不会改变识别器的状态。
QGestureRecognizer::MayBeGesture0x0002该事件改变了识别器的内部状态,但尚不清楚它是否为手势。识别器需要过滤更多事件才能做出判断。处于“MayBeGesture”状态的手势识别器,如果识别手势花费的时间过长,可能会被自动重置。
QGestureRecognizer::TriggerGesture0x0004手势已被触发,相应的QGesture 对象将作为QGestureEvent 的一部分传递给目标。
QGestureRecognizer::FinishGesture0x0008手势已成功完成,相应的QGesture 对象将作为QGestureEvent 的一部分传递给目标。
QGestureRecognizer::CancelGesture0x0010该事件明确表明这不是一个手势。如果手势识别器之前处于 GestureTriggered 状态,则该手势将被取消,相应的QGesture 对象将作为QGestureEvent 的一部分传递给目标。
QGestureRecognizer::ConsumeEventHint0x0100此提示指定手势框架应消耗该过滤后的事件,而不将其传递给接收方。

Result类型是QFlags<ResultFlag>的typedef。它存储ResultFlag值的按“或”运算组合。

另请参阅 QGestureRecognizer::recognize()。

成员函数文档

QGestureRecognizer::QGestureRecognizer()

创建一个新的手势识别器对象。

[virtual noexcept] QGestureRecognizer::~QGestureRecognizer()

销毁手势识别器。

[virtual] QGesture *QGestureRecognizer::create(QObject *target)

该函数由 Qt XML 调用,用于为给定的target (QWidget 或QGraphicsObject )创建一个新的QGesture 对象。

如有必要,请重写此函数以创建一个自定义的、从QGesture 派生的手势对象。

QApplication 将获得所创建的手势对象的所有权。

[pure virtual] QGestureRecognizer::Result QGestureRecognizer::recognize(QGesture *gesture, QObject *watched, QEvent *event)

处理watched 对象的给定event ,根据需要更新gesture 对象的状态,并为当前识别步骤返回合适的结果。

该函数由框架调用,以便识别器能够过滤分发到其正在监视的QWidget 或QGraphicsObject 实例上的输入事件。

结果反映了手势已被识别的程度。gesture 对象的状态将根据该结果进行设置。

另请参阅 QGestureRecognizer::Result 。

[static] Qt::GestureType QGestureRecognizer::registerRecognizer(QGestureRecognizer *recognizer)

将给定的recognizer 注册到手势框架中,并返回其对应的手势ID。

QApplication 该函数将recognizer 设为所有者,并返回与其关联的手势类型ID。对于处理自定义QGesture 对象的手势识别器(即在QGesture::gestureType()函数中返回Qt::CustomGesture 的识别器),其返回值是一个生成的手势ID,且该ID的Qt::CustomGesture 标志已被设置。

另请参阅 unregisterRecognizer()、QGestureRecognizer::create() 以及QGesture 。

[virtual] void QGestureRecognizer::reset(QGesture *gesture)

该函数由 Qt XML 调用,用于重置指定的gesture 。

请重写此函数,以实现自定义QGesture 对象的额外要求。如果您实现了自定义的QGesture ,且该对象的属性在手势重置时需要特殊处理,则可能需要重写此函数。

[static] void QGestureRecognizer::unregisterRecognizer(Qt::GestureType type)

取消注册指定type 的所有手势识别器。

另请参阅 registerRecognizer()。

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