Cha*_*nce 5 keyboard qt keyboard-events
我是 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 中,是否有任何可靠的方法来跟踪普通键和修饰键的一对一按键按下和释放?如果没有,你能得到的最接近的是什么?
编辑:我可以稍微完善一下。看起来,如果您按住CmdMac,按下几个键(例如字母键),释放它们,然后释放Cmd,您不会收到字母键释放的释放事件。 我将尝试隔离一个小示例,看看这是否确实是 Qt 错误。
我认为,如果您对键盘非常具体,那么您将离开 Qt 并获得特定于操作系统的东西,或者您需要在进行任何过滤之前处理 Qt 事件。
Qt 中的加速器会查找并等待 Alt+__ 组合,您可以设置 Ctrl+__ 组合以供 QAction 监听。
这两种类型的对象内置于 QApplication 和通用 GUI 环境中,可能会中断您收到的消息,并且给您的消息少于您的预期。
Qt 文档:事件系统 ...这部分有一个链接到...
QCoreApplication::notify() ...它告诉最高级别的 Qt 应用程序可以编写为使用 Qt API 处理输入:
在 上安装事件过滤器
QCoreApplication::instance()
。这样的事件过滤器能够处理所有小部件的所有事件,因此它与重新实现notify()一样强大;此外,可以有多个应用程序全局事件过滤器。全局事件过滤器甚至可以看到禁用的小部件的鼠标事件。请注意,仅针对主线程中的对象调用应用程序事件过滤器。
如果从安装在上述级别的 Qt 事件过滤器中查看调试语句会产生与您在问题中提到的相同的结果,那么您将需要转到操作系统特定的键盘输入内容。例如,在 Windows 中,您需要扫描键盘和/或查看整个键盘的 VK 状态并对其执行某些操作(例如GetKeyboardState()
)。
归档时间: |
|
查看次数: |
4491 次 |
最近记录: |