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

C++ 如何防止在MayBeGesture状态下删除手势超时?,c++,windows,qt,gesture,qt4.6,C++,Windows,Qt,Gesture,Qt4.6,我正在使用运行在MicrosoftWindows7上的Qt4.6.3实现一个基于触摸的输入系统。为了使状态机保持在可管理的复杂性,我决定使用该框架的手势识别基础设施。我一直遵循指南,为每个手势实现并注册了我的派生类 大多数手势识别器都能正常工作,但有一个例外:我的单指摇摄会暴露出(对我)无法解释的行为。由于我希望在触发平移手势之前保留一个小的公差窗口,因此初始接触(鼠标或触摸)的事件必须报告MayBeGesture结果,并且只会通过返回triggershistore请求向前移动到Qt::Gest

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

大多数手势识别器都能正常工作,但有一个例外:我的单指摇摄会暴露出(对我)无法解释的行为。由于我希望在触发平移手势之前保留一个小的公差窗口,因此初始接触(鼠标或触摸)的事件必须报告
MayBeGesture
结果,并且只会通过返回
triggershistore
请求向前移动到
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;
    }
    // ...
};
class CSingleFingerPangestureRecognitor:公共QgestureRecognitor
{
公众:
虚拟QgestureRecognitor::结果识别(Q手势*状态,
QObject*,
QEvent*事件){
csinglefingerpangestree&panState=*静态施法(状态);
QgestureRecognitor::结果;
开关(事件->类型(){
案例QEvent::TouchBegin:{
const QTouchEvent&touchEvent=*静态播放(事件);
//过滤掉多点触摸手势
if(touchEvent.touchPoints().size()==1){
QTouchEvent::TouchPoint p=touchEvent.touchPoints()。位于(0);
panState.startPos=p.pos();
结果=QgestureRecognitor::MayBeGesture;
}
打破
}
案例QEvent::鼠标按钮按下:{
const QMouseEvent和mouseeEvent=*static_cast(事件);
panState.startPos=mouseEvent.posF();
结果=QgestureRecognitor::MayBeGesture;
打破
}
// ...
}
返回结果;
}
// ...
};
尽管鼠标和触摸输入的处理方式相同,并且都返回相同的
结果
-标志,但总体行为不同。特别是,当与触摸屏交互时,状态为
MayBeGesture
的手势会在3秒钟后从手势列表中删除(请参见
QGestureManager::timerEvent
),这样做显然会取消其他手势。虽然也会从
m_maybeGestures
-列表中删除鼠标手势,但这不会暴露不良效果

问题:

  • 为什么手势会自动从
    m_maybeGestures
    -列表中删除
  • 有没有办法防止手势从
    m_maybeGestures
    -列表中删除
  • 为什么从
    m_maybeGestures
    -列表中删除手势会根据输入类型进行不同的处理

  • 回答我自己的问题:

  • 如中所述,这种行为实际上没有任何原因
  • Qt 4.7中删除了控制在
    MayBeGesture
    状态下任意删除手势的计时器。如果任意删除手势有问题,请升级到Qt 4.7或更高版本
  • 经过进一步调查,在处理鼠标和触摸输入方面没有差异。唯一的区别在于输入特性。虽然触摸输入会生成一个连续的更新事件流,但单个左键按下事件不会。正是对更新事件的处理最终触发了手势的删除