无法检测 Shift 和 Ctrl 键的状态

Can't detect state of Shift and Ctrl keys

我编写了一个简单的 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 window 具有焦点时才检测按下的键。如果你想检测这些键是否被按下,即使 Qt window 没有焦点,那么你将不得不使用 OS 中的库或 pynput, keyboard[=12 这样的库=]