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

#c #windows #qt #gesture #qt4.6

#c #Windows #qt #жест #qt4.6

Вопрос:

Я нахожусь в процессе внедрения системы ввода на основе сенсорного ввода, используя 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 ) {
        CSingleFingerPanGestureamp; panState = *static_cast< CSingleFingerPanGesture* >( state );

        QGestureRecognizer::Result resu<

        switch ( event->type() ) {
        case QEvent::TouchBegin: {
            const QTouchEventamp; 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 QMouseEventamp; mouseEvent = *static_cast< const QMouseEvent* >( event );
            panState.startPos = mouseEvent.posF();
            result = QGestureRecognizer::MayBeGesture;
            break;
        }

        // ...
        }
        return resu<
    }
    // ...
};
  

Хотя ввод с помощью мыши и сенсорного ввода обрабатывается одинаково, и оба возвращают один и тот же Result флаг, общее поведение отличается. В частности, при взаимодействии с сенсорной поверхностью жест в состоянии MayBeGesture удаляется из списков жестов через 3 секунды (см. QGestureManager::timerEvent ), и тем самым, по-видимому, отменяет другие жесты. Хотя жесты мыши также удаляются из m_maybeGestures -list, это не приводит к нежелательному эффекту.

Вопросы:

  1. Почему жесты автоматически удаляются из m_maybeGestures -list?
  2. Есть ли способ предотвратить удаление жестов из m_maybeGestures -list?
  3. Почему удаление жеста из m_maybeGestures -list обрабатывается по-разному в зависимости от типа ввода?

Ответ №1:

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

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