QToolButton остается нажатым после того, как палец был удален с сенсорного экрана

У меня есть небольшое Qt настольное приложение (на C++), которое мне нужно, чтобы оно работало на устройстве с сенсорным экраном под управлением Window 10. Устройство имеет сенсорный экран, а приложение отлично работает с клавиатурой и мышью.

Я не эксперт в разработке Qt приложений, и поэтому неспособность решить эту проблему может быть глупой проблемой.

Однако, когда я пытаюсь использовать сенсорный экран, последняя кнопка QToolButton остается нажатой, даже если я отодвигаю палец от сенсорного экрана, и когда я касаюсь чего-то еще, эта кнопка QToolButton отпускается.

Я ожидаю, что кнопка Qtoolbutton будет вести себя так же, как если бы она была нажата с помощью мыши. Как только я убираю палец с сенсорного экрана, он должен быть отпущен.

Я попытался решить эту проблему следующим образом:

btn->setAttribute(Qt::WA_AcceptTouchEvents);

И

qApplication.setAttribute(Qt::AA_SynthesizeMouseForUnhandledTabletEvents);

Но это не помогло. Я думаю, что упускаю из виду очень небольшую проблему, и после этого Qt будет самостоятельно обрабатывать все события, связанные с касанием, и показывать правильное поведение.

Я выполняю кросс-компиляцию на своей машине с Ubuntu, используя MXE. Версия Qt 5.12.


person abhiarora    schedule 17.09.2019    source источник


Ответы (1)


Я думаю, что упускаю из виду очень небольшую проблему, и после этого Qt будет самостоятельно обрабатывать все события, связанные с касанием, и показывать правильное поведение.

Подклассы QWidget, включая QToolButton, сами по себе не обрабатывают сенсорные события. Даже не нужно, чтобы Qt эмулировал события мыши. Вы видите, как в вашем приложении эмулируются события мыши, синтезированные Windows. Это позволяет древним программам Windows, предназначенным для использования с мышью, работать на современных планшетах Windows с сенсорным экраном. А вот эмуляцию мыши вряд ли можно назвать идеальной.

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

person Former contributor    schedule 17.09.2019
comment
У вас есть пример кода? Я просто хочу обрабатывать сенсорные события и оставлять события мыши как есть. - person abhiarora; 17.09.2019
comment
Не для QToolButton и даже не для QWidget, но вы можете увидеть мою реализацию для сенсорных событий VMPK здесь. - person Former contributor; 17.09.2019
comment
Должен ли я генерировать события мыши, если я получаю события касания? - person abhiarora; 17.09.2019
comment
Я так не думаю. Вы можете напрямую вызывать любые общедоступные или защищенные методы, унаследованные от QAbstractButton и QToolButton. И я бы проигнорировал синтезированные события мыши, чтобы избежать двойного вызова некоторых из них. - person Former contributor; 17.09.2019