QT中LineEdit焦点丢失问题

功能这样:LineEdit输入字符,回车后进行搜索。

connect(ui->lineEditSearch, &QLineEdit::returnPressed, this, &MyDialog::onLineEditEnter);

发现我的lineEditSearch的焦点策略是Qt::StrongFocus ,回车后别人按钮被触发了(相当于点击了)。但是我没给按钮设置什么东西。

然后当我设置焦点策略为Qt::ClickFocus,就不会出现这个情况。

解决一:将按钮设置属性(按钮少可以这样),不能根本解决

ui->btnOK->setAutoDefault(false);

解决二:设置焦点策略为Qt::ClickFocus 原理不太清楚,反正是行了

gpt给的理由

Qt::StrongFocus:

当 lineEditSearch 具有 Qt::StrongFocus 焦点策略时,它将能够通过键盘(包括回车键)接收焦点。
如果 lineEditSearch 接收了焦点并且回车键被按下,它的 returnPressed 信号会触发。
如果 lineEditSearch 在焦点之后没有处理回车键,该事件可能会继续传递给其父级或其他具有焦点的窗口部件。
Qt::ClickFocus:

当 lineEditSearch 具有 Qt::ClickFocus 焦点策略时,它只能通过鼠标点击或空格键激活。
回车键可能不会被 lineEditSearch 捕获,因此事件不会触发 returnPressed 信号。
如果回车键没有被 lineEditSearch 处理,它可能被传递给其父级或其他具有焦点的窗口部件,可能包括其他按钮。

解决三:用事件过滤器来实现这个功能 思想大致如下

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    ui->lineEdit_1->installEventFilter(this);  // lineEdit_1注册事件
}

Widget::~Widget()
{
    delete ui;
}

bool Widget::eventFilter(QObject *obj, QEvent *event)
{
    if (obj == ui->lineEdit_1 && event->type() == QEvent::KeyPress)
    {
        // 获取当前的键盘事件
        QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);

        if (keyEvent->key() == Qt::Key_Return || keyEvent->key() == Qt::Key_Enter)
        {
            // 处理回车键事件
            qDebug() << "lineEdit_1 enter";

            ui->lineEdit_2->setFocus();  // 让lineEdit_2获取焦点
            return true;  // 阻止事件传递给控件
        }
    }

    return QObject::eventFilter(obj, event);
}

#qt#
全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务