在Qt c++中使用多个键

Using multiple keys in Qt C++

本文关键字:Qt c++      更新时间:2023-10-16

我正在创建"坦克"游戏,我使用键事件在地图上运行我的坦克。实际上我一次只能使用一个键,但是我需要有同时向上和向下的能力。

下面是我的单键事件代码:

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;
} 

您可以在按下的键集中添加一个按下的键,并在该键被释放时从该键集中删除该键。因此,您可以将按下的键添加到QSet中,它是类成员:

QSet<int> pressedKeys;

您可以在事件过滤器中捕获关键事件:

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;
}

别忘了在构造函数中安装事件过滤器:

this->installEventFilter(this);

也许你可以考虑看看面具?假设你有方向,定义一个四比特的掩码:

0 0 0 0

U D L R

每次你只需要检查按下了哪些键。By AND with mask:

1000 - Up

0111 - Down

0010 - Left

0001 -右