捕捉Qt修饰键的释放

5
我是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错误。
2个回答

2
我认为,如果你对键盘非常具体化,你需要离开Qt并获取一些特定于操作系统的东西,或者在任何过滤发生之前处理Qt事件。
在过滤之前处理Qt事件
Qt中的加速器寻找并等待Alt+__组合键,您可以设置Ctrl+__组合键由QAction监听。
这些对象都内置于QApplication和一般GUI环境中,可能会中断您收到的消息,并给您带来比您预期的要少的东西。 Qt文档:事件系统...这部分有一个链接到这里... QCoreApplication::notify()...它告诉最高级别,Qt应用程序可以使用Qt API编写以处理输入。
QCoreApplication::instance()上安装事件过滤器。这样的事件过滤器能够处理所有小部件的所有事件,因此它与重新实现notify()一样强大;此外,可以有多个应用程序全局事件过滤器。全局事件过滤器甚至可以看到禁用小部件的鼠标事件。请注意,只有在主线程中存在的对象才会调用应用程序事件过滤器。

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

如果查看安装在上述级别的Qt事件过滤器的调试语句产生与您在问题中提到的相同结果,则需要转向特定于操作系统的键盘输入内容。例如,在Windows中,您需要扫描键盘或查看整个键盘的VK状态,并对其进行某些操作(使用类似于GetKeyboardState()的东西)。

0

我知道回答这个问题有点晚了。但是...我也遇到了Mac键释放事件的同样问题,而且还有一个开放的错误QTBUG-36839。 在Windows上,您可以实现键盘钩子来捕获每个按键/释放事件。但即使在某些情况下,这也不可靠。例如,在解锁后输入锁定屏幕快捷方式后,您将不会看到任何键释放。我猜在Mac上必须有类似于钩子的东西。如果对您来说重要的是记住用户按下的确切物理键 - 我认为这是最好的方法之一。同时,从我的经验来看,做一些低级别的事情需要很长时间,并且可能会在您从未想象过的情况下带来奇怪的错误。所以问题是:您确定不能使用像QAction这样的东西来完成您需要的工作吗? 或者您可以在快捷方式中使用Control键而不是Command键 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接