Search code examples
c++qtqwidgetqtguiqevent

qt multiple keys in keypressevent()


I'm trying to create a game on Qt where the player can go diagonally. So when I press W and D, the player can go to the upper right hand corner. However, when I press W first, then D, then release D, the player does not go in the W direction. In fact, the holding of the W key isn't even being signaled to call the keypressevent() function. However, when I press W, then D, and then release W, the character goes in the D direction.

Here are my codes:

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

I'm not sure how to proceed through this problem. Any ideas or links to help me would be great. Thank you in advance.


Solution

  • You would need something like this:

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