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
系统中控制手势取消,以实现概述的要求,如果可以,如何实现