qt keypressevent()中的多个键

Posted

技术标签:

【中文标题】qt keypressevent()中的多个键【英文标题】:qt multiple keys in keypressevent() 【发布时间】:2014-05-03 22:37:46 【问题描述】:

我正在尝试在 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;
    

我不确定如何解决这个问题。任何可以帮助我的想法或链接都会很棒。先感谢您。

【问题讨论】:

所以在我提出问题后,我的朋友给我发了这个链接:qtforum.org/article/28368/… 它完美地解决并解决了我的问题。 【参考方案1】:

你需要这样的东西:

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

【讨论】:

以上是关于qt keypressevent()中的多个键的主要内容,如果未能解决你的问题,请参考以下文章

qt keyPressEvent函数方向键没有响应键盘事件的解决方法

不能通过 keyPressEvent 使用 QPlainTextEdit 中的其他键

Qt keyPressEvent

qt按键 keypressevent

在使用 keyPressEvent 子类化 QTableView 后,我失去了对箭头键的使用。如何在保持自定义信号的同时轻松使用它们进行导航?

Qt键盘事件--组合键响应方法