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));
}

完!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/472274.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序navigateTo:fail webview count limit exceed

theme: nico 你们好&#xff0c;我是金金金。 场景 uniapp编写微信小程序&#xff0c;使用uni.navigateTo跳转的过程中报错如下&#xff1a; 报错意思也非常明显了&#xff1a;errMsg":"navigateTo:fail webview 数量超出限制 排查 排查之前我先贴一下代码 代码非…

HarmonyOS ArkTs 解决流式传输编码问题

工作日志 日期&#xff1a;2024-11-15 标题&#xff1a;HarmonyOS ArkTs 解决流式传输编码问题 问题描述 问题&#xff1a;在处理流式数据的 HTTP 请求时&#xff0c;服务器返回的数据存在编码问题&#xff0c;导致数据无法正确地解码为字符串。部分数据在解码后出现了乱码…

Android Settings 单元测试 | 如何运行单元测试?

背景 在Android Settings 单元测试 | Telephony Network 模块 APN 案例中粗略介绍了单元测试逻辑内容&#xff0c;但是在独立APK里面如何将单元测试跑起来还是有疑问&#xff0c;因为APP不能直接install&#xff0c;无法借助Android Studio直接Run&#xff0c;在安装的一步会报…

flutter字体大小切换案例 小字体,标准字体,大字体,超大字体案例

flutter字体大小切换案例 小字体&#xff0c;标准字体&#xff0c;大字体&#xff0c;超大字体案例 Android iOS设备带有选择记录 我的flutter项目版本 environment: sdk: ‘>3.4.4 <4.0.0’ 图片案例 pubspec.yaml 添加依赖 # 屏幕尺寸适配 https://github.com/OpenF…

编译原理(手绘)

大家好&#xff0c;今天给大家分享一下我自己对c语言编译链接的一点见解&#xff08;本人是学生&#xff0c;有记笔记的习惯&#xff09;&#xff0c;那么今天就给大家分享我的笔记。 以上只是我本人的一些见解&#xff0c;并非绝对&#xff0c;欢迎大家一起交流。 那么今天分…

跳房子(弱化版)

题目描述 跳房子&#xff0c;也叫跳飞机&#xff0c;是一种世界性的儿童游戏&#xff0c;也是中国民间传统的体育游戏之一。 跳房子的游戏规则如下&#xff1a; 在地面上确定一个起点&#xff0c;然后在起点右侧画 n 个格子&#xff0c;这些格子都在同一条直线上。每个格子内…

初识Linux · 共享内存

目录 理解共享内存 Shared memmory code 理解共享内存 前文介绍的管道方式的通信&#xff0c;本文介绍的是进程通信的另外一种方式&#xff0c;即共享内存。但是这种通信方式的特点是只能本地通信&#xff0c;并且不像管道那样有保护机制&#xff0c;这里是没有的。 我们通…

机器学习day5-随机森林和线性代数1

十 集成学习方法之随机森林 集成学习的基本思想就是将多个分类器组合&#xff0c;从而实现一个预测效果更好的集成分类器。大致可以分为&#xff1a;Bagging&#xff0c;Boosting 和 Stacking 三大类型。 &#xff08;1&#xff09;每次有放回地从训练集中取出 n 个训练样本&…

Essential Cell Biology--Fifth Edition--Chapter one (6)

1.1.4.4 Internal Membranes Create Intracellular Compartments with Different Functions [细胞膜形成具有不同功能的细胞内隔室] 细胞核、线粒体和叶绿体并不是真核细胞中唯一的膜包围细胞器。细胞质中含有大量的[ a profusion of]其他细胞器&#xff0c;这些细胞器被单层膜…

基于VUE实现语音通话:边录边转发送语言消息、 播放pcm 音频

文章目录 引言I 音频协议音频格式:音频协议:II 实现协议创建ws对象初始化边录边转发送语言消息 setupPCM按下通话按钮时开始讲话,松开后停止讲话播放pcm 音频III 第三库recorderplayer调试引言 需求:电台通讯网(电台远程遥控软件-超短波)该系统通过网络、超短波终端等无线…

政务数据治理专栏开搞!

写在前面 忙忙碌碌干了一年政务数据治理的工作&#xff0c;从法人数据到自然人&#xff0c;从交通到地理信息等等&#xff0c;突发想法开一个专栏讲一讲政务数据遇到的问题&#xff0c;以及治理的成效&#xff0c;或许有朋友爱看。 政务数据&#xff0c;又称之为政务数据资源&a…

CondaError: Run ‘conda init‘ before ‘conda activate‘解决办法

已经执行了conda init&#xff0c;但是还是会报错CondaError: Run ‘conda init’ before ‘conda activate’ 原因&#xff1a;权限不够 解决办法&#xff1a;以管理员身份运行cmd&#xff0c;然后进入要操作的文件夹下&#xff0c;重新执行 conda init 和 conda activate 就可…

【全面系统性介绍】虚拟机VM中CentOS 7 安装和网络配置指南

一、CentOS 7下载源 华为源&#xff1a;https://mirrors.huaweicloud.com/centos/7/isos/x86_64/ 阿里云源&#xff1a;centos-vault-7.9.2009-isos-x86_64安装包下载_开源镜像站-阿里云 百度网盘源&#xff1a;https://pan.baidu.com/s/1MjFPWS2P2pIRMLA2ioDlVg?pwdfudi &…

软考教材重点内容 信息安全工程师 第 4 章 网络安全体系与网络安全模型

4,1 网络安全体系的主要特征: (1)整体性。网络安全体系从全局、长远的角度实现安全保障&#xff0c;网络安全单元按照一定的规则&#xff0c;相互依赖、相互约束、相互作用而形成人机物一体化的网络安全保护方式。 (2)协同性。网络安全体系依赖于多种安全机制&#xff0c;通过各…

让空间计算触手可及,VR手套何以点石成金?

引言 如何让一位母亲与她去世的小女儿“重逢”&#xff1f;韩国MBC电视台《I Met You》节目实现了一个“不可能”心愿。 在空旷的绿幕中&#xff0c;母亲Jang Ji-sung透过VR头显&#xff0c;看到了三年前因白血病去世的女儿Nayeon。当她伸出双手&#xff0c;居然能摸到女儿的…

[Admin] Dashboard Filter for Mix Report Types

Background RevOps team has built a dashboard for sales team to track team members’ performance, but they’re blocked by how to provide a manager view based on sales’ hierarchy. Therefore, they seek for dev team’s help to clear their blocker. From foll…

WPF中如何使用区域导航

1.创建一个Prism框架的项目并设计好数据源 User如下&#xff1a; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace WPF练习17区域导航.Models {public class User{public int UserId { get; …

AR眼镜方案_AR智能眼镜阵列/衍射光波导显示方案

在当今AR智能眼镜的发展中&#xff0c;显示和光学组件成为了技术攻坚的主要领域。由于这些组件的高制造难度和成本&#xff0c;其光学显示模块在整个设备的成本中约占40%。 采用光波导技术的AR眼镜显示方案&#xff0c;核心结构通常由光机、波导和耦合器组成。光机内的微型显示…

一文学会docker中搭建kali

一文学会docker中搭建kali 本文环境&#xff1a;部署好docker的ubuntu系统主机一台 直接pull对应的镜像&#xff1a; docker pull kalilinux/kali-rolling 然后通过端口映射&#xff0c;将本地100端口映射到容器的22端口&#xff0c;就可以ssh了 docker run -it -p 100:22…

git上传文件到远程仓库

git上传项目到远程仓库 1. 生成SSH公钥(ssh-keygen),一直回车即可 2. 将公钥复制下来,粘贴至码云仓库 公钥默认地址: C:\Users\Administrator\.ssh3. 克隆项目到本地(复制SSH地址) 4. 上传文件到刚创建的项目(这里取名为test.py) 5. 上传需要做的几个步骤 (1) git add . 添…