PyQt6中如何在mousePressEvent里检测非内置KeyboardModifier的按键?
PyQt6中在mousePressEvent检测字母/数字键与鼠标同时按下的方法
问题描述
我在PyQt6中已为Ctrl、Shift、Alt分配了功能,现在想使用未在内置KeyboardModifier中定义的字母键或标准数字键(非KeypadModifier中的数字键)。我想了解是否可以创建自定义修饰符,或通过其他方法在mousePressEvent中检测同时按下的按键。
我尝试了以下代码:
from PyQt6.QtWidgets import QWidget class MyWidget(QWidget): def __init__(self): super().__init__() def mousePressEvent(self, event): # Check if the left mouse button is pressed if event.button() == Qt.LeftButton: # Check if the key "1" is pressed if event.key() == Qt.Key_1: print("Left mouse button and number key 1 pressed simultaneously") # Handle the event accordingly super().mousePressEvent(event) def keyPressEvent(self, event): # Check if the key pressed is the number key "1" if event.key() == Qt.Key_1: print("Number key 1 pressed") # Handle the event accordingly super().keyPressEvent(event)
但出现了如下错误:
AttributeError: 'QMouseEvent' object has no attribute 'key'
因此我想了解是否有其他实现方法。
解决方法
QMouseEvent没有key()方法,要检测鼠标点击时的普通按键状态,你可以使用以下两种有效方式:
1. 跟踪按键状态(推荐)
维护一个集合记录当前按下的按键,在keyPressEvent和keyReleaseEvent中更新状态,然后在mousePressEvent中检查这些状态:
from PyQt6.QtWidgets import QWidget from PyQt6.QtCore import Qt class MyWidget(QWidget): def __init__(self): super().__init__() self.pressed_keys = set() def keyPressEvent(self, event): self.pressed_keys.add(event.key()) if event.key() == Qt.Key.Key_1: print("Number key 1 pressed") super().keyPressEvent(event) def keyReleaseEvent(self, event): if event.key() in self.pressed_keys: self.pressed_keys.remove(event.key()) super().keyReleaseEvent(event) def mousePressEvent(self, event): if event.button() == Qt.MouseButton.LeftButton: # 检查数字键1是否处于按下状态 if Qt.Key.Key_1 in self.pressed_keys: print("Left mouse button and number key 1 pressed simultaneously") super().mousePressEvent(event)
2. 直接检查按键状态
利用QApplication.isKeyPressed()静态方法,在mousePressEvent中直接检测目标按键是否按下:
from PyQt6.QtWidgets import QWidget, QApplication from PyQt6.QtCore import Qt class MyWidget(QWidget): def mousePressEvent(self, event): if event.button() == Qt.MouseButton.LeftButton: # 直接检查数字键1是否按下 if QApplication.instance().isKeyPressed(Qt.Key.Key_1): print("Left mouse button and number key 1 pressed simultaneously") super().mousePressEvent(event) def keyPressEvent(self, event): if event.key() == Qt.Key.Key_1: print("Number key 1 pressed") super().keyPressEvent(event)
注意事项
- 无法创建自定义的
KeyboardModifier,因为这是Qt内部定义的枚举类型,只能通过上述两种方式检测普通按键与鼠标的组合。 - 第一种方法适合需要跟踪按键按下/释放时序的场景,第二种方法更简洁,适合简单的状态检查。
内容的提问来源于stack exchange,提问作者Saurav Sircar
相关产品推荐
相关产品推荐

