QTouchEvent Class
QTouchEvent 类包含描述触摸事件的参数。更多
头文件: | #include <QTouchEvent> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
qmake: | QT += gui |
继承: | QPointerEvent |
- 所有成员(包括继承成员)的列表
- 已废弃成员
- QTouchEvent 属于事件类。
公共函数
QTouchEvent(QEvent::Type eventType, const QPointingDevice *device = nullptr, Qt::KeyboardModifiers modifiers = Qt::NoModifier, const QList<QEventPoint> &touchPoints = {}) | |
QObject * | target() const |
QEventPoint::States | touchPointStates() const |
重新实现的公共函数
virtual bool | isBeginEvent() const override |
virtual bool | isEndEvent() const override |
virtual bool | isUpdateEvent() const override |
详细说明
启用触摸事件
当按下、松开或移动触摸设备(如触摸屏或触控板)上的一个或多个触摸点时,就会发生触摸事件。要接收触摸事件,部件必须设置Qt::WA_AcceptTouchEvents 属性,图形项目必须将acceptTouchEvents 属性设置为 true。
使用基于QAbstractScrollArea 的部件时,应启用滚动区域viewport 上的Qt::WA_AcceptTouchEvents 属性。
与QMouseEvent 类似,Qt 会在 widget 内部首次按下时自动抓取每个触摸点,并且该 widget 将接收触摸点的所有更新,直至其被释放。请注意,一个 widget 有可能接收多个触摸点的事件,而且多个 widget 可能同时接收触摸事件。
事件处理
所有触摸事件的类型都是QEvent::TouchBegin,QEvent::TouchUpdate,QEvent::TouchEnd 或QEvent::TouchCancel 。要接收触摸事件,需要为部件重新实现QWidget::event() 或QAbstractScrollArea::viewportEvent() ,为图形视图中的项目重新实现QGraphicsItem::sceneEvent() 。
与窗口小部件不同,QWindows 可始终接收触摸事件,无需选择是否接收。当直接使用QWindow 时,只需重新实现QWindow::touchEvent() 即可。
QEvent::TouchUpdate 和QEvent::TouchEnd 事件会发送到接受QEvent::TouchBegin 事件的部件或项目。如果QEvent::TouchBegin 事件未被接受,也未被事件过滤器过滤,则不会再发送触摸事件,直到下一个QEvent::TouchBegin 。
某些系统可能会发送QEvent::TouchCancel 类型的事件。收到该事件后,应用程序将被要求忽略整个活动触摸序列。例如,在合成系统中,合成器可能会决定将某些手势视为全系统手势。每当做出这样的决定(手势被识别)时,客户端就会收到QEvent::TouchCancel 事件通知,以便相应地更新其状态。
pointCount() 和point() 函数可用于访问和遍历单个触摸点。
points() 函数返回事件中包含的所有触摸点的列表。请注意,该列表可能为空,例如在QEvent::TouchCancel 事件中。每个点都是QEventPoint 类的一个实例。QEventPoint::State 枚举描述了触摸点可能具有的不同状态。
注意: points() 列表永远不会是部分的:触摸事件将始终包含一个触摸点,该触摸点是针对事件发送的窗口或部件的现有物理触摸触点。例如,假设所有触摸都针对同一个窗口或部件,那么条件为points().count()==2 的事件保证意味着触摸触摸屏或触摸板的手指数正好是两个。
事件传递和传播
默认情况下,QGuiApplication 会将 QTouchEvent 中的第一个触摸点转换为QMouseEvent 。这使得在通常不处理 QTouchEvent 的现有部件上启用触摸事件成为可能。有关这样做时需要特别考虑的信息,请参阅下文。
QEvent::TouchBegin 是发送到 widget 的第一个触摸事件。 事件包含一个特殊的接受标志,表示接收者是否需要该事件。默认情况下,事件被接受。如果您的 widget 未处理触摸事件,则应调用 () 。 事件会沿着父窗口部件链向上传播,直到某个窗口部件使用 () 接受了该事件,或者某个事件过滤器消耗了该事件。对于 QGraphicsItems, 事件会传播到鼠标下的项目(类似于 QGraphicsItems 的鼠标事件传播)。QEvent::TouchBegin ignore QEvent::TouchBegin accept QEvent::TouchBegin
触摸点分组
如上所述,多个部件有可能同时接收 QTouchEvents。但是,Qt 确保永远不会向同一部件发送重复的QEvent::TouchBegin 事件,例如,如果用户在QGroupBox 中分别触摸了 2 个部件,而这两个部件都忽略了QEvent::TouchBegin 事件,那么理论上在传播过程中就可能发生这种情况。
为了避免这种情况,Qt 将使用以下规则将新的触摸点分组:
- 当检测到第一个触摸点时,目的地部件首先由屏幕上的位置决定,其次由传播规则决定。
- 当检测到其他触摸点时,Qt 会首先查看新触摸点下的 Widgets 的任何祖先或后代是否有任何活动触摸点。如果有,新的触摸点将与第一个触摸点分组,新的触摸点将以单个 QTouchEvent 发送给处理第一个触摸点的 widget。(新触摸点下的部件不会收到事件)。
这样,同级部件就可以独立处理触摸事件,同时确保 QTouchEvents 的顺序始终正确。
鼠标事件和触摸事件合成
QTouchEvent 的传送独立于QMouseEvent 。应用程序标志Qt::AA_SynthesizeTouchForUnhandledMouseEvents 和Qt::AA_SynthesizeMouseForUnhandledTouchEvents 可用来启用或禁用触摸事件到鼠标事件和鼠标事件到触摸事件的自动合成。
注意事项
- 如上所述,启用触摸事件意味着多个部件可以同时接收触摸事件。结合 QTouchEvents 的默认QWidget::event() 处理方式,这为您设计触摸用户界面提供了极大的灵活性。请注意其中的影响。例如,用户有可能用一只手指移动QSlider ,另一只手指按下QPushButton 。这些部件发出的信号将交错出现。
- 不支持使用 QTouchEvent 事件处理程序中的执行()方法(如QDialog::exec() 或QMenu::exec() )递归到事件循环中。由于存在多个事件接收者,递归可能会导致问题,包括但不限于事件丢失和意外的无限递归。
- QTouchEvents 不受mouse grab 或active pop-up widget 的影响。在有多个活动触摸点的情况下打开弹出窗口或抓取鼠标时,QTouchEvents 的行为是未定义的。
另请参阅 QEventPoint,QEventPoint::State,Qt::WA_AcceptTouchEvents, 和QGraphicsItem::acceptTouchEvents() 。
成员函数文档
[explicit]
QTouchEvent::QTouchEvent(QEvent::Type eventType, const QPointingDevice *device = nullptr, Qt::KeyboardModifiers modifiers = Qt::NoModifier, const QList<QEventPoint> &touchPoints = {})
用给定的eventType,device,touchPoints 和事件发生时的当前键盘modifiers 构建一个 QTouchEvent。
[override virtual]
bool QTouchEvent::isBeginEvent() const
如果该事件至少包含一个新按下的触摸点,则返回 true。
[override virtual]
bool QTouchEvent::isEndEvent() const
如果该事件至少包含一个新发布的接触点,则返回 true。
[override virtual]
bool QTouchEvent::isUpdateEvent() const
如果该事件不包括新按下或新释放的触摸点,则返回 true。
QObject *QTouchEvent::target() const
返回发生事件的窗口中的目标对象。通常是QWidget 或QQuickItem 。如果没有特定的目标对象,则返回 0。
QEventPoint::States QTouchEvent::touchPointStates() const
返回该事件所有触摸点状态的位顺向 OR。
© 2025 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.