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

Posted

技术标签:

【中文标题】如何防止 MayBeGesture 状态下的手势超时移除?【英文标题】:How to prevent timeout removal of gestures in MayBeGesture state? 【发布时间】:2014-06-18 13:25:43 【问题描述】:

我正在使用在 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-flag,但整体行为是不同的。特别是,当与触摸表面交互时,状态为MayBeGesture 的手势会在 3 秒后从手势列表中删除(参见QGestureManager::timerEvent),这样做显然会抵消其他手势。虽然鼠标手势也从m_maybeGestures-list 中删除,但这不会暴露不良影响。

问题:

    为什么手势会自动从m_maybeGestures-list 中删除? 有没有办法防止手势从m_maybeGestures-list 中删除? 为什么从m_maybeGestures-list 中移除手势的处理方式因输入类型而异?

【问题讨论】:

【参考方案1】:

回答我自己的问题:

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

【讨论】:

以上是关于如何防止 MayBeGesture 状态下的手势超时移除?的主要内容,如果未能解决你的问题,请参考以下文章

android手势如何平移控件

如何防止垂直滚动并通过一个滑动手势触发水平

如何防止 UITableViewCell 内的手势干扰 UITableView 的滚动?

如何防止超卖

css怎么设置鼠标手势

如何防止超链接链接