Qt Widget - 如何仅捕获几个键盘键
Posted
技术标签:
【中文标题】Qt Widget - 如何仅捕获几个键盘键【英文标题】:Qt Widget - how to capture just a few keyboard keys 【发布时间】:2012-07-23 18:55:25 【问题描述】:我知道使用grabKeyboard() 我的小部件也可以在没有获得焦点的情况下抓取每个键盘事件,但如果我只想抓取三个或四个键怎么办?
我尝试使用事件过滤器 https://doc.qt.io/qt-5/qobject.html#installEventFilter
但这不起作用(也许是因为我是这样安装的?)
class MyWidget: public QGLWidget
...
protected:
bool eventFilter( QObject *o, QEvent *e );
;
bool MyWidget::eventFilter( QObject *o, QEvent *e )
if ( e->type() == QEvent::KeyPress )
// special processing for key press
QKeyEvent *k = (QKeyEvent *)e;
qDebug( "Ate key press %d", k->key() );
return TRUE; // eat event
else
// standard event processing
return FALSE;
// Installed it in the constructor
MyWidget::MyWidget()
this->installEventFilter(this);
我怎样才能只截取我的小部件中的几个键而让其他小部件 (QTextEdits) 剩下的?
【问题讨论】:
【参考方案1】:你自己的评论说明了一切:
return TRUE; // eat event
当您为所有键返回 true
时,不会进一步处理该事件。对于您不想处理的所有键,您必须返回 false
。
另一种没有事件过滤器但重新实现keyPressEvent的方式:
void MyWidget::keyPressEvent( QKeyEvent* event )
switch ( event->key() )
case Qt::Key_X:
//act on 'X'
break;
case Qt::Key_Y:
//act on 'Y'
break;
default:
event->ignore();
break;
【讨论】:
你写的第二种方式..我做到了!但不知何故,“忽略”并没有将密钥转发给其他小部件,而 grabKeyboard() 继续“吃掉”所有事件,也包括那些被忽略的事件 我在你的帮助下解决了,现在我“grabKeyboard()”只是当过滤器告诉我openGL小部件有焦点(即用户点击它)谢谢你!以上是关于Qt Widget - 如何仅捕获几个键盘键的主要内容,如果未能解决你的问题,请参考以下文章