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

How to prevent timeout removal of gestures in MayBeGesture state?

本文关键字:超时 何防止 MayBeGesture 状态      更新时间:2023-10-16

我正在实现一个基于触摸的输入系统,使用Qt 4.6.3运行在Microsoft Windows 7上。为了使状态机保持可管理的复杂性,我决定使用框架的手势识别基础设施。我一直在遵循手势编程指南,并为每个手势实现和注册了我的QGestureRecognizer派生类。

大多数手势识别器都按预期工作,只有一个例外:My Single Finger Pan暴露了(对我来说)无法解释的行为。由于我希望在触发Pan手势之前保持一个小的容忍窗口,因此初始接触(鼠标或触摸)的事件必须报告MayBeGesture结果,并且只会通过返回TriggerGesture请求向前移动到Qt::GestureStarted状态。

这是相关的代码段:

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 -列表中删除手势根据输入类型处理不同?

回答我自己的问题:

    在[#QTBUG-9926]中删除了maybeGestures的kill timer。
  1. 在Qt 4.7中删除了控制MayBeGesture状态下任意移除手势的定时器。如果任意移除手势是一个问题,请升级到Qt 4.7或更高版本。
  2. 经过进一步调查,在处理鼠标和触摸输入方面没有差异。唯一的区别是输入特性。当触摸输入产生一个连续的Update事件流时,单个左键按下事件不会。Update事件的处理最终触发手势的移除。