Qt多键组合事件

时间:2010-06-20 21:57:22

标签: c++ qt events key

我正在使用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(或者密钥序列中的第一个键)。

谢谢, 托马斯

2 个答案:

答案 0 :(得分:6)

QShortcut不支持您正在寻找的功能。您只能与修饰键组合,如Shift,Ctrl,Alt和Meta。

你的代码所做的是创建一个快捷方式,当用户第一次按下W然后再按下D时,它会响应。这也是为什么它会与只响应W的其他快捷方式冲突的原因。

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

答案 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);