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 - 如何仅捕获几个键盘键的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Qt::Key 转换为键盘键名?

如何禁止在Qt中使用带有按钮的键盘上的箭头键

如何在 QT 虚拟键盘上按下信号键并播放声音点击轨道?

使用 Qt 4.6 从键盘挂钩键和组合键

使用 Qt 4.6 从键盘挂钩键和组合键

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