I want to intercept Tab key press in my main window to prevent Qt from switching focus. Here's what I've tried so far:
bool CMainWindow::event(QEvent * e)
{
if (e && e->type() == QEvent::KeyPress)
{
QKeyEvent * keyEvent = dynamic_cast<QKeyEvent*>(e);
if (keyEvent && keyEvent->key() == Qt::Key_Tab)
return true;
}
return QMainWindow::event(e);
}
This doesn't work, event
isn't called when I press Tab. How to achieve what I want?
Reimplementing virtual bool QApplication::notify(QObject * receiver, QEvent * e)
and pasting the code from my question there works.
The most elegant way I found to avoid focus change is to reimplement in your class derived from QWidget the method bool focusNextPrevChild(bool next)
and simply return FALSE
. In case you want to allow it, return TRUE
.
Like other keys you get now also the key Qt::Key_Tab
in keyPressEvent(QKeyEvent* event)
You can achieve by using setFocusPolicy( Qt::NoFocus)
property of QWidget. You can set Focus policy on widget which doesn't require tab focus. I think the reason why event handler is not calling, because Tab is managed by Qt framework internally. Please see QWidget::setTabOrder
API, which is static.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With