我是 Qt 的新手,但我正在尝试在 Qt 应用程序中实现基本上相当于视频游戏式输入循环的东西(我知道这很疯狂,但看看你能不能帮忙)。我需要准确的、一对一的按键和按键释放事件处理,包括修饰符在内的所有按键,无论您多么奇怪地敲击键盘。
当然,您对关键事件的主要访问是通过QKeyEvent
. 但是,假设发生以下情况:
- 用户按住Ctrl
- 用户按住Up
- 用户发布Ctrl并Up同时
据我所知,我从 Qt 得到的是:
- QKeyEvent 用于单独按下Ctrl, (
Qt::Key_Ctrl
) - QKeyEvent 用于单独按下Up, (
Qt::Key_Up
) - QKeyEvent 用于释放Ctrl+Up, with
key() == Qt::Key_Up
和 Ctrl 位反映在修饰符的变化中。
这可能并不完全准确,但这是我对问题调试过多的最佳猜测。无论如何,涉及修饰符时的按键释放事件是非常不可靠的。
最后的 Ctrl+Up 序列是问题所在。现在,我知道我得到了修饰符状态e->modifiers()
,并且我得到了按键e->key()
。我可以做一些复杂的修改,尝试在内部记住修改器状态,以检测用户何时释放修改器。但是随后,Qt 文档告诉我,说到e->modifiers()
:
这个函数不能总是被信任。例如,用户可以通过同时按下两个 Shift 键并释放其中一个来混淆它。
这正是我试图避免的情况。
有没有可靠的方法来跟踪 Qt 中的普通键和修饰键的一对一按键按下和释放?如果不是,你能得到的最接近的是什么?
编辑:我可以稍微改进一下。似乎如果您Cmd在 Mac 上按住,按几个键(比如字母键),释放它们,然后 release Cmd,您不会收到字母键释放的释放事件。 我将尝试隔离一个小例子,看看这是否真的是一个 Qt 错误。