无法检测Shift和Ctrl键的状态

问题描述

我编写了一个简单的PyQt5应用程序,它尝试检测Shift和Ctrl键的状态,每隔一秒检查一次。出于我不了解的原因,该代码始终报告未按任何键,无论实际的键盘状态如何。

import time

from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication,QWidget


class App(QWidget):
   def __init__(self):
      super().__init__()

      self.setGeometry(10,30,10,10)
      self.show()

      while True:
         modifiers= QApplication.keyboardModifiers()

         if modifiers == QtCore.Qt.ShiftModifier:
            print("Shift key is down; Ctrl key is up.")
         elif modifiers == QtCore.Qt.ControlModifier:
            print("Shift key is up; Ctrl key is down")
         elif modifiers == (QtCore.Qt.ControlModifier | QtCore.Qt.ShiftModifier):
            print("Shift and Ctrl keys are both down.")
         else:
            print("Neither Shift nor Ctrl is down.")

         time.sleep(1)

   # end def __init__


if __name__ == '__main__':
   import sys

   app= QApplication(sys.argv)
   ex = App()

   sys.exit(app.exec_())

解决方法

从不在主线程中使用time.sleep,因为它会阻塞事件循环,如果您要执行定期任务,请使用QTimer:

from PyQt5.QtCore import Qt,QTimer
from PyQt5.QtWidgets import QApplication,QWidget


class App(QWidget):
    def __init__(self):
        super().__init__()

        self.setGeometry(10,30,10,10)
        self.show()

        timer = QTimer(self,interval=1000,timeout=self.detect)
        timer.start()

    def detect(self):
        modifiers = QApplication.keyboardModifiers()

        if modifiers == Qt.ShiftModifier:
            print("Shift key is down; Ctrl key is up.")
        elif modifiers == Qt.ControlModifier:
            print("Shift key is up; Ctrl key is down")
        elif modifiers == (Qt.ControlModifier | Qt.ShiftModifier):
            print("Shift and Ctrl keys are both down.")
        else:
            print("Neither Shift nor Ctrl is down.")


if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    ex = App()

    sys.exit(app.exec_())

注意:您必须记住,只有在Qt窗口具有焦点时,Qt才会检测到按下的键。如果即使在Qt窗口没有焦点时也要检测是否按下了这些键,则必须使用操作系统中的库或类似pynputkeyboard

的库