我正在玩一些图形,我用箭头键实现了简单的相机移动。我的第一种方法是覆盖keyPressEvent
做类似的事情:
switch(key)
{
case up: MoveCameraForward(step); break;
case left: MoveCameraLeft(step); break;
...
}
这不符合我的意愿。当我按住(例如)前进键时,相机向前移动“步进”单位,然后暂停一段时间然后继续移动。我猜这是事件的生成方式,以避免在有点长按键的情况下发生多个事件。
所以,我需要在我的Paint()
例程中轮询键盘。我还没有找到如何用Qt做到这一点。我想在map<Key, bool>
和keyPressEvent
中更新keyReleaseEvent
,并在Paint()
中对该地图进行投票。有更好的想法吗?感谢您的任何见解。
答案 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() 作为键盘修饰符