#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.