Использование нескольких ключей в QT C++

Я строю игру "Танки", где использую событие 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;
} 

2 ответа

Решение

Вы можете добавить нажатую клавишу к набору нажатых клавиш и удалить из этого набора при отпускании клавиши. Таким образом, вы можете добавить нажатую клавишу в 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

И каждый раз вам просто нужно проверить, какие клавиши нажаты. От AND с масками:

1000 - вверх

0111 - Вниз

0010 - Оставил

0001 - Правильно

Другие вопросы по тегам