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

Posted

技术标签:

【中文标题】拦截 Tab 按键以手动管理焦点切换【英文标题】:Intercepting Tab key press to manage focus switching manually 【发布时间】:2013-08-10 08:20:31 【问题描述】:

我想在我的主窗口中拦截 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。如何实现我想要的?

【问题讨论】:

【参考方案1】:

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

与您现在获得的其他密钥一样,keyPressEvent(QKeyEvent* event) 中的密钥 Qt::Key_Tab

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

我不需要完全禁用焦点开关,只是想按照我的方式去做。尝试了焦点政策——这还不够。但我不知道QWidget::setTabOrder,谢谢。【参考方案4】:

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

【讨论】:

keyPressEvent 也不会被 Tab 键调用。 eventFilter 也没有。 你能在你如何安装事件过滤器/覆盖keyPressEvent方法的地方添加代码吗? 完全一样,只是方法名不同。并且我检查了当我按下 Tab 以外的键时是否调用了我的覆盖方法。 对于keyPressEvent方式...被覆盖方法的签名就是“void CMainWindow::keyPressEvent(QKeyEvent* event)”? 对于事件方式...您是否将 installEventFilter(this) 行添加到 CMainWindow 类的构造函数中?

以上是关于拦截 Tab 按键以手动管理焦点切换的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX:如何管理边框中的焦点遍历

ag-grid 实现单元格内多个输入框键盘切换焦点

按下键盘的tab键,输入框的焦点就切换到下一个,这个效果怎么实现

如何禁止tab键在对话框内的编辑控件和按钮之间切换焦点?

拦截电源关机按键自定义功能

在Android中 怎么开发像windows软件中的tab键实现焦点在按钮上切换 用了requsetFocus()好像没有用啊!