Как правильно отменить жесты, когда конкурируют жесты с одним или двумя касаниями?

Я пытаюсь решить загадку ввода, которая оказалась более сложной, чем я первоначально думал. Оригинальный дизайн, служащий отправной точкой для иллюстрации проблемы, был довольно простым. Он должен был предложить поддержку следующих жестов:

  • Пан (один палец)
  • Нажмите

для следующей топологии виджетов:

+-------------------------------+
| container   +--------------+  |
|             | button       |  |
|             +--------------+  |
+-------------------------------+

container должен принять кастрюля жесты, в то время как button должен принять нажмите жесты. Должно быть возможно инициировать кастрюля жесты над любым виджетом внутри container виджет, включая его дочерние виджеты, т.е. button в этой конфигурации.

Решение этого состоит из двух QGestureRecognizer-производные классы, которые реализуют логику для распознавания любого жеста. QGestureEvent-обработчики одинаково прямолинейны: при касании дисплея TapGesture движется к Qt::GestureStarted состояние, а PanGesture остается в Qt::NoGesture, Когда палец выходит за пределы окна допуска, PanGesture переходы к Qt::GestureStarted, на что обработчик событий реагирует, отменяя жест касания. Это делается по телефону QGesture::setGestureCancelPolicy(QGesture::CancelAllInContext) с последующим QGestureEvent::accept(gesture). Если палец поднимается с сенсорной поверхности, не выходя за пределы окна допуска, TapGesture перемещен в Qt::GestureFinishedс последующим отменой кастрюля жест. (PanGesture а также TapGesture являются QGesture-производные классы, сохраняющие состояние конечного автомата для любого типа жеста.)

Вещи начали усложняться, когда появилось дополнительное требование добавить поддержку двойное нажатие к button Виджет был представлен. одно нажатие событие может быть запущено для первого крана, который является частью двойное нажатие.

И то и другое DoubleTapGesture (сохранение состояния), а также DoubleTapGestureRecognizer легко реализуются. У меня, однако, возникают трудности с решением проблемы отмены жестов. В отличие от предыдущей настройки, я больше не могу отменить все другие жесты, как только одно нажатие жест был признан, так как двойное нажатие жест потенциально все еще в полете. Выборочная отмена всех жестов, кроме активных двойное нажатие в ответ на законченное одно нажатие кажется правильным решением. Кроме того, фреймворк не предлагает способ вручную отменить жесты. Единственный выбор: автоматически отменить все (CancelAllInContext) или нет (CancelNone).

Вопрос: Можно ли контролировать отмену жеста в QGestureRecognizer система, позволяющая реализовать изложенные требования, и если да, то как?

3

Решение

Задача ещё не решена.

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


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