You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 11:16:12