检查密钥是否已关闭Qt

时间:2011-09-12 22:13:33

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

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

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

这不符合我的意愿。当我按住(例如)前进键时,相机向前移动“步进”单位,然后暂停一段时间然后继续移动。我猜这是事件的生成方式,以避免在有点长按键的情况下发生多个事件。

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

6 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:6)

  

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

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

答案 2 :(得分:3)

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

在Windows上,您可以使用GetKeyState()GetKeyboardState()windows.h和{{1}}。

答案 3 :(得分:2)

使用Qt时这并不简单,但Gluon团队一直致力于解决这个问题(以及其他一些问题)。 GluonInput解决了这个问题,并且可以作为Gluon的一部分使用:http://gluon.gamingfreedom.org/它也是一个很好的,类似于Qt的API,所以虽然它是一个额外的依赖,但你应该可以使用它。

答案 4 :(得分:0)

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

例如,当我按住快进键时,相机移动 前进“步”单位,然后暂停片刻,然后继续 移动。

在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();
}

答案 5 :(得分:0)

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