Qt多个键在keypressevent()

qt multiple keys in keypressevent()

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

我试图在Qt上创建一款玩家可以走对角线的游戏。所以当我按W和D键时,玩家可以进入右上角。然而,当我先按W键,然后按D键,然后再按D键时,玩家不会朝W方向移动。实际上,按住W键甚至没有发出调用keypressevent()函数的信号。然而,当我按W键,然后按D键,然后释放W键时,角色就会朝D方向移动。

以下是我的代码:

void my_qscroll::keyPressEvent(QKeyEvent *event)
{
    switch ( event->key() )
    {
    case Qt::Key_W:
        key[0] = 1;
        break;
    case Qt::Key_A:
        key[1] = 1;
        break;
    case Qt::Key_S:
        key[2] = 1;
        break;
    case Qt::Key_D:
        key[3] = 1;
        break;
    }
    for(int i = 0; i != 4 ; i++)
    {
        if(key[i] == 1)
        {
            this->B = i;
            emit Move();
        }
    }
}
void my_qscroll::keyReleaseEvent(QKeyEvent *event)
{
    switch ( event->key() )
    {
    case Qt::Key_W:
        key[0] = 0;
        qDebug() << "released W";
        break;
    case Qt::Key_A:
        key[1] = 0;
        qDebug() << "released A";
        break;
    case Qt::Key_S:
        key[2] = 0;
        qDebug() << "released S";
        break;
    case Qt::Key_D:
        key[3] = 0;
        qDebug() << "released D";
        break;
    }
}

我不知道如何解决这个问题。任何想法或链接来帮助我将是伟大的。提前谢谢你。

您需要这样做:

void my_qscroll::keyPressEvent(QKeyEvent *event)
{
    switch ( event->key() )
    {
    case Qt::Key_W:
        key[0] = 1;
        break;
    case Qt::Key_A:
        key[1] = 1;
        break;
    case Qt::Key_S:
        key[2] = 1;
        break;
    case Qt::Key_D:
        key[3] = 1;
        break;
    }
    for(int i = 0; i != 4 ; i++)
    {
        if(key[i] == 1)
        {
            this->B = i;
            emit Move();
        }
    }
}
void my_qscroll::keyReleaseEvent(QKeyEvent *event)
{
    switch ( event->isAutoRepeat() )
    {
    case Qt::Key_W:
        key[0] = 0;
        qDebug() << "released W";
        break;
    case Qt::Key_A:
        key[1] = 0;
        qDebug() << "released A";
        break;
    case Qt::Key_S:
        key[2] = 0;
        qDebug() << "released S";
        break;
    case Qt::Key_D:
        key[3] = 0;
        qDebug() << "released D";
        break;
    }
}
void my_qscroll::movePlayer() {
  if (key[1] && key[0]) {
      left -= 2;
      top -= 2;
  } else if (key[3] && key[0]) {
      left += 2;
      top -= 2;
  } else if (key[2] && key[1]) {
      left -= 2;
      top += 2;
  } else if (key[2] && key[3]) {
      left += 2;
      top += 2;
  } else if (key[3]) {
      left += 2;
  } else if (key[1]) {
      left -= 2;
  } else if (key[2]) {
      top += 2;
  } else if (key[0]) {
      top -= 2;
  }
}
void myCanvas::updateEnv() {
    emit Move();
    repaint();
}