У каждого виджета есть протектные виртуальные функции обработки сообщений, к примеру:
C++ (Qt)
virtual void keyPressEvent ( QKeyEvent * event )
virtual void keyReleaseEvent ( QKeyEvent * event )
virtual void mouseDoubleClickEvent ( QMouseEvent * event )
virtual void mouseMoveEvent ( QMouseEvent * event )
virtual void mousePressEvent ( QMouseEvent * event )
virtual void mouseReleaseEvent ( QMouseEvent * event )
Соответстыенно можно переопределить нужную функцию, и используя функции QEvent классов (QKeyEvent::key()) понять, что нажал пльзователь.
Альтернативный вариант, это фильтрация сообщений, с помощью функций QObject::installEventFilter(), QObject::eventFilter().
По поводу фокуса, тут тоже есть два варианта: во-первых можно вызвать функцию setFocus() для виджета, на который должен перейти фокус; во-вторых можно вызвать в родительсом виджете функцию focusNextChild (), но при этом должна быть правильно расставлена последовательность табов (мне этот вариант кажеться более правильным, так как не меняет логики интерфейса).