我是Qt的新手,但我正在尝试实现Qt应用程序中的视频游戏式输入循环(疯狂,我知道,但看看你是否可以提供帮助)。对于所有键,包括修饰符,我需要准确的一对一事件处理按键和键释放,无论你如何对键盘进行和弦操作都很奇怪。
当然,您对关键事件的主要访问权限是QKeyEvent
。但是,让我们说以下情况发生了:
据我所知,我从Qt得到的是:
Qt::Key_Ctrl
)Qt::Key_Up
)key() == Qt::Key_Up
,Ctrl位反映在修饰符中。这可能不完全准确,但我最好的猜测是从问题的过多调试中发生了什么。无论如何,涉及修饰符的关键发布事件难以置信不可靠。
最后的Ctrl + Up序列就是问题所在。现在,我知道我在e->modifiers()
中获得了修饰符状态,我正在e->key()
进行按键操作。我可以做一些复杂的黑客攻击,试图在内部记住修改器状态,以检测用户何时释放修改器。但是,Qt文档告诉我,e->modifiers()
说:
此功能无法始终信任。例如,用户可以同时按两个Shift键并释放其中一个来混淆它。
这正是我试图避免的情况。
有没有可靠的方法来跟踪Qt中正常和修改键的一对一按键和释放?如果没有,你最接近的是什么?
编辑:我可以稍微改进一下。似乎如果你在Mac上按住 Cmd ,按几个键(字母键,比方说),释放它们,然后释放 Cmd ,你 don'获取字母密钥发布的发布事件。我将尝试隔离一个小例子,看看这是否真的是一个Qt bug。
答案 0 :(得分:2)
我认为如果您对键盘非常具体,那么您将离开Qt并获得特定于操作系统的内容,或者您需要在任何过滤发生之前处理Qt事件。
Qt中的加速器查找并等待Alt + __组合,您可以设置Ctrl + __组合以通过QAction收听。
QApplication和一般GUI环境中内置的这两种类型的对象可能会中断您获得的消息,并且会给您少于您期望的消息。
Qt Documentation: The Event System ...这部分有这个链接...
QCoreApplication::notify() ...告诉最高级别可以使用Qt API编写Qt应用程序来处理输入:
在
QCoreApplication::instance()
上安装事件过滤器。这样的事件过滤器能够处理所有小部件的所有事件,因此它与重新实现notify()一样强大;此外,可以有多个应用程序全局事件过滤器。全局事件过滤器甚至可以查看已禁用小组件的鼠标事件。请注意,仅为主线程中的对象调用应用程序事件过滤器。
如果查看安装在上述级别的Qt事件过滤器的调试语句会产生与您在问题中提到的结果相同的结果,那么您将需要转到操作系统特定的键盘输入内容。例如,在Windows中,您需要扫描键盘并查看整个键盘的VK状态并对其执行某些操作(使用类似GetKeyboardState()
的内容)。
答案 1 :(得分:0)
我知道回答这个问题有点晚了。仍然......我对Mac密钥发布事件有同样的问题,并且有一个开放的错误QTBUG-36839。 在Windows上,您可以实现键盘钩子来捕获每个键按下/释放。但即便如此,在某些情况下也不可靠。例如。如果您在解锁后键入锁屏快捷键,则不会看到任何键释放。我猜必须有类似于Mac上的钩子。如果你记住什么是物理关键用户按下很重要 - 我认为这是最好的方法之一。同时,根据我的经验,做一些低级别的事情需要花费很多时间,并且可能会给你无法想象的情况带来一些奇怪的错误。所以问题是:你确定你不能用QAction这样的东西制作你需要的东西吗? 或者你可以在快捷方式中使用Control代替Command:)