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 多键组合事件的主要内容,如果未能解决你的问题,请参考以下文章