Использование нескольких ключей в 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
- Правильно