Qt Widget - 如何捕获几个键盘键

Joh*_*ing 4 c++ keyboard qt4

我知道使用grabKeyboard()我的小部件能够抓住每个键盘事件,如果它没有聚焦,但如果我只想捕获三个或四个键怎么办?

我尝试使用事件过滤器 http://doc.trolltech.com/3.3/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);
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能拦截我的小部件中的几个键,并留下其他小部件(QTextEdits)?

Fra*_*eld 6

你自己的评论说明了一切:

return TRUE; // eat event
Run Code Online (Sandbox Code Playgroud)

当您返回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;
    }
}
Run Code Online (Sandbox Code Playgroud)