Как предотвратить тайм-аут удаления жестов в состоянии MayBeGesture?

Я нахожусь в процессе внедрения системы ввода на основе касания, использующей Qt 4.6.3, работающей в Microsoft Windows 7. Чтобы сохранить конечные автоматы в управляемой сложности, я решил использовать инфраструктуру распознавания жестов инфраструктуры. Я следил за Программирование жестов направлять и реализовывать и регистрировать мой QGestureRecognizer-производные классы для каждого жеста.

Большинство распознавателей жестов работают должным образом, за одним исключением: My Единственная кастрюля пальца разоблачает необъяснимое (для меня) поведение. Так как я хочу сохранить маленькое окно допуска до запуска жеста панорамирования, событие для начального контакта (мыши или касания) должно сообщить о 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-лист обрабатывается по-разному в зависимости от типа ввода?

3

Решение

Чтобы ответить на мой собственный вопрос:

  1. Там практически нет причин для такого поведения, как объяснено в [# QTBUG-9926] Удалить таймер уничтожения для MaybeGestures из QGestureManager.
  2. Таймер, управляющий произвольным удалением жестов в MayBeGesture состояние было удалено в Qt 4.7. Если проблема заключается в произвольном удалении жестов, обновитесь до Qt 4.7 или новее.
  3. При дальнейшем исследовании не было никакой разницы в управлении мышью и сенсорным вводом. Разница только во входных характеристиках. В то время как сенсорный ввод генерирует непрерывный поток Обновить события, одно нажатие левой кнопки не происходит. Это обработка Обновить события, которые в конечном итоге вызывает удаление жестов.
0

Другие решения


По вопросам рекламы [email protected]