PyQt6?鍵盤事件處理的實現(xiàn)及實例代碼
一、鍵盤事件處理詳解
在 PyQt6 中,鍵盤事件處理是 GUI 開發(fā)的核心功能之一,通過重寫特定事件處理器實現(xiàn)。以下是關(guān)鍵要點和完整實現(xiàn)方案:
1、核心事件處理器
按鍵按下事件
重寫 keyPressEvent 方法處理按鍵動作:
def keyPressEvent(self, event):
key = event.key() # 獲取按鍵編碼
if key == Qt.Key.Key_A: # 檢測特定按鍵
print("A鍵被按下")
按鍵釋放事件
重寫 keyReleaseEvent 處理釋放動作:
def keyReleaseEvent(self, event):
if event.key() == Qt.Key.Key_Space:
print("空格鍵已釋放")
2、事件對象 QKeyEvent
| 方法 | 說明 | 示例 |
|---|---|---|
| key() | 獲取按鍵編碼 | Qt.Key.Key_Enter |
| text() | 獲取字符文本 | event.text() = "A" |
| modifiers() | 檢測修飾鍵 (Ctrl/Shift 等) | event.modifiers() & Qt.KeyboardModifier.ControlModifier |
| isAutoRepeat() | 判斷是否為長按重復事件 | if not event.isAutoRepeat(): |
3、修飾鍵處理
在 PyQt6 中,鍵盤事件(QKeyEvent)的修飾鍵(Modifier Keys)用于檢測用戶是否同時按下了特殊功能鍵(如 Shift、Ctrl、Alt 等)。以下是修飾鍵的詳細說明和使用方法:
(1)、修飾鍵類型
PyQt6 通過 Qt.KeyboardModifier 枚舉定義修飾鍵,常用值包括:
Qt.ShiftModifier:Shift 鍵Qt.ControlModifier:Ctrl 鍵(Windows/Linux)或 Command 鍵(macOS)Qt.AltModifier:Alt 鍵(Windows/Linux)或 Option 鍵(macOS)Qt.MetaModifier:Windows 鍵 或 Command 鍵(macOS)Qt.KeypadModifier:小鍵盤按鍵Qt.NoModifier:無修飾鍵
(2)、檢測修飾鍵
在重寫 keyPressEvent 或 keyReleaseEvent 時,通過 event.modifiers() 獲取修飾鍵狀態(tài):
from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import QMainWindow
class MainWindow(QMainWindow):
def keyPressEvent(self, event):
modifiers = event.modifiers()
# 檢測單個修飾鍵
if modifiers & Qt.ControlModifier:
print("Ctrl 鍵被按下")
# 檢測組合修飾鍵
if modifiers == (Qt.ControlModifier | Qt.ShiftModifier):
print("Ctrl+Shift 組合鍵")
# 檢測按鍵+修飾鍵
if event.key() == Qt.Key_S and modifiers & Qt.ControlModifier:
print("Ctrl+S 保存操作")
(3)、組合鍵檢測方法
方法 1:位運算檢測
def keyPressEvent(self, event): if event.key() == Qt.Key_A and event.modifiers() & Qt.ControlModifier: print("Ctrl+A 全選")方法 2:
QKeyCombination(PyQt6.4+)from PyQt6.QtGui import QKeyCombination def keyPressEvent(self, event): combo = QKeyCombination(event.modifiers(), event.key()) if combo == QKeyCombination(Qt.ControlModifier, Qt.Key_C): print("Ctrl+C 復制")
(4)、完整示例
from PyQt6.QtWidgets import QApplication, QMainWindow, QLabel
from PyQt6.QtCore import Qt
class KeyDemoWindow(QMainWindow):
def __init__(self):
super().__init__()
self.label = QLabel("按任意鍵測試修飾鍵", self)
self.setCentralWidget(self.label)
def keyPressEvent(self, event):
mod_text = []
modifiers = event.modifiers()
if modifiers & Qt.ShiftModifier:
mod_text.append("Shift")
if modifiers & Qt.ControlModifier:
mod_text.append("Ctrl")
if modifiers & Qt.AltModifier:
mod_text.append("Alt")
key_name = event.text() if event.text().isprintable() else f"Key_{event.key()}"
self.label.setText(f"按鍵: {key_name} | 修飾鍵: {', '.join(mod_text)}")
if __name__ == '__main__':
app = QApplication([])
window = KeyDemoWindow()
window.show()
app.exec()
(5)、注意事項
跨平臺差異:
- macOS 上
ControlModifier對應 Command 鍵 - 使用
Qt.MetaModifier檢測真正的 Control 鍵(macOS)
- macOS 上
特殊按鍵處理:
# 檢測 Enter 鍵 if event.key() == Qt.Key_Return: print("Enter 鍵按下") # 檢測方向鍵 if event.key() == Qt.Key_Left: print("左方向鍵")事件傳遞:
- 調(diào)用
event.ignore()允許事件繼續(xù)傳遞 - 調(diào)用
event.accept()標記事件已處理
- 調(diào)用
(6)、修飾鍵應用場景
| 組合鍵 | 典型功能 |
|---|---|
| Ctrl+C | 復制 |
| Ctrl+V | 粘貼 |
| Ctrl+Z | 撤銷 |
| Shift+方向鍵 | 文本選擇 |
| Alt+F4 | 關(guān)閉窗口 |
4、按鍵值
以下為PyQt6中QKeyEvent的常用按鍵值表格整理,按類別分類便于查閱:
(1)、字母與數(shù)字鍵
| 按鍵 | 值 (Qt.Key) | 說明 |
|---|---|---|
| A - Z | Qt.Key_A 至 Qt.Key_Z | 大寫字母A-Z |
| 0 - 9 | Qt.Key_0 至 Qt.Key_9 | 數(shù)字鍵 |
(2)、功能鍵
| 按鍵 | 值 | 說明 |
|---|---|---|
| Esc | Qt.Key_Escape | 退出鍵 |
| F1 - F12 | Qt.Key_F1 至 Qt.Key_F12 | 功能鍵 |
| Tab | Qt.Key_Tab | 制表鍵 |
| CapsLock | Qt.Key_CapsLock | 大寫鎖定鍵 |
| Enter | Qt.Key_Return | 回車鍵 |
| Backspace | Qt.Key_Backspace | 退格鍵 |
(3)、方向鍵
| 按鍵 | 值 | 說明 |
|---|---|---|
| ↑ | Qt.Key_Up | 上箭頭 |
| ↓ | Qt.Key_Down | 下箭頭 |
| ← | Qt.Key_Left | 左箭頭 |
| → | Qt.Key_Right | 右箭頭 |
(4)、修飾鍵
| 按鍵 | 值 | 說明 |
|---|---|---|
| Shift | Qt.Key_Shift | Shift鍵 |
| Ctrl | Qt.Key_Control | Ctrl鍵 |
| Alt | Qt.Key_Alt | Alt鍵 |
| Meta | Qt.Key_Meta | Windows/Command鍵 |
(5)、符號鍵
| 按鍵 | 值 | 說明 |
|---|---|---|
| ~ | Qt.Key_AsciiTilde | 波浪號 |
| ! - @ | Qt.Key_Exclam 至 Qt.Key_At | 符號鍵 |
| [ - \ | Qt.Key_BracketLeft 等 | 方括號/反斜杠 |
(6)、其他常用鍵
| 按鍵 | 值 | 說明 |
|---|---|---|
| Space | Qt.Key_Space | 空格鍵 |
| Delete | Qt.Key_Delete | 刪除鍵 |
| Home | Qt.Key_Home | Home鍵 |
| End | Qt.Key_End | End鍵 |
| PageUp | Qt.Key_PageUp | 頁上翻 |
| PageDown | Qt.Key_PageDown | 頁下翻 |
5、注意事項
事件過濾優(yōu)先級
- 控件未處理事件時傳遞給父容器
- 使用
event.ignore()傳遞事件給父級 - 使用
event.accept()標記已處理(默認)
特殊按鍵
方向鍵、功能鍵等需通過Qt.Key枚舉檢測,例如:Qt.Key.Key_Left # ← 鍵 Qt.Key.Key_F1 # F1 功能鍵
國際化處理
使用text()而非key()可適應不同鍵盤布局,如法語鍵盤的 “A” 和 “Q” 位置互換。
6、高級應用
事件過濾器
通過installEventFilter()全局監(jiān)聽鍵盤事件:self.obj.installEventFilter(self) # 安裝過濾器 def eventFilter(self, obj, event): if event.type() == QEvent.Type.KeyPress: print("全局捕獲按鍵:", event.key()) return super().eventFilter(obj, event)快捷鍵系統(tǒng)
使用QShortcut實現(xiàn)快捷鍵綁定:from PyQt6.QtGui import QShortcut shortcut = QShortcut("Ctrl+O", self) shortcut.activated.connect(self.open_file)
二、示例演示
1、效果展示

2、源碼分享
import sys
import serial
from PyQt6.QtCore import QThread, pyqtSignal, Qt
from PyQt6.QtSerialPort import QSerialPortInfo
from PyQt6.QtWidgets import (QApplication, QMainWindow, QVBoxLayout, QHBoxLayout,
QWidget, QLabel, QComboBox, QPushButton,
QTextEdit, QCheckBox, QSpinBox, QGroupBox)
from PyQt6.QtGui import QFont, QIcon, QPalette, QColor,QPainter
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.resize(800,600)
self.x = 0
self.y = 0
def paintEvent(self, a0, QPaintEvent=None):
p = QPainter(self)
p.fillRect(self.x,self.y,100,100,Qt.GlobalColor.red)
def keyPressEvent(self, event):
if event.key() == Qt.Key.Key_Up:
self.y-=10
elif event.key() == Qt.Key.Key_Down:
self.y+=10
elif event.key() == Qt.Key.Key_Left:
self.x-=10
elif event.key() == Qt.Key.Key_Right:
self.x += 10
elif event.modifiers() == Qt.KeyboardModifier.ControlModifier and event.key() == Qt.Key.Key_Q:
self.close()
self.update()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
上、下、左、右鍵控制紅色方框移動,Ctrl+q鍵退出。
到此這篇關(guān)于PyQt6 鍵盤事件處理的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)PyQt6 鍵盤事件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Pandas 數(shù)據(jù)處理,數(shù)據(jù)清洗詳解
今天小編就為大家分享一篇Pandas 數(shù)據(jù)處理,數(shù)據(jù)清洗詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07
Django如何使用asyncio協(xié)程和ThreadPoolExecutor多線程
這篇文章主要介紹了Django如何使用asyncio協(xié)程和ThreadPoolExecutor多線程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-10-10
python探索之BaseHTTPServer-實現(xiàn)Web服務器介紹
這篇文章主要介紹了python探索之BaseHTTPServer-實現(xiàn)Web服務器介紹,小編覺得還是挺不錯的,這里分享給大家,供需要的朋友參考。2017-10-10
基于Python實現(xiàn)局域網(wǎng)內(nèi)Windows桌面文件傳輸
這篇文章介紹了如何使用Python實現(xiàn)一個局域網(wǎng)文件傳輸系統(tǒng),包括發(fā)送端和接收端的代碼示例,發(fā)送端和接收端都需要在同一局域網(wǎng)內(nèi)運行,并且確保防火墻允許通信,圖形界面版本需要安裝tkinter庫,需要的朋友可以參考下2025-11-11
Python統(tǒng)計字符內(nèi)容的占比的實現(xiàn)
本文介紹了如何使用Python統(tǒng)計字符占比,包括字符串中字母、數(shù)字、空格等字符的占比,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-08-08
python運行或調(diào)用另一個py文件或參數(shù)方式
這篇文章主要介紹了python運行或調(diào)用另一個py文件或參數(shù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08

