【问题标题】:ArrowKey Control More Fluid箭头键控制更流畅
【发布时间】:2015-05-23 05:33:42
【问题描述】:

我正在使用

         event->key()== Qt::Key_Down

在 Qt 中使用箭头键控制和对象。 我对所有箭头键(右、左、上和下)都有相同的操作,但发生的情况是它非常僵硬。喜欢向右和向下你必须按向右箭头键,然后松开它并按向下箭头键。而我希望用户能够同时按下并以这种方式重新定位。我试过了,但没有用。

     else if(event->key()== Qt::Key_Down && event->key()== Qt::Key_Right ){ 

   setPos(x()+10,y()+10);

     }

【问题讨论】:

    标签: c++ qt events arrow-keys


    【解决方案1】:

    与大多数事件处理程序一样,Qt 仅在按下某个键时告诉您,并将所有按键放入队列中。因此,您的带有&& 的代码将永远不会被调用,因为如果 Qt::Key_Down 和 Qt::Key_Right 将依次处理按键。

    你想要的是一个检查键是否被按住的函数,即如果左被按住则向左,如果被按住则向下,如果两者都被按住则向左向下。

    Qt 没有这方面的功能。其他人推荐了特定于操作系统的解决方案,例如使用windows.h#ifdefs

    看看这个问题: Check if a Key is Down with Qt

    祝你好运!

    【讨论】:

      【解决方案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_Down) && pressedKeys.contains(Key_Right) )
              {
                  setPos(x()+10,y()+10);
              }
      
          }
          else if(event->type()==QEvent::KeyRelease)
          {
      
              pressedKeys -= ((QKeyEvent*)event)->key();
          }
      
      
          return false;
      }
      

      【讨论】:

        猜你喜欢
        • 2015-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-05
        • 2011-10-08
        • 2011-11-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多