捕获Qt修饰键发布

我是Qt的新手,但我正在尝试实现Qt应用程序中的视频游戏式输入循环(疯狂,我知道,但看看你是否可以提供帮助).对于所有按键,包括修改器,我需要准确的一对一事件处理按键和按键释放,无论你如何对键盘进行和弦操作.

当然,您对主要事件的主要访问权限是通过QKeyEvent.但是,让我们说以下情况发生:

>用户按住Ctrl键
>用户按下并保持
>用户同时释放Ctrl和Up

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

>按Q键的QKeyEvent(Qt :: Key_Ctrl)
> QKeyEvent单独按下Up(Qt :: Key_Up)
> QKeyEvent释放Ctrl Up,键()== Qt :: Key_Up,Ctrl位反映在修饰符更改中.

这可能不完全准确,但我最好的猜测是从问题的过多调试中发生了什么.无论如何,涉及修饰符的关键释放事件非常不可靠.

最后的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,你就不会获得字母密钥发布的发布事件.我将尝试隔离一个小例子,看看这是否真的是一个Qt bug.

最佳答案 我想如果您对键盘非常具体,那么您将离开Qt并获得特定于操作系统的内容,或者您​​需要在任何过滤发生之前处理Qt事件.

在过滤之前处理Qt事件

Qt中的加速器查找并等待Alt __组合,您可以设置Ctrl __组合以通过QAction进行监听.

QApplication和一般GUI环境中内置的这两种类型的对象可能会中断您获得的消息,并且会给您少于您期望的消息.

Qt Documentation: The Event System ……这部分有这个链接……

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

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.

OS特定键盘处理替代方案

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

点赞