Qt Widget - how to capture just a few keyboard keys
c++, keyboard, qt4
Solution
Your own comment says it all:
return TRUE; // eat event
As you return `true` for all keys, the event won't be further processed. You must return `false` for all keys you don't want to handle.
Another way without event filter but reimplementing 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;
}
}
Problem
I know that with grabKeyboard() my widget is able to grab every keyboard event also if it's not focused, but what if I wanted to capture just three or four keys? I tried with an event filter https://doc.qt.io/qt-5/qobject.html#installEventFilter but that didn't work (perhaps because I installed it like this?) ``` 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); } ``` How can I intercept just a few keys in my widget and leave other widgets (QTextEdits) the rest?