截取Tab键按下可手动管理焦点切换

时间:2013-08-10 08:20:32

标签: qt event-handling qt4 qt5 keyevent

我想在我的主窗口中拦截 Tab 按键以防止Qt切换焦点。这是我到目前为止所尝试的内容:

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);
}

这不起作用,当我按 Tab 时,不会调用event。如何实现我的目标?

4 个答案:

答案 0 :(得分:7)

我发现避免焦点更改的最优雅的方法是重新实现从QWidget派生的类bool focusNextPrevChild(bool next)并简单地返回FALSE。如果您想允许,请返回TRUE

与其他键一样,您现在也可以使用Qt::Key_Tab

中的键keyPressEvent(QKeyEvent* event)

答案 1 :(得分:2)

重新实现virtual bool QApplication::notify(QObject * receiver, QEvent * e)并粘贴我的问题中的代码。

答案 2 :(得分:2)

您可以使用QWidget的setFocusPolicy( Qt::NoFocus)属性来实现。您可以在窗口小部件上设置不需要标签焦点的焦点策略。我认为事件处理程序没有调用的原因,因为Tab是由Qt框架内部管理的。请参阅QWidget::setTabOrder API,这是静态的。

答案 3 :(得分:-1)

您需要在主窗口上安装事件过滤器才能接收事件。您可以使用installEventFilter方法。 另一种选择是覆盖keyPressEvent方法来处理按键操作。