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 等技术来完成这个任务。 一、引入…...

【魔珐有言-注册/登录安全分析报告-无验证方式导致安全隐患】
前言 由于网站注册入口容易被机器执行自动化程序攻击,存在如下风险: 暴力破解密码,造成用户信息泄露,不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 ,造成用户无法登陆、注册,大量收到垃圾短信的…...

LabVIEW 使用 Snippet
在 LabVIEW 中,Snippet(代码片段) 是一个非常有用的功能,它允许你将 一小段可重用的代码 保存为一个 图形化的代码片段,并能够在不同的 VI 中通过拖放来使用。 什么是 Snippet? Snippet 就是 LabVIEW 中的…...

单片机_day3_GPIO
目录 1. 灯如何才能亮 1.1原理图 1.2 二极管 1.3 换了一个灯和原理图 编辑 1.4 三极管 1.4.1 NPN型三极管 1.4.2 PNP型三极管 2. 基本概念 3. 输入 3.1 浮空输入 3.2 上拉输入 3.3 下拉输入 3.4 模拟输入 4. 输出 4.1 推挽输出 4.2 开漏输出 如何让开漏输出…...

Python小游戏24——小恐龙躲避游戏
首先,你需要安装Pygame库。如果你还没有安装,可以通过以下命令安装: 【bash】 pip install pygame 【python】代码 import pygame import random # 初始化Pygame pygame.init() # 设置屏幕尺寸 screen_width 800 screen_height 600 screen …...

Python 的多态笔记
Python的多态实际是通过instance 实现的 class Person:def __init__(self, name,age):self.name nameself.age agedef feed_pet(self,pet):#isinastance(obj,类)-->判断obj,是不是这个类的对象,或者判断obj是不是该类的子类的对象if isinstance(pet, Pet):sel…...

go module使用
go module介绍 go module是go官⽅⾃带的go依赖管理库,在1.13版本正式推荐使⽤ go module可以将某个项⽬(⽂件夹)下的所有依赖整理成⼀个 go.mod ⽂件,⾥⾯写⼊了依赖的版本等 使⽤ go module之后我们可不⽤将代码放置在src下了 使⽤ go module 管理依赖后会在项⽬根⽬录下⽣成…...

c ++零基础可视化——数组
c 零基础可视化 数组 一些知识: 关于给数组赋值,一个函数为memset,其在cplusplus.com中的描述如下: void * memset ( void * ptr, int value, size_t num );Sets the first num bytes of the block of memory pointed by ptr to…...

CVE-2024-2961漏洞的简单学习
简单介绍 PHP利用glibc iconv()中的一个缓冲区溢出漏洞,实现将文件读取提升为任意命令执行漏洞 在php读取文件的时候可以使用 php://filter伪协议利用 iconv 函数, 从而可以利用该漏洞进行 RCE 漏洞的利用场景 PHP的所有标准文件读取操作都受到了影响࿱…...

计算机组成原理笔记----基础篇
计算机系统硬件软件 软件 ├── 系统软件 │ ├── 操作系统 │ └── 工具软件 └── 应用软件├── 办公软件├── 媒体软件└── 浏览器软件硬件 ├── 计算机硬件 │ ├── 中央处理器(CPU) │ ├── 存储设备 │ │ ├── …...

TheadLocal出现的内存泄漏具体泄漏的是什么?弱引用在里面有什么作用?什么情景什么问题?
首先ThreadLocal是什么就不介绍了!这篇是讲讲里面的东西。 再简单说一下强引用和弱引用,举个例子,我们平常new出来的对象就是强引用的,在栈中有强引用,所以在gc的时候,堆中的实例对象不会被清除掉。 弱引…...