PyQt5 - Двойное нажатие на ту же клавиатуру - PullRequest
0 голосов
/ 21 марта 2020

Я обрабатываю несколько нажатий клавиш путем подкласса QMainWindow и переопределения функций keyPressEvent и keyReleaseEvent, а затем обновляю словарь, если клавиша нажата или нет ...

  def keyPressEvent(self,event):
    self.pressedKeys[event.key()] = True

  def keyReleaseEvent(self,event):
    self.pressedKeys[event.key()] = False

... и pressedKeysArray:

  pressedKeys = {Qt.Key_Left: False,
                 Qt.Key_Right: False,
                 Qt.Key_Down: False,
                 Qt.Key_Up: False}

Однако я хотел бы иметь возможность ловить двойной щелчок правой стрелкой, скажем, в пределах 100 или 200 миллисекунд друг от друга. Я бы расширил словарь pressedKeys, включив в него клавиши двойного щелчка, которые можно установить на True или False, но я не знаю, как узнать, была ли клавиша нажата дважды в быстрой последовательности.

Вот мой код:

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys

class MainWindow(QMainWindow):
  pressedKeys = {Qt.Key_Left: False,
                 Qt.Key_Right: False,
                 Qt.Key_Down: False,
                 Qt.Key_Up: False}

  def __init__(self,parent=None,*args,**kwargs):
    QMainWindow.__init__(self,parent,*args,**kwargs)
    self.parent = parent

    self.timer = QTimer()
    self.timer.timeout.connect(self.keyAction)
    self.timer.start(50)

    self.show()

  def keyPressEvent(self,event):
    self.pressedKeys[event.key()] = True

  def keyReleaseEvent(self,event):
    self.pressedKeys[event.key()] = False

  def keyAction(self):
    if self.pressedKeys[Qt.Key_Left] and self.pressedKeys[Qt.Key_Down]: print("rolling left")

    elif self.pressedKeys[Qt.Key_Right] and self.pressedKeys[Qt.Key_Down]: print("rolling right")

    elif self.pressedKeys[Qt.Key_Left]: print("running left")

    elif self.pressedKeys[Qt.Key_Right]: print("running right")

    elif self.pressedKeys[Qt.Key_Down]: print("crouching") #return here to block effect of 'up' key being pressed

    if self.pressedKeys[Qt.Key_Up]: print("jumping")

def exceptHook(exectype,value,traceback):
  sys.__excepthook__(exectype,value,traceback)

if __name__ == "__main__":
  sys.excepthook = exceptHook
  app = QApplication(sys.argv)
  mainWindow = MainWindow()
  app.quit()

1 Ответ

2 голосов
/ 22 марта 2020

Возможным решением является сохранение свойства last_pressed для отслеживания самой последней нажатой клавиши. Вместо использования таймера для вызова keyAction, просто наберите keyAction с нажатия клавиши и отпустите события. Теперь в keyPressEvent, если таймер isActive и last_pressed == event.key(), вы знаете, что это было «двойное» нажатие клавиши. В противном случае назначьте последнюю нажатую клавишу и запустите таймер. Если таймер достигает тайм-аута, сбросьте last_pressed.

class MainWindow(QMainWindow):

    pressedKeys = {Qt.Key_Left: False, Qt.Key_Right: False,
                   Qt.Key_Down: False, Qt.Key_Up: False}

    def __init__(self,parent=None,*args,**kwargs):
        QMainWindow.__init__(self,parent,*args,**kwargs)
        self.parent = parent
        self.last_pressed = None

        self.timer = QTimer()
        self.timer.setSingleShot(True)
        self.timer.timeout.connect(self.clear_pressed)

        self.show()

    def clear_pressed(self):
        self.last_pressed = None

    def keyPressEvent(self,event):
        self.pressedKeys[event.key()] = True
        if self.timer.isActive():
            if self.last_pressed == event.key():
                print('Double')
                self.timer.stop()
        else:
            self.timer.start(200)
        self.last_pressed = event.key()
        self.keyAction()

    def keyReleaseEvent(self,event):
        self.pressedKeys[event.key()] = False
        self.keyAction()
...