qt - 捕获 Qt 修饰键释放

标签 qt keyboard keyboard-events

我是 Qt 的新手,但我正在尝试在 Qt 应用程序中实现基本上相当于视频游戏式输入循环的内容(我知道这很疯狂,但看看你是否能提供帮助)。我需要对所有按键(包括修饰符)的按键按键释放进行准确的一对一事件处理,无论您如何奇怪地敲击键盘。

当然,您对按键事件的主要访问是通过QKeyEvent。但假设发生以下情况:

  • 用户按住Ctrl
  • 用户按住向上
  • 用户同时释放CtrlUp

据我所知,我从 Qt 得到的是:

  • QKeyEvent 用于单独按下 Ctrl (Qt::Key_Ctrl)
  • QKeyEvent 用于按下 Up 本身 (Qt::Key_Up)
  • QKeyEvent 用于释放 Ctrl+Up,其中 key() == Qt::Key_Up 且 Ctrl 位反射(reflect)在修饰符更改中。

这可能不完全准确,但这是我对问题进行过多调试后所发生情况的最佳猜测。无论如何,涉及修饰符时的关键释放事件极其不可靠。

最后的 Ctrl+Up 序列是问题所在。现在,我知道我在 e->modifiers() 中获取修饰符状态,并且在 e->key() 中获取按键。我可以做一些复杂的黑客,尝试在内部记住修改器状态,以检测用户何时释放修改器。但是,Qt 文档在谈到 e->modifiers() 时告诉我:

This function cannot always be trusted. The user can confuse it by pressing both Shift keys simultaneously and releasing one of them, for example.

这正是我想要避免的情况。

在 Qt 中,是否有任何可靠的方法来跟踪普通键和修饰键的一对一按键按下和释放?如果没有,您能得到的最接近的值是多少?

编辑:我可以稍微改进一下。看起来,如果您在 Mac 上按住 Cmd,按下几个键(例如字母键),释放它们,然后释放 Cmd,您就不会' t 获取字母键发布的发布事件。 我将尝试隔离一个小示例,看看这是否实际上是一个 Qt 错误。

最佳答案

我认为,如果您对键盘非常具体,那么您将离开 Qt 并获得特定于操作系统的东西,或者您需要在发生任何过滤之前处理 Qt 事件。

在过滤之前处理 Qt 事件

Qt 中的加速器会查找并等待 Alt+__ 组合,您可以设置 Ctrl+__ 组合以供 QAction 监听。

内置于 QApplication 和通用 GUI 环境中的这两种类型的对象都可能会中断您收到的消息,并给您带来比您预期更少的消息。

Qt Documentation: The Event System ...这部分有一个链接到...

QCoreApplication::notify() ...它告诉最高级别的是可以编写 Qt 应用程序来使用 Qt API 处理输入:

Installing an event filter on QCoreApplication::instance(). Such an event filter is able to process all events for all widgets, so it's just as powerful as reimplementing notify(); furthermore, it's possible to have more than one application-global event filter. Global event filters even see mouse events for disabled widgets. Note that application event filters are only called for objects that live in the main thread.

操作系统特定的键盘处理替代方案

如果从安装在上述级别的 Qt 事件过滤器中查看调试语句会产生与您在问题中提到的相同的结果,那么您将需要转到操作系统特定的键盘输入内容。例如,在 Windows 中,您需要扫描键盘和/或查看整个键盘的 VK 状态并对其执行某些操作(例如 GetKeyboardState() )。

关于qt - 捕获 Qt 修饰键释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10747991/

相关文章:

ios - 替换自定义键盘 iOS

java - 如何拦截Java中的音乐控制键盘快捷键?

c# - 短按和长按处理

qt - 改变 QImage/QPixmap 的色调

c++ - 如何在数组QT C++中添加数据

c++ - 如何向 QWidget 添加插槽?

iphone - UIKeyboardTypeDecimalPad 中的小数点不能用于数学计算

ios - 自定义键盘退格按钮

javascript - "KeyboardEvent.key"值跨浏览器一致吗?

c++ - 可编辑 QComboBox : synchronize edit text with item text