C++ 在单点和双击手势相互竞争的情况下,如何正确取消手势?

C++ 在单点和双击手势相互竞争的情况下,如何正确取消手势?,c++,windows,qt,gesture,C++,Windows,Qt,Gesture,我试图解决一个输入难题,结果比我最初想象的要复杂。最初的设计,作为一个起点来说明这个问题,是相当直接的。它必须支持以下姿态: 平底锅(单指) 水龙头 对于以下小部件拓扑: +-------------------------------+ | container +--------------+ | | | button | | | +--------------+ | +-------------------------

我试图解决一个输入难题,结果比我最初想象的要复杂。最初的设计,作为一个起点来说明这个问题,是相当直接的。它必须支持以下姿态:

  • 平底锅(单指)
  • 水龙头
对于以下小部件拓扑:

+-------------------------------+
| container   +--------------+  |
|             | button       |  |
|             +--------------+  |
+-------------------------------+
容器
应接受平移手势,而
按钮
应接受点击手势。必须能够在
容器
小部件内的任何小部件上启动平移手势,包括其子小部件,即此配置中的
按钮

解决方案包括两个派生类,它们实现识别器的逻辑。处理程序同样直接:触摸显示屏时,
tapperstate
移动到
Qt::GestureStarted
状态,而
PanGesture
保持在
Qt::NoGesture
状态。当手指移动到公差窗口外时,
PanGesture
转换为
Qt::gesturestart
,事件处理程序通过取消点击手势来响应该动作。这是通过调用后跟来完成的。如果将手指抬离触摸表面而未将其移到公差窗口外,
tapprocess
将移动到
Qt::gestureffinished
,然后取消平移手势。(
PanGesture
tappostate
是派生类,存储任一手势类型的状态机状态。)

事情开始变得复杂起来,引入了对
按钮
小部件添加双击支持的附加要求。允许为作为双抽头一部分的第一个抽头触发单抽头事件

doubleTapPassive
(存储状态)和
doubleTapgestureRecognitor
都很容易实现。然而,我很难找到一个取消手势的解决方案。与之前的设置不同,一旦识别出一个点击手势,我就不能再取消所有其他手势,因为双击手势可能仍在飞行中。有选择地取消所有手势,除了响应完成的单次点击而激活的双点击,似乎是正确的解决方案。除此之外,该框架不提供手动取消手势的方法。唯一的选择是:自动取消所有(
CancelAllInContext
)或否(
CancelNone

问题:是否可以在
QgestureRecognitizer
系统中控制手势取消,以实现概述的要求,如果可以,如何实现