我正在尝试解决输入难题,结果比我最初的想法更复杂。原始设计作为说明问题的起点,非常简单。它必须为以下手势提供支持:
用于以下窗口小部件拓扑:
+-------------------------------+
| container +--------------+ |
| | button | |
| +--------------+ |
+-------------------------------+
container
应接受 pan 手势,而button
应接受点击手势。必须可以在container
窗口小部件中的任何窗口小部件上启动 pan 手势,包括其子窗口小部件,即此配置中的button
。
对此的解决方案包括两个QGestureRecognizer
派生类,它们实现逻辑以识别任一手势。 QGestureEvent
- 处理程序同样直截了当:触摸显示屏时,TapGesture
移至Qt::GestureStarted
状态,而PanGesture
仍保留在Qt::NoGesture
。当手指移动到公差窗口之外时,PanGesture
转换为Qt::GestureStarted
,事件处理程序通过取消点按手势来响应。这是通过调用QGesture::setGestureCancelPolicy(QGesture::CancelAllInContext)
后跟QGestureEvent::accept(gesture)
来完成的。如果将手指从触摸表面抬起而不将其移动到公差窗口之外,则会将TapGesture
移至Qt::GestureFinished
,然后取消 pan 手势。 (PanGesture
和TapGesture
是QGesture
- 派生类,为任一种手势类型存储状态机状态。)
当引入了为双击添加对button
小部件的支持的附加要求时,事情开始变得复杂。 单击事件允许为双击中的第一个点击触发。
DoubleTapGesture
(存储状态)和DoubleTapGestureRecognizer
都很容易实现。然而,我遇到了困难,产生了取消手势的解决方案。与先前的设置相比,一旦识别出单击手势,我就不能再取消所有其他手势,因为双击手势可能仍在飞行中。选择性地取消除活动双击以响应完成的单击之外的所有手势似乎是正确的解决方案。除此之外,框架不提供手动取消手势的方法。唯一的选择是:自动取消全部(CancelAllInContext
)或否(CancelNone
)。
问题:是否可以在QGestureRecognizer
系统中控制手势取消,以便实现概述的要求,如果是,如何实现?