如何防止MayBeGesture状态下的手势超时移除
How to prevent timeout removal of gestures in MayBeGesture state?
我正在实现一个基于触摸的输入系统,使用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
列表中删除,但这不会暴露出不良效果。
问题:
- 为什么手势会自动从
m_maybeGestures
列表中删除? - 是否有办法防止手势从
m_maybeGestures
列表中删除? - 为什么从
m_maybeGestures
-列表中删除手势根据输入类型处理不同?
回答我自己的问题:
- 在[#QTBUG-9926]中删除了maybeGestures的kill timer。
- 在Qt 4.7中删除了控制
MayBeGesture
状态下任意移除手势的定时器。如果任意移除手势是一个问题,请升级到Qt 4.7或更高版本。 - 经过进一步调查,在处理鼠标和触摸输入方面没有差异。唯一的区别是输入特性。当触摸输入产生一个连续的Update事件流时,单个左键按下事件不会。Update事件的处理最终触发手势的移除。
相关文章:
- 防止主数据类型C++的隐式转换
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何防止C++遗留代码中的挂起指针
- Python中的for循环与C++有何不同
- 如何防止clang格式在流运算符调用之间添加换行符<<
- C++减少modbus_connect超时
- 没有超时的C++条件变量
- 如何防止初始值设定项列表中的错误值?
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 如何在C++(VS2010)中设置超时读取USB端口?
- C++ 防止在映射中放置()时调用析构函数
- 是否可以防止省略聚合初始化成员?
- C++卷曲柱在curl_easy_perform超时
- 在C++中释放内存期间,迭代器与指针有何不同
- 如何在多个线程中创建 QSql数据库连接时防止名称冲突
- 超时 fwrite 调用以防止其阻塞
- 如何防止MayBeGesture状态下的手势超时移除
- 防止打印结束后系统超时