【问题标题】:Check if a Key is Down with Qt使用 Qt 检查密钥是否已关闭
【发布时间】:2011-09-12 22:13:33
【问题描述】:

我正在玩一些图形,并且我已经用箭头键实现了简单的相机移动。我的第一种方法是覆盖keyPressEvent 来做这样的事情:

switch(key)
{
   case up: MoveCameraForward(step); break;
   case left: MoveCameraLeft(step); break;
   ...
}

这不像我希望的那样工作。例如,当我按住前进键时,相机会向前移动“步”单位,然后暂停一段时间,然后继续移动。我猜这就是事件的生成方式,以避免在按键有点长的情况下发生多个事件。

所以,我需要在我的Paint() 例程中轮询键盘。我还没有找到如何用 Qt 做到这一点。我想有一个map<Key, bool>,它将在keyPressEvent 和keyReleaseEvent 中更新,并在Paint() 中轮询该地图。有更好的想法吗?感谢您提供任何见解。

【问题讨论】:

    标签: c++ qt event-handling keyboard-events


    【解决方案1】:

    这并不能解决检测按下哪些键的一般问题,但如果您只是在寻找键盘修饰符(shift、ctrl、alt 等),您可以通过静态 QApplication::keyboardModifiers() 和 @ 检索它987654322@方法。

    【讨论】:

    • Qt::KeyboardModifiers QApplication::queryKeyboardModifiers() 使用 QT 4.8.7 为我工作
    【解决方案2】:

    所以,我需要在我的 Paint() 例程中轮询键盘。我还没有找到 如何用 Qt 做到这一点。我想有一张地图 在 keyPressEvent 和 keyReleaseEvent 中更新并轮询该映射 油漆()。

    你的第二种方法是我会做的,除了我会使用一个连续的、周期性的 QTimer 事件来轮询键盘按下的地图,并在必要时调用 QWidget::Update() 函数来使显示小部件无效。出于多种原因,强烈建议不要在 Paint() 中执行非绘制操作,但我不知道该如何解释。

    【讨论】:

    • 这是特别鼓励的,因为键盘重复率可以由用户设置。这是保证它独立于您的内部滴答率的唯一方法。
    • 在 qt 论坛中有一个主题和一个关于此的示例:qt-project.org/forums/viewreply/135346
    【解决方案3】:

    没有用于检查某个键是否被按下的 Qt API。 您可能需要为不同的平台编写单独的代码并添加一些#ifdef 逻辑。

    在 Windows 上,您可以使用 GetKeyState() 和 GetKeyboardState(),两者都在 windows.h 中声明。

    【讨论】:

      【解决方案4】:

      在使用 Qt 时这并不简单,但 Gluon 团队一直在努力解决这个问题(以及其他一些问题)。 GluonInput 解决了这个问题,并作为 Gluon 的一部分提供:http://gluon.gamingfreedom.org/ 它也是一个不错的类似 Qt 的 API,因此虽然它是一个额外的依赖项,但您应该可以使用它。

      【讨论】:

        【解决方案5】:

        这是由键的自动重复引起的:

        例如,当我按住前进键时,相机会移动 前进“步”单位,然后暂停一段时间,然后继续 移动。

        在 QT5 中,您可以检测到由函数 isAutoRepeat() 的 QKeyEvent 对象按住的键。如果按住键,则isAutoRepeat() 将返回true。 例如:

        void MainWindow::keyPressEvent(QKeyEvent *event)
        {
            if (event->isAutoRepeat())
            {
                return;
            }
        
            if (!event->isAutoRepeat())
            {
                qDebug() << "[MainWindow::keyPressEvent()] " << event->key() << "; " << event->isAutoRepeat();
            }
        }
        
        void MainWindow::keyReleaseEvent(QKeyEvent *event)
        {
            if (event->isAutoRepeat())
            {
                return;
            }
            qDebug() << "[MainWindow::keyReleaseEvent()] " << event->key() << "; " << event->isAutoRepeat();
        }
        

        【讨论】:

          【解决方案6】:

          在 Qt5 中使用 QGuiApplication::keyboardModifiers() 和 QGuiApplication::queryKeyboardModifiers() 作为键盘修饰符

          【讨论】:

            猜你喜欢
            • 2018-01-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-22
            相关资源
            最近更新 更多