Событие множественного регистра ключей PyQt5

#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 она будет вызываться несколько раз.