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 等技术来完成这个任务。 一、引入…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...

JDK 17 序列化是怎么回事
如何序列化?其实很简单,就是根据每个类型,用工厂类调用。逐个完成。 没什么漂亮的代码,只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...