拦截Tab键按下以手动管理焦点切换

10

我希望拦截我的主窗口中的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个回答

13

我发现避免焦点变化最优雅的方法是在继承自QWidget的类中重新实现方法bool focusNextPrevChild(bool next)并简单地返回FALSE。如果您想允许它,请返回TRUE

与其他键一样,您现在可以在keyPressEvent(QKeyEvent* event)中获取键Qt::Key_Tab


4
重新实现 virtual bool QApplication::notify(QObject * receiver, QEvent * e),并将我的问题中的代码粘贴到那里是有效的。

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

1
我不需要完全禁用焦点切换,只想按照我的方式进行。尝试了焦点策略 - 但那还不够。但是我不知道QWidget::setTabOrder,谢谢。 - Violet Giraffe

-1

为了接收事件,您需要在主窗口上安装事件过滤器。您可以使用installEventFilter方法来实现。 另一种选择是重写keyPressEvent方法以处理按键事件。


keyPressEvent 对于 Tab 键也没有被调用。eventFilter 也是一样。 - Violet Giraffe
你能添加一下代码,展示你是如何安装事件过滤器/重写keyPressEvent方法的吗? - Robert
针对keyPressEvent方式...被覆盖的方法的签名是否完全是"void CMainWindow::keyPressEvent(QKeyEvent* event)"? - Robert
当然。正如我所说,对于其他“普通”键,两种方法都会被调用。如果我在方法的签名中犯了错误,它们怎么可能被调用呢?你只需要花费不到5分钟的时间创建一个测试应用程序并确认Tab键无法使用即可。 - Violet Giraffe
找到了解决方案,如果感兴趣,请查看我的答案。 - Violet Giraffe
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接