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#
查看11道真题和解析
