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

时间:2014-06-18 13:25:43

标签: c++ windows qt gesture qt4.6

我正在使用在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 - 列表中删除,但这并不会产生不良影响。

问题:

  1. 为什么会自动从m_maybeGestures - 列表中删除手势?
  2. 有没有办法阻止手势从m_maybeGestures列表中移除?
  3. 为什么从m_maybeGestures列表中移除手势会根据输入类型的不同处理?

1 个答案:

答案 0 :(得分:0)

回答我自己的问题:

  1. [#QTBUG-9926] Remove kill timer for maybeGestures from QGestureManager中解释了这种行为几乎没有理由。
  2. 在Qt 4.7中删除了控制MayBeGesture状态中任意删除手势的计时器。如果任意删除手势是一个问题,请升级到Qt 4.7或更高版本。
  3. 经过进一步调查,处理鼠标和触摸输入没有区别。唯一的区别在于输入特性。虽然触摸输入会生成连续的 Update 事件流,但单个左按钮按下事件却不会。处理 Update 事件最终会触发删除手势。