2010-06-20 76 views
5

我正在使用Qt 4.6,我想对多键组合(例如Key_Q + Key_W)作出反应,这些组合键被按住。所以,当你按住组合键时,应该始终调用事件,就像使用单键事件一样。我试图用QShortcuts并启用自动重复他们,但没有奏效:Qt多键组合事件

keyCombos_.push_back(new QShortcut(QKeySequence(Qt::Key_W, Qt::Key_D), this)); 
connect(keyCombos_[0], SIGNAL(activated()), SLOT(keySequenceEvent_WD())); 
setShortcutAutoRepeat(keyCombos_[0]->id(), true); 

使用此方法时我也有,我不能赶单Key_W(或任何在第一关键问题keysequence是)笔画了。

感谢, 托马斯

回答

6

QShortcut不支持你正在寻找的功能。您只能使用修改键(如Shift,Ctrl,Alt和Meta)进行组合。

你的代码做什么是使响应的快捷方式,当用户首先按W和再D.这也是为什么它会与其他应对冲突的快捷方式只是W.

当你想要做的当W和D同时按下时,您必须重写QWidget的keyPressEventkeyReleaseEvent方法,以便跟踪它们的按下状态,并在按下它们时手动调用处理函数。如果你没有使用合适的QWidget子类,你可以引入它,或者在适当的地方使用QObject::installEventFilter安装事件过滤器,如果它应该是全局快捷方式,可能在应用程序对象上。

3

您可以将按下的按键添加到按下的按键组中,并在按下按键时从该组中删除。所以,你可以添加按键的展示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_D) && pressedKeys.contains(Qt::Key_W)) 
     { 
      // D and W are pressed 
     } 

    } 
    else if(event->type()==QEvent::KeyRelease) 
    { 

     pressedKeys -= ((QKeyEvent*)event)->key(); 
    } 


    return false; 
} 

不要忘记安装事件过滤器在构造函数中:

this->installEventFilter(this); 
+0

谢谢。这很有帮助并且易于理解。 – GoodDeeds 2017-02-05 19:29:27