我正在使用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(或者密钥序列中的第一个键).
谢谢,托马斯
QShortcut不支持您正在寻找的功能.您只能使用Shift,Ctrl,Alt和Meta等修改键进行组合.
你的代码所做的是创建一个快捷方式,当用户第一次按下W然后再按下D时,它会响应.这也是为什么它会与只响应W的其他快捷方式冲突的原因.
当你想干什么时,W和d被压的东西在同一时间,你就必须重写了QWidget的keyPressEvent和keyReleaseEvent以保持其按下状态的跟踪方法,并手动调用处理功能,一旦他们都被压.如果您没有使用合适的QWidget子类,则必须引入它,或者使用QObject :: installEventFilter在正确的位置安装事件过滤器,如果它应该是全局快捷方式,可能在您的应用程序对象上.
您可以将一个按下的键添加到一组按下的键中,并在释放该键时从该组中删除。因此,您可以将按下的键添加到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)
归档时间: |
|
查看次数: |
5148 次 |
最近记录: |