Qt 多键组合事件

Posted

技术标签:

【中文标题】Qt 多键组合事件【英文标题】:Qt multiple key combo event 【发布时间】:2010-06-20 21:57:22 【问题描述】:

我正在使用 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(或任何键序列中的第一个 Key)笔划。

谢谢, 托马斯

【问题讨论】:

【参考方案1】:

您可以将按下的键添加到按下的键组中,并在释放该键时从该组中删除。所以你可以将按下的键添加到 QSet 这是一个类成员:

QSet<int> pressedKeys;

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

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;

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

this->installEventFilter(this);

【讨论】:

【参考方案2】:

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

您的代码所做的是创建一个快捷方式,当用户先按 W 然后按 D 时做出响应。这也是为什么它会与仅响应 W 的其他快捷方式发生冲突的原因。

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

【讨论】:

以上是关于Qt 多键组合事件的主要内容,如果未能解决你的问题,请参考以下文章

Qt键盘事件--组合键响应方法

Qt和PyQt中的组合键输入捕获处理

qt中buttons()与button()的区别

在 Qt 中模拟鼠标功能

17.QT-事件处理分析事件过滤器拖放事件

QT学习_QT常用事件