我正在构建“Tanks”游戏,其中我使用 Key 事件在地图上运行我的坦克。实际上我当时只能使用一个键,但我需要有同时上下左右的能力。
这是我的单键事件代码:
switch(event->key())
{
case Qt::Key_Up:
if(!ui->widget->playerList[playerID]->canMove(0.3, 20, 20, -20, -20, 1.5)) return;
ui->widget->playerList[playerID]->move(0.3);
ui->widget->updateGL();
break;
case Qt::Key_Down:
if(!ui->widget->playerList[playerID]->canMove(-0.2, 20, 20, -20, -20, 1.5)) return;
ui->widget->playerList[playerID]->move(-0.2);
ui->widget->updateGL();
break;
case Qt::Key_Right:
ui->widget->playerList[playerID]->rotate(10);
ui->widget->updateGL();
break;
case Qt::Key_Left:
ui->widget->playerList[playerID]->rotate(-10);
ui->widget->updateGL();
break;
case Qt::Key_Q:
ui->widget->playerList[playerID]->rotateCannon(10);
ui->widget->updateGL();
break;
case Qt::Key_E:
ui->widget->playerList[playerID]->rotateCannon(-10);
ui->widget->updateGL();
break;
default:
QMainWindow::keyPressEvent(event);
break;
}
Run Code Online (Sandbox Code Playgroud)
您可以将一个按下的键添加到一组按下的键中,并在释放该键时从该组中删除。因此,您可以将按下的键添加到作为类成员的 QSet 中:
QSet<int> pressedKeys;
Run Code Online (Sandbox Code Playgroud)
您可以在事件过滤器中捕获关键事件:
bool MyWidget::eventFilter(QObject * obj, QEvent * event)
{
if(event->type()==QEvent::KeyPress) {
pressedKeys += ((QKeyEvent*)event)->key();
f( pressedKeys.contains(Qt::Key_Up) && pressedKeys.contains(Qt::Key_Left) )
{
// up and left is pressed
}
}
else if(event->type()==QEvent::KeyRelease)
{
pressedKeys -= ((QKeyEvent*)event)->key();
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
不要忘记在构造函数中安装事件过滤器:
this->installEventFilter(this);
Run Code Online (Sandbox Code Playgroud)