我正在使用Qt 4.6,我想对正在按下的多键组合(例如Key_Q + Key_W)做出反应。因此,当您按住一个键组合时,应始终调用该事件,就像处理单个键事件一样。我尝试使用QShortcuts并为它们启用自动重复,但这不起作用:
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(或者密钥序列中的第一个键)。
谢谢, 托马斯
答案 0 :(得分:6)
QShortcut不支持您正在寻找的功能。您只能与修饰键组合,如Shift,Ctrl,Alt和Meta。
你的代码所做的是创建一个快捷方式,当用户第一次按下W然后再按下D时,它会响应。这也是为什么它会与只响应W的其他快捷方式冲突的原因。
如果你想在同时按下同时按
答案 1 :(得分: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);