Реализация звуков касания с помощью Qt5 Quick Controls 2

В настоящее время я ищу способ реализовать звуки касания для приложения Qt5 Quick Controls 2, сравнимые со звуками касания, которые изначально доступны на Android. Однако до сих пор я не мог найти способ надежно их реализовать. Звуки прикосновения должны возникать только тогда, когда, например. кнопка была нажата, но не тогда, когда пользователь нажимает на случайные части экрана.

Моей первой попыткой было просмотреть дерево объектов QML и подключиться ко всем сигналам clicked() в C++. Это сработало частично, но поскольку я динамически загружаю QML-код с помощью компонента QML-загрузчика, я не смог синхронизировать это, даже когда установил фильтр для событий ChildAdded для всех объектов в дереве. Я также не уловил все (под)компоненты с помощью этого подхода, потому что, например. внутренне используемый QQuickSpinButton не испускает сигналы clicked().

Есть ли у кого-нибудь идеи для альтернативных решений?


person J. Hamme    schedule 14.08.2018    source источник


Ответы (1)


Альтернативой было бы сделать это на уровне приложения.

Используйте installEventFilter на своем QGuiApplication, а затем в своем eventFilter, реагировать на события типа QEvent::MouseButtonPress и QEvent::MouseButtonRelease (думаю, вам не нужно обращаться с QEvent::TouchBegin и друзьями).

person GrecKo    schedule 14.08.2018
comment
Проблема, с которой я сталкиваюсь при таком подходе, заключается в том, что я получаю события MouseButtonPress, даже когда пользователь нажимает на неактивную область, такую ​​​​как панель Qml. - person J. Hamme; 14.08.2018
comment
Ах, действительно! Какое поведение вы хотите, когда управление мышью перехватывается щелчком или чем-то еще? Например, у вас есть список с делегатами, пользователь начинает прокрутку делегата: делегат получит событие для прессы, но затем оно будет отменено и не будет иметь события выпуска. Это должно вызывать звук? - person GrecKo; 14.08.2018
comment
Нет, это не должно вызывать звук. Звуки должны воспроизводиться только тогда, когда пользователь нажимает на интерактивную область, например. У меня есть Listview, где каждый делегат представляет собой прямоугольник, содержащий MouseArea, реализующий onClicked. Щелчок по такому делегату должен вызывать звук, но начало прокрутки такого делегата не должно вызываться. Звуки предназначены для обеспечения обратной связи об успешном касании элемента пользовательского интерфейса, например. звук должен запускаться только в том случае, если пользователь действительно нажал кнопку, но не в том случае, если он ее пропустил. - person J. Hamme; 14.08.2018
comment
То есть звук должен издаваться при отпускании, а не при нажатии? - person GrecKo; 14.08.2018
comment
Конечно, это, вероятно, было бы лучше, но я не вижу, как это помогает с реальной проблемой. Когда я фильтрую события MouseButtonRelease, у меня по-прежнему нет возможности определить, был ли нажат компонент или нет. - person J. Hamme; 14.08.2018
comment
вы можете проверить QQuickWindow::mouseGrabberItem() при выпуске, возможно, издать звук, если у него есть сигнал clickedmetaObject()->indexOfSignal("clicked()") != -1) - person GrecKo; 14.08.2018