如何防止在MayBeGesture状态下超时移除手势?

我正在使用基于触摸的input系统,使用在Microsoft Windows 7上运行的Qt 4.6.3。为了让状态机保持一个可控的复杂性,我决定使用框架的手势识别基础结构。 我一直在关注“ 手势编程指南”,并为每个手势实现并注册了我的QGestureRecognizer派生类。

大多数手势识别器按预期工作,但有一个例外:我的单指平底锅暴露了莫名其妙(对我)的行为。 由于我希望在触发Pan手势之前保持一个小容忍窗口,所以初始接触的事件(鼠标或触摸)必须报告一个MayBeGesture结果,并且只会请求前进到Qt::GestureStarted状态,方法是返回TriggerGesture

这是相关的代码部分:

 class CSingleFingerPanGestureRecognizer : public QGestureRecognizer { public: virtual QGestureRecognizer::Result recognize( QGesture* state, QObject*, QEvent* event ) { CSingleFingerPanGesture& panState = *static_cast< CSingleFingerPanGesture* >( state ); QGestureRecognizer::Result result; switch ( event->type() ) { case QEvent::TouchBegin: { const QTouchEvent& touchEvent = *static_cast< const QTouchEvent* >( event ); // Filter out multi-touch gestures if ( touchEvent.touchPoints().size() == 1 ) { QTouchEvent::TouchPoint p = touchEvent.touchPoints().at(0); panState.startPos = p.pos(); result = QGestureRecognizer::MayBeGesture; } break; } case QEvent::MouseButtonPress: { const QMouseEvent& mouseEvent = *static_cast< const QMouseEvent* >( event ); panState.startPos = mouseEvent.posF(); result = QGestureRecognizer::MayBeGesture; break; } // ... } return result; } // ... }; 

虽然鼠标和触摸input的处理方式相同,但都返回相同的Result标志,但总体行为不同。 特别是,当与触摸表面交互时,状态MayBeGesture上的手势在3秒后从手势列表中移除(参见QGestureManager::timerEvent ),这样做明显地取消了其他手势。 虽然鼠标手势也从m_maybeGestures删除,这不会暴露不良影响。

问题:

  1. 为什么手势会自动从m_maybeGestures -list中移除?
  2. 有没有办法阻止从m_maybeGestures -list中移除手势?
  3. 为什么从m_maybeGestures -list中删除一个手势取决于inputtypes的不同呢?

回答我自己的问题:

  1. 这个行为几乎没有任何理由,如[#QTBUG-9926]中所解释的那样, 从QGestureManager中删除用于许可的定时器 。
  2. MayBeGesture状态下控制任意移除手势的定时器在Qt 4.7中被删除。 如果任意删除手势是一个问题,请升级到Qt 4.7或更高版本。
  3. 经过进一步调查,处理鼠标和触摸输入没有区别。 唯一的区别在于输入特性。 触摸输入生成连续的更新事件流时,单击左键按下事件不会。 这是处理更新事件,最终触发删除手势。