#python #python-3.x #pyqt5 #keyevent
Вопрос:
У меня есть программа, программирующая с Pyqt5, в которой я хотел бы одновременно зарегистрировать некоторые клавиши;например, вверх вправо, чтобы перейти к верхней диагонали.
Проблема в том, что с помощью pressEvent принимается только первый ключ.
Также я использую QPygletWidget, но я не могу зарегистрировать событие push_handlers из pyglet в PyQt5.
from PyQt5 import QtWidgets from PyQt5.QtWidgets import QApplication class MyWindow(QtWidgets.QMainWindow): def __init__(self): super(MyWindow, self).__init__() def keyPressEvent(self, e, autorep=False): # print(e.key) # self.widget.key_pressed = e.key() print(e.key()) # self.widget.key_pressed = None if __name__ == '__main__': import sys app = QApplication(sys.argv) window = MyWindow() window.show() sys.exit(app.exec_()) ```
Ответ №1:
К сожалению QKeySequence
, не работает для последовательностей, которые не содержат CTRL.
Вы можете использовать keyPressEvent
и keyReleaseEvent
отслеживать, какие клавиши в данный момент нажаты и еще не отпущены.
from PyQt5 import QtWidgets, QtGui from PyQt5.QtWidgets import QApplication from PyQt5.QtCore import Qt class MyWindow(QtWidgets.QMainWindow): def __init__(self): super(MyWindow, self).__init__() self._keys = {Qt.Key_Up: False, Qt.Key_Right: False} def keyPressEvent(self, event): if event.key() in [Qt.Key_Up, Qt.Key_Right]: self._keys[event.key()] = True if self._keys[Qt.Key_Up] and self._keys[Qt.Key_Right]: self.onUpRight() def keyReleaseEvent(self, event): if event.key() in [Qt.Key_Up, Qt.Key_Right]: self._keys[event.key()] = False def onUpRight(self): print("onUpRight") if __name__ == '__main__': import sys app = QApplication(sys.argv) window = MyWindow() window.show() sys.exit(app.exec_())
Имейте в виду, что если удерживать клавишу дольше некоторого порога (я думаю, секунду), она отправляет последовательности keyPressEvent
keyReleaseEvent
, как если бы вы несколько раз нажимали кнопку, поэтому onUpRight
она будет вызываться несколько раз.