[英]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.