【问题标题】:PyQt5 - Double press same keyboard keyPyQt5 - 双击相同的键盘键
【发布时间】:2020-03-21 12:53:01
【问题描述】:

我通过子类化QMainWindow 并覆盖keyPressEventkeyReleaseEvent 函数来处理多个按键操作,然后在按键是否按下时更新字典...

  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 字典以包含可设置为TrueFalse 的双击键,但我不知道如何知道该键是否已连续快速按下两次。

到目前为止,这是我的代码:

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()

【问题讨论】:

  • 更详细地解释你想要什么,然后指出你想要解决的问题。
  • 我希望能够知道何时快速连续按两次键,并在发生这种情况时将变量设置为 true。我不知道从哪里开始

标签: python-3.x pyqt5 keyevent qkeyevent


【解决方案1】:

一种可能的解决方案是保留属性last_pressed 来跟踪最近按下的键。无需使用计时器调用keyAction,只需从按键按下和释放事件中调用keyAction。现在在keyPressEvent 中,如果计时器isActivelast_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()

【讨论】:

    猜你喜欢
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 2014-11-17
    • 2020-10-09
    • 2013-02-01
    • 1970-01-01
    相关资源
    最近更新 更多