Qt多键组合事件

use*_*688 5 c++ events qt 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);
Run Code Online (Sandbox Code Playgroud)

当使用这种方法时,我也遇到了一个问题,即我无法捕获单个Key_W(或者密钥序列中的第一个键).

谢谢,托马斯

Tho*_*jer 6

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

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

当你想干什么时,W和d被压的东西在同一时间,你就必须重写了QWidget的keyPressEventkeyReleaseEvent以保持其按下状态的跟踪方法,并手动调用处理功能,一旦他们都被压.如果您没有使用合适的QWidget子类,则必须引入它,或者使用QObject :: installEventFilter在正确的位置安装事件过滤器,如果它应该是全局快捷方式,可能在您的应用程序对象上.


Nej*_*jat 6

您可以将一个按下的键添加到一组按下的键中,并在释放该键时从该组中删除。因此,您可以将按下的键添加到QSet作为类成员的 a 中:

QSet<int> pressedKeys;
Run Code Online (Sandbox Code Playgroud)

您可以在事件过滤器中捕获关键事件:

bool MyWidget::eventFilter(QObject * obj, QEvent * event)
{

    if ( event->type() == QEvent::KeyPress ) {

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

        if ( 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;
}
Run Code Online (Sandbox Code Playgroud)

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

this->installEventFilter(this);
Run Code Online (Sandbox Code Playgroud)