我正在使用在Microsoft Windows 7上运行的Qt 4.6.3实现基于触摸的输入系统。为了使状态机保持可管理的复杂性,我决定采用框架的手势识别基础设施。我一直在关注Gestures Programming指南,并针对每个动作实施并注册了我的QGestureRecognizer
派生类。
大多数手势识别器都按预期工作,但有一个例外:我的单指平移暴露了无法解释的(对我而言)行为。由于我希望在触发平移手势之前保留一个小的容差窗口,因此初始联系(鼠标或触摸)的事件必须报告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;
}
// ...
};
尽管鼠标和触摸输入的处理方式相同,并且两者都返回相同的Result
- 标志,但整体行为却不同。特别是,当与触摸表面交互时,状态MayBeGesture
的手势在3秒后从手势列表中移除(参见QGestureManager::timerEvent
),并且通过这样做显然取消了其他手势。虽然鼠标手势也从m_maybeGestures
- 列表中删除,但这并不会产生不良影响。
问题:
m_maybeGestures
- 列表中删除手势?m_maybeGestures
列表中移除?m_maybeGestures
列表中移除手势会根据输入类型的不同处理?答案 0 :(得分:0)
回答我自己的问题:
MayBeGesture
状态中任意删除手势的计时器。如果任意删除手势是一个问题,请升级到Qt 4.7或更高版本。