如何在 key_up、key_down 的 KeyPressEvent 中为按钮设置焦点。 QT

How to set focus for button in KeyPressEvent for key_up, key_down. QT

我有一个带有名为 "Up""Down" 等按钮的表单

我需要处理键盘按钮(arrow_uparrow_down 等)。同时我想为相关按钮设置焦点。

例如: 如果我按下键盘上的 arrow_down 按钮,那么 "Down" 按钮将成为我的表单的焦点。

我的变体如何做到这一点:

bool ClientWindow::eventFilter(QObject *obj, QEvent *e)
{
    if (event->type() == QEvent::KeyPress) {
        QKeyEvent *event= dynamic_cast<QKeyEvent*>(e);
        switch(event->key()) {
            case Qt::Key_Up: ui->up->setFocus(); ;break;
            case Qt::Key_Down: ui->down->setFocus(); break;
            case Qt::Key_Left: ui->left->setFocus(); break;
            case Qt::Key_Right: ui->right->setFocus(); break;
        }
    }
    return QObject::eventFilter(obj, event);
}

但是,没有设置焦点,并且

1) 如果我从 eventFilter return true 则不会设置焦点。

2) 如果我 return QObject::eventFilter(obj, event) 那么焦点将转移到下一个对象。

如何为相关按钮设置焦点?

由于您正在尝试更改 Qt 的标准功能(箭头键移动焦点就像 TAB 键一样),您可能想尝试一个极端的解决方案。

重点是:您的箭头键按下事件是否被过滤了?我的猜测是没有。 above(或 before)小部件正在使用它们并保持标准行为不变(焦点根据标签索引从一个按钮移动到另一个按钮像往常一样)。

我会尝试将您的过滤器安装到 QApplication 对象上,在小部件构造函数中是这样的:

qApp->installEventFilter(this);

过滤器应如下所示:

bool Widget::eventFilter(QObject *obj, QEvent *e)
{
    if (e->type() == QEvent::KeyPress)
    {
        if(qApp->activeWindow() == this)
        {
            QKeyEvent *event= dynamic_cast<QKeyEvent*>(e);

            switch(event->key()) {
            case Qt::Key_Up: ui->up->setFocus(); break;
            case Qt::Key_Down: ui->down->setFocus(); break;
            case Qt::Key_Left: ui->left->setFocus(); break;
            case Qt::Key_Right: ui->right->setFocus(); break;

            default:
                return qApp->eventFilter(obj, e);

            }
            return true;
        }
    }
    return qApp->eventFilter(obj, e);
}

请注意这一行:

if(qApp->activeWindow() == this)

这应该阻止应用过滤器中的规则每当按下箭头键时(即当小部件不是最上面的小部件时)。如果您的应用程序没有除此之外的其他小部件,您可以忽略它。

最后的建议:尽量不要改变标准的 UI 行为。用户确实希望事情像往常一样工作,而对开发人员来说看起来绝对 的解决方案有时(经常)根本没有带来任何改进,只会让用户感到困惑。