捕获Qt修饰键发布

时间:2012-05-25 03:07:13

标签: qt keyboard keyboard-events

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

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

  • 用户按住 Ctrl
  • 用户按住 Up
  • 用户同时发布 Ctrl Up

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

  • Ctrl 的QKeyEvent(Qt::Key_Ctrl
  • 按键 Up 的QKeyEvent(Qt::Key_Up
  • QKeyEvent释放 Ctrl + Up key() == Qt::Key_Up,Ctrl位反映在修饰符中。

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

最后的Ctrl + Up序列就是问题所在。现在,我知道我在e->modifiers()中获得了修饰符状态,我正在e->key()进行按键操作。我可以做一些复杂的黑客攻击,试图在内部记住修改器状态,以检测用户何时释放修改器。但是,Qt文档告诉我,e->modifiers()说:

  

此功能无法始终信任。例如,用户可以同时按两个Shift键并释放其中一个来混淆它。

这正是我试图避免的情况。

有没有可靠的方法来跟踪Qt中正常和修改键的一对一按键和释放?如果没有,你最接近的是什么?

编辑:我可以稍微改进一下。似乎如果你在Mac上按住 Cmd ,按几个键(字母键,比方说),释放它们,然后释放 Cmd ,你 don'获取字母密钥发布的发布事件。我将尝试隔离一个小例子,看看这是否真的是一个Qt bug。

2 个答案:

答案 0 :(得分:2)

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

在过滤前处理Qt事件

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

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

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

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

  

QCoreApplication::instance()上安装事件过滤器。这样的事件过滤器能够处理所有小部件的所有事件,因此它与重新实现notify()一样强大;此外,可以有多个应用程序全局事件过滤器。全局事件过滤器甚至可以查看已禁用小组件的鼠标事件。请注意,仅为主线程中的对象调用应用程序事件过滤器。

OS特定键盘处理替代

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

答案 1 :(得分:0)

我知道回答这个问题有点晚了。仍然......我对Mac密钥发布事件有同样的问题,并且有一个开放的错误QTBUG-36839。 在Windows上,您可以实现键盘钩子来捕获每个键按下/释放。但即便如此,在某些情况下也不可靠。例如。如果您在解锁后键入锁屏快捷键,则不会看到任何键释放。我猜必须有类似于Mac上的钩子。如果你记住什么是物理关键用户按下很重要 - 我认为这是最好的方法之一。同时,根据我的经验,做一些低级别的事情需要花费很多时间,并且可能会给你无法想象的情况带来一些奇怪的错误。所以问题是:你确定你不能用QAction这样的东西制作你需要的东西吗? 或者你可以在快捷方式中使用Control代替Command:)