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#