Qt: иногда wheelEvent () не вызывается сразу при вращении колесика мыши - PullRequest
0 голосов
/ 04 февраля 2020

Я использую Qt wheelEvent для реализации прокрутки в пользовательском виджете. Обычно это работает нормально.

Однако при одновременном перетаскивании мыши и прокрутке колесиком мыши иногда случается, что вращение колесика мыши на один шаг вначале ничего не делает (нет wheelEvent получено). Это может даже случайно произойти несколько раз подряд. В следующий раз, когда приложение получит wheelEvent, оно получит накопленные event->angleDelta() всех предыдущих событий, о которых не было сообщено отдельно. По-видимому, в этом случае события буферизуются вместе. Обратите внимание, что wheelEvent может произойти в течение длительного времени после начального вращения колеса мыши в этом случае: это происходит только после повторного вращения колеса.

Это проблема, поскольку это означает, что мой Виджет иногда не правильно реагирует на прокрутку. Есть ли способ избежать такой буферизации и немедленно получить все события колеса?

Примечательно, что это поведение хорошо воспроизводимо, если одновременно перетаскивать мышь внутри виджета, который выполняет некоторые нетривиальные действия в результате. Поэтому я подозреваю, что это может произойти, если событие l oop кажется занятым. Но он, конечно, недостаточно занят, чтобы не справиться с каждым wheelEvent. Поэтому я хотел бы отключить эту буферизацию.

Я наблюдаю это на Linux с Qt 5.12.0. Любая помощь приветствуется, спасибо.

1 Ответ

1 голос
/ 04 февраля 2020

Я отвечаю на свой вопрос здесь, так как я нашел ответ после того, как написал его (но раньше не смог найти его в Google).

Об этой же проблеме сообщалось здесь (с несколько неописательным названием) : Qt QOpenGLWidget wheelEvent странное поведение

Для меня установка Qt::AA_CompressHighFrequencyEvents (см. https://doc.qt.io/qt-5/qt.html#ApplicationAttribute -enum ) на ложное, похоже, устранила проблему, как было опубликовано @ gatis paeglis в качестве ответа на этот вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...