QT QLineEdit失去焦点事件问题与解决
本文介绍如何获得QLineEdit的失去焦点事件和获得焦点的输入框也会触发失去焦点事件的问题!
目录
一、QLineEdit获得失去焦点事件
1.自定义类继承自QLineEdit
2.重写 focusOutEvent
3.使用
二、失去焦点事件问题
1.问题描述
2.问题解决
三、源码分享
lineeditfocus.h
lineeditfocus.cpp
widget.cpp
一、QLineEdit获得失去焦点事件
1.自定义类继承自QLineEdit
class LineEditFocus : public QLineEdit {Q_OBJECT
public:explicit LineEditFocus(QWidget *parent = nullptr) { }~LineEditFocus() override { }
}
2.重写 focusOutEvent
protected:// 焦点离开void focusOutEvent(QFocusEvent *event) override { }// 获得焦点void focusInEvent(QFocusEvent *event) override { }
当获得焦点时,focusInEvent方法会被触发;当失去焦点时,focusOutEvent方法会被触发;
然后就可以在方法内部做一些我们的需求处理,例如可以通过信号与槽通知主程序等;
3.使用
直接使用我们自定义的类,创建LineEditFocus对象即可;
如果使用的是ui布局中的部件,那么可以将部件提升为我们自定义的LineEditFocus即可;
二、失去焦点事件问题
1.问题描述
如果有多个输入框部件,且当前输入框部件失去焦点,且另一个获得焦点的部件不是输入框时,那么是没有问题的!
如果当前输入框失去焦点,且另一个获得焦点的部件也是输入框,那么这样就会出现问题;
会优先触发另一个输入框的失去焦点事件,然后才会触发当前输入框的失去焦点事件,最后再触发另一个输入框的获得焦点事件!!!
案例:
(1).继续在自定义类中添加信号 ;可以根据个人需求传输参数值,例如可以将当前输入框的文本传送;
signals:void signalLoseFocus(int index);
(2).然后在失去焦点方法中,触发此信号
void LineEditFocus::focusOutEvent(QFocusEvent *event)
{static int index = 1;emit signalLoseFocus(index++);QLineEdit::focusOutEvent(event);
}
(3).最后在主窗体中使用即可(ui部件,提升即可)
void Widget::init()
{LineEditFocus *le1 = new LineEditFocus(this);LineEditFocus *le2 = new LineEditFocus(this);LineEditFocus *le3 = new LineEditFocus(this);QList<LineEditFocus *> list;list << le1 << le2 << le3;foreach (LineEditFocus *lef, list) {lef->setFixedSize(350, 50);connect(lef, &LineEditFocus::signalLoseFocus, this, &Widget::onLeaveFocus);}QVBoxLayout *layout = new QVBoxLayout(this);layout->addWidget(le1);layout->addWidget(le2);layout->addWidget(le3);this->setLayout(layout);
}
(4).在槽函数中将接收到的index,通过messagebox提示出来
void Widget::onLeaveFocus(int index)
{QMessageBox::information(this, "提示", QString("输入框焦点离开:%1").arg(index));
}
(5).运行效果

可以看出,确实是有问题的!
2.问题解决
具体是什么原因导致出现这样的问题,我也没搞明白;
但是办法总比困难多,我们转换一下思路去解决他;
(1).增加变量用于标志是否获取到了焦点
private:// 焦点获得标志bool m_focus;
(2).焦点获得,获得焦点时,m_focus赋值true
void LineEditFocus::focusInEvent(QFocusEvent *event)
{m_focus = true; // 标志当前编辑框已经获得焦点QLineEdit::focusInEvent(event);
}
(3).失去焦点,通过m_focus变量辅助配合判断
void LineEditFocus::focusOutEvent(QFocusEvent *event)
{if (m_focus && event->lostFocus()) { // event->lostFocus(): type() == FocusOutm_focus = false; // 焦点失去emit signalLoseFocus(m_index);}QLineEdit::focusOutEvent(event);
}
通过上面的测试可知,当从第一个输入框点击第二个输入框时,优先触发第二个输入框的失去焦点事件,此时,第二个输入框是还没有获得焦点的,即m_focus变量值为false,信号就没法触发;
紧接着第一个输入框的失去焦点事件触发,因为先前已经获得了焦点,即m_focus变量值为true,所以第一个输入框的失去焦点事件可以正常发射信号;
最后才会触发第二个输入框的获得焦点事件。
(3).运行测试

问题完美解决!
三、源码分享
lineeditfocus.h
#ifndef LINEEDIT_FOCUS_H
#define LINEEDIT_FOCUS_H#include <QLineEdit>class LineEditFocus : public QLineEdit {Q_OBJECT
public:explicit LineEditFocus(QWidget *parent = nullptr);~LineEditFocus() override;void SetIndex(int index);int GetIndex() const;signals:void signalLoseFocus(int index);void signalInFocus(int index);protected:// 焦点离开void focusOutEvent(QFocusEvent *event) override;// 获得焦点void focusInEvent(QFocusEvent *event) override;private:// 记录标志int m_index;// 焦点获得标志bool m_focus;
};#endif // LINEEDIT_FOCUS_H
lineeditfocus.cpp
#include "lineeditfocus.h"#include <QFocusEvent>LineEditFocus::LineEditFocus(QWidget *parent) : QLineEdit(parent)
{m_index = 0;m_focus = false;
}LineEditFocus::~LineEditFocus()
{}void LineEditFocus::SetIndex(int index)
{m_index = index;
}void LineEditFocus::focusOutEvent(QFocusEvent *event)
{if (m_focus && event->lostFocus()) { // event->lostFocus() --> return type() == FocusOut;m_focus = false; // 焦点失去emit signalLoseFocus(m_index);}QLineEdit::focusOutEvent(event);
}void LineEditFocus::focusInEvent(QFocusEvent *event)
{m_focus = true; // 焦点获得QLineEdit::focusInEvent(event);
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"#include "lineeditfocus.h"#include <QMessageBox>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);init();
}Widget::~Widget()
{delete ui;
}void Widget::init()
{LineEditFocus *le1 = new LineEditFocus(this);
// le1->setFixedSize(350, 50);
// le1->SetIndex(1);LineEditFocus *le2 = new LineEditFocus(this);
// le2->setFixedSize(350, 50);
// le2->SetIndex(2);LineEditFocus *le3 = new LineEditFocus(this);
// le3->setFixedSize(350, 50);
// le3->SetIndex(3);QList<LineEditFocus *> list;list << le1 << le2 << le3;int index = 1;foreach (LineEditFocus *lef, list) {lef->setFixedSize(350, 50);lef->SetIndex(index++);connect(lef, &LineEditFocus::signalLoseFocus, this, &Widget::onLeaveFocus);}QVBoxLayout *layout = new QVBoxLayout(this);layout->addWidget(le1);layout->addWidget(le2);layout->addWidget(le3);this->setLayout(layout);}void Widget::onLeaveFocus(int index)
{QMessageBox::information(this, "提示", QString("输入框焦点离开:%1").arg(index));
}
完!
相关文章:
QT QLineEdit失去焦点事件问题与解决
本文介绍如何获得QLineEdit的失去焦点事件和获得焦点的输入框也会触发失去焦点事件的问题! 目录 一、QLineEdit获得失去焦点事件 1.自定义类继承自QLineEdit 2.重写 focusOutEvent 3.使用 二、失去焦点事件问题 1.问题描述 2.问题解决 三、源码分享 lineed…...
Remora
Remora Remora 模型能够独立于碱基识别过程预测甲基化/修饰碱基的状态。Remora 仓库专注于准备修饰碱基训练数据和训练修饰碱基模型。此外,还提供了一些用于运行 Remora 模型和调查原始信号的功能。对于生产环境中的修饰碱基识别,建议使用 Dorado <https://github.com/na…...
MySQL中将一个字符串字段按层级树状展开
水善利万物而不争,处众人之所恶,故几于道💦 文章目录 需求1.分析2.实现3.思路刨析表结构和数据 需求 数据库中有个字段如下 如何将其转换为如下形式: 1.分析 1.他的层级个数是不确定的,也就是说有的有2层有的有5…...
vue面试题8|[2024-11-14]
问题1:什么是渐进式框架? vue.js router vuex element ...插件 vue.js 渐0 router 渐1 vuex 渐2 vue.js只是一个核心库,比如我再添加一个router或者vuex,不断让项目壮大,就是渐进式框…...
ARM(安谋) China处理器
0 Preface/Foreword 0.1 参考博客 Cortex-M23/M33与STAR-MC1星辰处理器 ARM China,2018年4月established,独立运行。 1 处理器类型 1.1 周易AIPU 1.2 STAR-MC1(星辰处理器) STAT-MC1,主要为满足AIOT应用性能、功…...
基于python Django的boss直聘数据采集与分析预测系统,爬虫可以在线采集,实时动态显示爬取数据,预测基于技能匹配的预测模型
本系统是基于Python Django框架构建的“Boss直聘”数据采集与分析预测系统,旨在通过技能匹配的方式对招聘信息进行分析与预测,帮助求职者根据自身技能找到最合适的职位,同时为招聘方提供更精准的候选人推荐。系统的核心预测模型基于职位需求技…...
MATLAB实现GARCH(广义自回归条件异方差)模型计算VaR(Value at Risk)
MATLAB实现GARCH(广义自回归条件异方差)模型计算VaR(Value at Risk) 1.计算模型介绍 使用GARCH(广义自回归条件异方差)模型计算VaR(风险价值)时,方差法是一个常用的方法。GARCH模型能够捕捉到金融时间序列数据中的波…...
深入Linux基础:文件系统与进程管理详解
在Linux运维领域,文件系统和进程管理是两个至关重要的基础知识。理解它们的原理和实际操作,不仅有助于我们更高效地管理服务器,还能快速定位问题、优化性能。本文将带你全面了解这两大模块,并配以示例代码进行讲解,帮助…...
缓存及其不一致
在实际开发过程中,一般都会遇到缓存,像本地缓存(直接在程序里搞个map也可以,但是可能会随着数据的增长出现OOM,建议使用正经的本地缓存框架,因为自己实现淘汰策略啥的挺费劲的)、分布式缓存&…...
Leetcode 有效的数独
这段代码解决的是 验证一个数独是否有效 的问题,其算法思想是基于 规则校验和状态记录。具体思想如下: 算法思想 核心目标: 检查每个数字在 同一行、同一列 和 同一个 3x3 子格 中是否重复。 状态记录: 使用 3 个布尔二维数组分别…...
《Java核心技术 卷I》用户界面中首选项API
首选项API 在桌面程序中,通常都会存储用户首选项,如用户最后处理的文件、窗口的最后位置等。 利用Properties类可以很容易的加载和保存程序的配置信息,但有以下缺点: 有些操作系统没有主目录概念,很难为匹配文件找到…...
Android 中的 Zygote 和 Copy-on-Write 机制详解
在 Android 系统中,Zygote 是一个关键的进程,几乎所有的应用进程都是通过它 fork(派生)出来的。通过 Zygote 启动新进程的方式带来了显著的性能优势,这得益于 fork 操作和 Linux 中的 Copy-on-Write(COW&am…...
【人工智能】从零开始用Python实现逻辑回归模型:深入理解逻辑回归的原理与应用
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 逻辑回归是一种经典的统计学习方法,用于分类问题尤其是二分类问题。它通过学习数据的特征和目标标签之间的…...
推荐一款功能强大的光学识别OCR软件:Readiris Dyslexic
Readiris Dyslexic是一款功能强大的光学识别OCR软件,可以扫描任何纸质文档并将其转换为完全可编辑的数字文件(Word,Excel,PDF),然后用你喜欢的编辑器进行编辑。该软件提供了一种轻松创建,修改和签名PDF的完整解决方法&…...
Python爬虫----python爬虫基础
一、python爬虫基础-爬虫简介 1、现实生活中实际爬虫有哪些? 2、什么是网络爬虫? 3、什么是通用爬虫和聚焦爬虫? 4、为什么要用python写爬虫程序 5、环境和工具 二、python爬虫基础-http协议和chrome抓包工具 1、什么是http和https协议…...
css-50 Projects in 50 Days(3)
html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>旋转页面</title><link rel"sty…...
另外一种缓冲式图片组件的用法
文章目录 1. 概念介绍2. 使用方法2.1 基本用法2.2 缓冲原理3. 示例代码4. 内容总结我们在上一章回中介绍了"FadeInImage组件"相关的内容,本章回中将介绍CachedNetworkImage组件.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中介绍的CachedNetwo…...
字节青训-小C的外卖超时判断、小C的排列询问
目录 一、小C的外卖超时判断 问题描述 测试样例 解题思路: 问题理解 数据结构选择 算法步骤 最终代码: 运行结果: 二、小C的排列询问 问题描述 测试样例 最终代码: 运行结果: 编辑 一、小C的外卖超时判断…...
PHP 伪静态详解及实现方法
概述 在现代 Web 开发中,URL 的设计对用户体验和搜索引擎优化(SEO)至关重要。动态 URL 虽然功能强大,但往往显得冗长且不友好。伪静态(URL 重写)技术通过将动态 URL 转换为静态样式,不仅提高了…...
Spring Boot 简单预览PDF例子
目录 前言 一、引入依赖 二、使用步骤 1.创建 Controller 处理 PDF 生成和预览 2.创建预览页面 总结 前言 使用 Spring Boot 创建一个生成 PDF 并进行预览的项目,你可以按以下步骤进行。我们将使用 Spring Boot、Thymeleaf、iText 等技术来完成这个任务。 一、引入…...
专科ENSP毕设实战:基于eNSP的校园网高可用架构设计与配置避坑指南
最近在帮几个专科的学弟学妹看他们的eNSP毕业设计,发现大家普遍卡在几个地方:拓扑画得挺漂亮,但一配置就各种不通;协议背得滚瓜烂熟,但实际命令敲下去就报错;最后答辩演示时,一拔线整个网络就瘫…...
摆脱论文困扰!!2026最新AI论文写作软件测评与推荐
2026年真正好用的AI论文写作软件,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 …...
nli-distilroberta-base保姆级教学:从镜像拉取→端口映射→API测试全流程
nli-distilroberta-base保姆级教学:从镜像拉取→端口映射→API测试全流程 1. 项目概述 nli-distilroberta-base是一个基于DistilRoBERTa模型的自然语言推理(NLI)Web服务,专门用于判断两个句子之间的逻辑关系。这个轻量级模型能够快速准确地分析句子对&…...
Qwen3智能字幕对齐系统在CSDN技术视频生态中的应用实践
Qwen3智能字幕对齐系统在CSDN技术视频生态中的应用实践 1. 引言 做技术视频的博主和讲师们,应该都遇到过这样的烦恼吧。辛辛苦苦录完一个小时的编程教程,光是剪辑和加字幕就得再花上大半天。尤其是字幕,要么得自己一句一句听写,…...
ai辅助开发:基于快马平台为trea国际版添加汇率数据智能分析功能
最近在开发Trea国际版应用时,遇到了一个需求:如何让用户更直观地理解汇率波动趋势,并通过自然语言交互获得分析结果。这个功能看似复杂,但借助InsCode(快马)平台的AI辅助开发能力,整个过程变得异常简单。下面分享我的实…...
当几何优化遇上时空建模:玩转TTAO-SE-CNN-LSTM黑科技
基于三角形拓扑结构优化算法优化卷积神经网络-长短时记忆网络结合SE注意力机制的数据分类预测(TTAO-SE-CNN-LSTM) 三角形拓扑结构优化算法TTAO优化长短时记忆网络隐藏层神经元数目、初始学习率和L2正则化参数 基于MATLAB环境 替换自己的数据即可 首先通过卷积神经网络提取数据…...
YOLO X Layout实战:从扫描PDF中自动提取标题与表格的Python实现
办公室最头疼的工作之一就是处理扫描版PDF:不管是合同、审计报告、论文还是发票,扫描版的PDF都是图片,没法复制文本,要提取里面的标题、目录、表格,只能手动敲,几十页的PDF要花几个小时,特别浪费…...
OpenClaw文件管理术:GLM-4.7-Flash智能归类200+文档
OpenClaw文件管理术:GLM-4.7-Flash智能归类200文档 1. 为什么需要智能文件管理助手 作为一个长期与各种技术文档打交道的开发者,我的电脑桌面常年处于"灾难现场"状态。上周整理项目资料时,发现同一个技术方案的三个版本散落在下载…...
Endnote参考文献序号对齐的终极解决方案
1. 为什么参考文献序号会对不齐? 很多科研工作者在使用Endnote插入参考文献时都遇到过这样的尴尬:当文献序号从个位数增长到十位数时(比如从[9]变成[10]),原本整齐排列的参考文献列表突然变得参差不齐。这个问题看似简…...
Python内存占用直降63%!20年CTO首次公开智能体内存策略的3级缓存配置模板
第一章:Python智能体内存管理策略配置步骤详解 Python智能体(如基于LangChain、LlamaIndex构建的Agent)在长时间运行或高并发场景下易遭遇内存泄漏、对象堆积与GC延迟问题。合理配置内存管理策略,是保障其稳定性和响应效率的关键环…...
