Qt5 / PyQt5 не распознает кнопки мыши 4, 5, 6, 7, но распознает прокрутку

#python #pyqt5 #qt5

#python #pyqt5 #qt5

Вопрос:

Я создаю приложение на PyQt5 (5.15.0), Python 3.6, Ubuntu 20.04, где я хочу использовать планшет Wacom Cintiq 16 со стилусом для работы пользователя. Используя xsetwacom (man page), можно отобразить кнопки на стилусе. Сопоставив одну из кнопок с pan (объяснено здесь ), удерживая эту кнопку и перемещая перо вниз / вверх / вправо / влево, нажимает и отпускает кнопки мыши 4, 5, 6, 7 соответственно, как подтверждено xev . Это то же самое, что и при использовании xdotool: xdotool click 4 (или 5 / 6 / 7 )

Эта функция отлично работает в других приложениях, таких как Firefox, Terminal и т. Д. Однако программа PyQt5 не реагирует. Я создал небольшой графический интерфейс, который просто прослушивает события (я удалил те, которые были неактуальны и не запускались):

 import sys

from PyQt5 import QtWidgets, QtGui


class MainWindow(QtWidgets.QMainWindow):

    def __init__(self):
        super().__init__()
        self.setFixedWidth(500)
        self.setFixedHeight(500)

    def event(self, event) -> bool:
        print("event", event, event.type())
        return super(MainWindow, self).event(event)

    def tabletEvent(self, a0: QtGui.QTabletEvent) -> None:
        print("tabletEvent ", a0.button(), a0.type(), a0.buttons())
        super(MainWindow, self).tabletEvent(a0)

    def mousePressEvent(self, a0: QtGui.QMouseEvent) -> None:
        print("mousePressEvent", a0)
        super(MainWindow, self).mousePressEvent(a0)

    def keyReleaseEvent(self, a0: QtGui.QKeyEvent) -> None:
        print("keyReleaseEvent", a0)
        super(MainWindow, self).keyReleaseEvent(a0)

    def nativeEvent(self, eventType, message):
        print("nativeEvent", eventType, message)
        return super(MainWindow, self).nativeEvent(eventType, message)

    def wheelEvent(self, a0: QtGui.QWheelEvent) -> None:
        print("wheelEvent", a0)
        super(MainWindow, self).wheelEvent(a0)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec_()

 

При панорамировании с помощью стилуса видны только HoverEvent via event() и NativeEvent xcb_generic_event_t via nativeEvent() . Однако при прокрутке колесо мыши WheelEvent видно wheelEvent() . Последнее, как и ожидалось, но для первого я бы ожидал MousePressEvent via mousePressEvent() , как это происходит при нажатии левой / правой / средней кнопки мыши и даже кнопок назад / вперед на боковой панели мыши, но этого не происходит. MousePressEvent Для кнопки мыши 4, 5, 6 или 7 нет.

Как я могу зафиксировать эти триггеры кнопок мыши в (Py) Qt5?

Комментарии:

1. Вы говорите, что использование xsetwacom должно привести к тому же эффекту, что и использование xdotool, но, если бы это было так, вы должны правильно получать события колеса. Попробуйте xev и посмотрите, получаете ли вы события нажатия и отпускания для отображаемого жеста в его окне.

2. @musicamante, я могу подтвердить, что события печати и выпуска происходят. Недостающая вещь — это действительно событие wheel, которое улавливает Qt5, а не события нажатия и отпускания кнопок 4/5/6/7.

3. Извините, теперь я в замешательстве, что вы подразумеваете под «тем, что улавливает Qt5»? Вы сказали, что вообще не получили никакого события, кроме событий native и hover.

4. Qt5 запускает WheelEvents при прокрутке, но не при панорамировании с помощью стилуса. xev показывает, что как для прокрутки, так и для панорамирования нажимаются / отпускаются кнопки мыши 4/5/6/7. Разница, однако, заключается в том, что я вижу с Qt5. Qt5 воспринимает прокрутку как события колеса, а не как нажатие / отпускание кнопки мыши 4/5/6/7. Панорамирование также не выполняется, так как это только кнопка мыши 4/5/6/7.

5. Концептуально говоря, прокрутка и панорамирование (горизонтальная прокрутка) рассматриваются системой как пара нажатий / отпусканий кнопок 4/5 и 6/7 соответственно, и Qt регистрирует их оба как событие колеса (не события нажатия / отпускания мыши), горизонтальный компонент event.angleDelta().x() . Если вы не получаете никакого события колеса для горизонтальной прокрутки, это может быть проблемой с xsetwacom или базовой конфигурацией xorg.