【问题标题】:Intercepting Tab key press to manage focus switching manually拦截 Tab 按键以手动管理焦点切换
【发布时间】: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。如何实现我想要的?

【问题讨论】:

    标签: qt event-handling qt4 qt5 keyevent


    【解决方案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 类的构造函数中?
        猜你喜欢
        • 1970-01-01
        • 2011-04-14
        • 1970-01-01
        • 2018-06-13
        • 1970-01-01
        • 2016-03-06
        • 1970-01-01
        • 2012-05-15
        • 1970-01-01
        相关资源
        最近更新 更多