簡體   English   中英

將當前按下的所有鍵盤鍵存儲在 PyQt5 中

[英]Store all keyboard keys currently being pressed in PyQt5

我正在嘗試編寫一個 PyQt5 GUI 來捕獲當前按下的所有鍵盤鍵。 基於這個答案,我嘗試了以下最少的代碼:

import sys

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

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

        QApplication.instance().installEventFilter(self)

        self.pressedKeys = []

    def eventFilter(self, source, event):
        if event.type() == QEvent.KeyPress:
            if int(event.key()) not in self.pressedKeys:
                self.pressedKeys.append(int(event.key()))
                print(self.pressedKeys)
        elif event.type() == QEvent.KeyRelease:
            if int(event.key()) in self.pressedKeys:
                self.pressedKeys.remove(int(event.key()))
                print(self.pressedKeys)

        return super().eventFilter(source, event)


if __name__ == "__main__":
    app = QApplication(sys.argv)

    demo = MainWindow()
    demo.show()

    sys.exit(app.exec_())

當我運行它時,如果我按住一個鍵,output 列表會在包含鍵值和為空的列表之間來回切換。 同樣,按住多個鍵會將鍵添加到列表中,但會在包含和刪除我按下的最后一個鍵之間來回交替。 似乎如果我按住鍵, KeyRelease事件仍然會為我按下的最后一個鍵觸發。

有沒有辦法在 PyQt5 中保持所有當前按鍵,或者我應該使用不同的 package(例如,使用這個問題中建議的一個或其他包)?

請注意,我也嘗試過:

import sys

from PyQt5.QtWidgets import QApplication, QWidget

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

        self.pressedKeys = []

    def keyPressEvent(self, event):
        if int(event.key()) not in self.pressedKeys:
            self.pressedKeys.append(int(event.key()))
            print(self.pressedKeys)

    def keyReleaseEvent(self, event):
        if int(event.key()) in self.pressedKeys:
            self.pressedKeys.remove(int(event.key()))
            print(self.pressedKeys)

if __name__ == "__main__":
    app = QApplication(sys.argv)

    demo = MainWindow()
    demo.show()

    sys.exit(app.exec_())

這導致幾乎相同的行為。

物理鍵盤具有“自動重復”功能,可以在按住某個鍵的同時模擬多個鍵的壓力。

這會導致在按下標准鍵(通常不是修飾符)時發生多個按下/釋放事件,直到它被物理釋放,通常是為系統設置的速率。

您可以檢查該事件是否實際上是物理按下/釋放或者它是否是isAutoRepeat()

    def eventFilter(self, source, event):
        if event.type() == QEvent.KeyPress:
            if not event.isAutoRepeat() and int(event.key()) not in self.pressedKeys:
                self.pressedKeys.append(int(event.key()))
                print(self.pressedKeys)
        elif event.type() == QEvent.KeyRelease:
            if not event.isAutoRepeat() and int(event.key()) in self.pressedKeys:
                self.pressedKeys.remove(int(event.key()))
                print(self.pressedKeys)

        return super().eventFilter(source, event)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM