9

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

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

4

4 回答 4

13

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

就像你现在得到的其他钥匙Qt::Key_Tab一样keyPressEvent(QKeyEvent* event)

于 2014-01-25T14:15:26.003 回答
3

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

于 2013-08-13T16:52:38.920 回答
3

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

于 2013-08-10T12:42:55.303 回答
-1

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

于 2013-08-10T11:21:04.660 回答