Я пытаюсь решить загадку ввода, которая оказалась более сложной, чем я первоначально думал. Оригинальный дизайн, служащий отправной точкой для иллюстрации проблемы, был довольно простым. Он должен был предложить поддержку следующих жестов:
для следующей топологии виджетов:
+-------------------------------+
| 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
система, позволяющая реализовать изложенные требования, и если да, то как?
Задача ещё не решена.