QTouchEvent 类

QTouchEvent 类包含触摸事件的描述参数。 更多...

头: #include <QTouchEvent>
CMake: find_package(Qt6 COMPONENTS Gui REQUIRED)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake: QT += gui
继承: QPointerEvent

公共函数

virtual ~QTouchEvent ()
QObject * target () const
QEventPoint::States touchPointStates () const

重实现公共函数

virtual bool isBeginEvent () const override
virtual bool isEndEvent () const override
virtual bool isUpdateEvent () const override

详细描述

启用触摸事件

触摸事件发生,当在触摸设备 (譬如:触摸屏或跟踪板) 中按下、释放或移动一个或多个触摸点时。要接收触摸事件,Widget 必须拥有 Qt::WA_AcceptTouchEvents 属性设置和图形项需要拥有 acceptTouchEvents 属性设置为 true。

当使用 QAbstractScrollArea 基 Widget,应启用 Qt::WA_AcceptTouchEvents 属性在卷动区域 viewport .

类似于 QMouseEvent ,Qt 自动抓取每个触摸点当在 Widget 内第一次按下时,且小部件将接收触摸点的所有更新,直到它被释放。注意,Widget 能接收很多触摸点事件,且多个小部件可能同时接收触摸事件。

事件处理

所有触摸事件类型,包括 QEvent::TouchBegin , QEvent::TouchUpdate , QEvent::TouchEnd or QEvent::TouchCancel 。重实现 QWidget::event () 或 QAbstractScrollArea::viewportEvent () 对于 Widget 和 QGraphicsItem::sceneEvent () 对于要接收触摸事件的图形视图项。

不像 Widget,QWindows 始终接收触摸事件,无需选项。当直接工作于 QWindow ,是足够的重实现 QWindow::touchEvent ().

QEvent::TouchUpdate and QEvent::TouchEnd 事件会被发送给 Widget 或项接受 QEvent::TouchBegin 事件。若 QEvent::TouchBegin 事件未接受且未被事件过滤器所过滤,则进一步触摸事件不会被发送直到下一 QEvent::TouchBegin .

某些系统可能发送事件类型 QEvent::TouchCancel 。当收到此事件时,应用程序被请求忽略整个活动触摸序列。例如,在合成系统中,合成器可以决定将某些手势视为系统范围手势。每当做出这种决定 (识别手势) 时,会通知客户端采用 QEvent::TouchCancel 事件,因此它们可以相应更新其状态。

pointCount () 和 point () 函数可以用于访问和迭代各个接触点。

points () 函数返回事件中包含的所有触摸点的列表。注意,此列表可能为空,例如,若为 QEvent::TouchCancel event. Each point is an instance of the QEventPoint 类。 QEventPoint::State 枚举描述触摸点可能拥有的不同状态。

注意: 列表 points () will never be partial: A touch event will always contain a touch point for each existing physical touch contacts targeting the window or widget to which the event is sent. For instance, assuming that all touches target the same window or widget, an event with a condition of points ().count()==2 保证,暗示触摸触摸屏 (或触摸板) 的准确手指数为 2。

事件的交付和传播

默认情况下, QGuiApplication 翻译第一触摸点在 QTouchEvent 成 QMouseEvent . This makes it possible to enable touch events on existing widgets that do not normally handle QTouchEvent. See below for information on some special considerations needed when doing this.

QEvent::TouchBegin 是发送给 Widget 的第一触摸事件。 QEvent::TouchBegin 事件包含指示接收者是否想要事件的特殊接受标志。默认情况下,接受事件。应该调用 ignore () 若 Widget 不处理触摸事件。 QEvent::TouchBegin 事件会沿父级 Widget 链向上传播,直到小部件接受它采用 accept (),或事件过滤器消耗掉它。对于 QGraphicsItems, QEvent::TouchBegin 事件被传播给鼠标下项 (类似于 QGraphicsItems 的鼠标事件传播)。

触摸点分组

如上所述,它是可能的几个 Widget 可以同时接收 QTouchEvents。不管怎样,Qt 确保从不重复发送 QEvent::TouchBegin 事件给同一 Widget,理论上传播期间可能发生,例如,若用户触摸 2 单独 Widget 在 QGroupBox 与两 Widget 忽略 QEvent::TouchBegin 事件。

为避免这,Qt 使用下列规则将新触摸点分组到一起:

  • 当检测到第一触摸点时,目的地 Widget 首先由屏幕位置确定,其次由传播规则确定。
  • When additional touch points are detected, Qt first looks to see if there are any active touch points on any ancestor or descendent of the widget under the new touch point. If there are, the new touch point is grouped with the first, and the new touch point will be sent in a single QTouchEvent to the widget that handled the first touch point. (The widget under the new touch point will not receive an event).

这使同级 Widget 能够独立处理触摸事件,同时确保 QTouchEvents 序列始终正确成为可能。

鼠标事件和触摸事件合成

QTouchEvent 的交付独立于 QMouseEvent 。应用程序标志 Qt::AA_SynthesizeTouchForUnhandledMouseEvents and Qt::AA_SynthesizeMouseForUnhandledTouchEvents 可以用于启用 (或禁用) 将触摸事件自动合成为鼠标事件,和将鼠标事件自动合成为触摸事件。

告诫

  • 如上所述,启用触摸事件意味着多个 Widget 可以同时接收触摸事件。组合默认 QWidget::event () 处理 QTouchEvents,这为设计触摸用户界面赋予了很大灵活性。要意识到其中所隐含的。例如,用户可能正移动 QSlider 用一根手指并按下 QPushButton 用另一根手指。由这些 Widget 发射的信号将交错。
  • 递归到事件循环使用某一 exec() 方法 (如 QDialog::exec () 或 QMenu::exec ()) in a QTouchEvent event handler is not supported. Since there are multiple event recipients, recursion may cause problems, including but not limited to lost events and unexpected infinite recursion.
  • QTouchEvents 不受影响被 鼠标抓取 活动弹出 Widget 。QTouchEvents 的行为未定义,当打开弹出窗口 (或抓取鼠标) 且存在多个活动触摸点时。

另请参阅 QEventPoint , QEventPoint::State , Qt::WA_AcceptTouchEvents ,和 QGraphicsItem::acceptTouchEvents ().

成员函数文档编制

[virtual] QTouchEvent:: ~QTouchEvent ()

销毁 QTouchEvent .

[override virtual] bool QTouchEvent:: isBeginEvent () const

Returns true if this event includes at least one newly-pressed touchpoint.

[override virtual] bool QTouchEvent:: isEndEvent () const

返回 true 若此事件包括至少一个新近发布的触摸点。

[override virtual] bool QTouchEvent:: isUpdateEvent () const

Returns true if this event does not include newly-pressed or newly-released touchpoints.

QObject *QTouchEvent:: target () const

返回出现事件的窗口内的目标对象。这通常是 QWidget QQuickItem 。可能为 0 当没有可用特定目标时。

QEventPoint::States QTouchEvent:: touchPointStates () const

返回此事件所有触摸点状态的按位 OR。