【问题标题】:Catching Qt modifier key releases捕捉 Qt 修饰键释放
【发布时间】:2012-05-31 15:46:02
【问题描述】:

我是 Qt 的新手,但我正在尝试在 Qt 应用程序中实现基本上相当于视频游戏式输入循环的东西(我知道这很疯狂,但看看你是否能提供帮助)。我需要准确的一对一事件处理按键键释放,所有键,包括修饰符,无论你多么奇怪地敲击键盘。

当然,您对关键事件的主要访问是通过QKeyEvent。但是假设发生了以下情况:

  • 用户按住Ctrl
  • 用户按住向上
  • 用户同时释放CtrlUp

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

  • QKeyEvent 用于单独按下 Ctrl (Qt::Key_Ctrl)
  • QKeyEvent 用于单独按下 Up (Qt::Key_Up)
  • QKeyEvent 用于释放 Ctrl+Upkey() == Qt::Key_Up 和 Ctrl 位反映在修饰符更改中。

这可能并不完全准确,但这是我对问题调试过多导致的最佳猜测。无论如何,涉及修饰符时的关键释放事件难以置信不可靠。

最后的 Ctrl+Up 顺序是问题所在。现在,我知道我在e->modifiers() 中获得了修饰符状态,并且我在e->key() 中获得了按键。我可以做一些复杂的修改,尝试在内部记住修改器状态,以检测用户何时释放修改器。但随后,Qt 文档告诉我,说到e->modifiers()

这个函数不能总是被信任。例如,用户可以通过同时按下两个 Shift 键并释放其中一个来混淆它。

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

在 Qt 中,有没有可靠的方法来跟踪一对一的按键按下和释放,包括普通键和修饰键?如果没有,您能得到的最接近的距离是多少?

编辑:我可以稍微改进一下。似乎如果你在 Mac 上按住 Cmd,按几个键(比如字母键),松开它们,然后松开 Cmd,你 t 获取字母键发布的发布事件。 我将尝试隔离一个小示例,看看这是否真的是一个 Qt 错误。

【问题讨论】:

    标签: qt keyboard keyboard-events


    【解决方案1】:

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

    在过滤之前处理 Qt 事件

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

    QApplication 和一般 GUI 环境中内置的这两种类型的对象都可能会中断您收到的消息,并且给您的消息比您预期的要少。

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2014-01-11
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 2014-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多