我正在使用基于触摸的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
删除,这不会暴露不良影响。
问题:
m_maybeGestures
-list中移除? m_maybeGestures
-list中移除手势? m_maybeGestures
-list中删除一个手势取决于inputtypes的不同呢? 回答我自己的问题:
MayBeGesture
状态下控制任意移除手势的定时器在Qt 4.7中被删除。 如果任意删除手势是一个问题,请升级到Qt 4.7或更高版本。