我是Qt的新手,但我正在尝试在Qt应用程序中实现基本上相当于视频游戏输入循环的东西(疯狂的,我知道,但看看你能否帮助)。我需要准确地处理所有按键按下和松开事件,包括修饰键,无论您如何按键盘。
当然,您主要通过QKeyEvent获得按键事件。但假设发生以下情况:
用户按住Ctrl键
用户按住向上箭头键
用户同时释放Ctrl和Up键
就我所知,从Qt中获取到的是:
单独的按下Ctrl键的QKeyEvent(Qt::Key_Ctrl)
单独的按下Up键的QKeyEvent(Qt::Key_Up)
释放Ctrl + Up键的QKeyEvent,其中key() == Qt::Key_Up,且Ctrl位反映在修改器更改中。
这可能不完全准确,但对于太多此类问题进行了调试,这是我最好的猜测。无论如何,在涉及修饰键时,释放按键事件极其不可靠。
这里末尾的Ctrl + Up序列是问题所在。现在,我知道我在e->modifiers()中获取了修改器状态,并且在e->key()中获取了按键。我可以使用一些复杂的技巧,尝试在内部记住修改器状态,以检测用户何时释放了修改器。但是,Qt文档告诉我:
这个函数并不总是可靠的。例如,用户可以通过同时按下并释放其中一个Shift键来混淆它。
这正是我试图避免的情况。
在Qt中,是否有一种可靠的方法来跟踪普通键和修饰键的一对一按下和松开事件?如果没有,最接近的是什么?
编辑:我可以稍微细化一下。似乎如果您在Mac上按住Cmd键,按下几个键(比如字母键),然后释放它们,然后释放Ctrl,您就不会收到字母键释放事件。我将尝试隔离一个小示例,并查看是否实际上是Qt错误。
当然,您主要通过QKeyEvent获得按键事件。但假设发生以下情况:
用户按住Ctrl键
用户按住向上箭头键
用户同时释放Ctrl和Up键
就我所知,从Qt中获取到的是:
单独的按下Ctrl键的QKeyEvent(Qt::Key_Ctrl)
单独的按下Up键的QKeyEvent(Qt::Key_Up)
释放Ctrl + Up键的QKeyEvent,其中key() == Qt::Key_Up,且Ctrl位反映在修改器更改中。
这可能不完全准确,但对于太多此类问题进行了调试,这是我最好的猜测。无论如何,在涉及修饰键时,释放按键事件极其不可靠。
这里末尾的Ctrl + Up序列是问题所在。现在,我知道我在e->modifiers()中获取了修改器状态,并且在e->key()中获取了按键。我可以使用一些复杂的技巧,尝试在内部记住修改器状态,以检测用户何时释放了修改器。但是,Qt文档告诉我:
这个函数并不总是可靠的。例如,用户可以通过同时按下并释放其中一个Shift键来混淆它。
这正是我试图避免的情况。
在Qt中,是否有一种可靠的方法来跟踪普通键和修饰键的一对一按下和松开事件?如果没有,最接近的是什么?
编辑:我可以稍微细化一下。似乎如果您在Mac上按住Cmd键,按下几个键(比如字母键),然后释放它们,然后释放Ctrl,您就不会收到字母键释放事件。我将尝试隔离一个小示例,并查看是否实际上是Qt错误。