ArrowKey控制更多流体

时间:2015-03-19 22:03:36

标签: c++ qt events arrow-keys

我正在使用

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

使用Qt中的箭头键控制和对象。 我对所有的箭头键(右,左,上,下)都有相同的功能,但发生的事情是非常严格的。喜欢向右和向下走,你必须按右箭头键然后松开它,然后按向下箭头键。而我希望用户能够对这两者进行预处理,并让它以这种方式重新定位。我试过这个但是没有用。

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

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

     }

2 个答案:

答案 0 :(得分:1)

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

你想要的是一个检查按键是否被按住的功能,即如果按住左键然后向左移动,如果向下按住则向下按下,如果两个都被按下则向左下方按下。 / p>

Qt对此没有任何作用。其他人推荐了os特定解决方案,例如使用windows.h#ifdefs

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

祝你好运!

答案 1 :(得分:0)

您可以将按键添加到按键组中,并在释放按键时从该组中删除。因此,将按下的键添加到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;
}