Qt中关于QLineEdit控件的editingFinished信号执行两次的处理方式

Qt中关于QLineEdit控件的editingFinished信号执行两次的处理方式

问题描述

有个QLineEdit控件,需要在编辑结束后执行某些功能,常规的做法是直接绑定editingFinished信号,代码如下:

cpp 复制代码
Dialog::Dialog(int width, int height, QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::AddMultiplePointsDlg)
{
    ui->setupUi(this);
    connect(ui->lineEdit, &QLineEdit::editingFinished, this, &Dialog::onLineEditEditingFinished)
}

void Dialog::onLineEditEditingFinished()
{
}

我们希望的结果是,当lineedit失去焦点或者敲击回车时,执行这个槽函数。但实际情况是,失去焦点只触发一次信号,程序正确执行。但是敲击回车会触发两次信号,也就会使槽函数执行两次。

问题原因分析

editingFinished信号在lineedit失去焦点和敲击回车的时候都会执行,而在敲击回车会使控件失去焦点。也就意味着,当敲击回车时,会触发一次信号,信号响应结束后,控件失去焦点事件又触发了,从而会再一次执行槽函数。

问题解决方案

改用returnPressed信号

该信号只有敲回车的时候才会触发,失去焦点无法触发该信号,所以敲回车只会触发一次。但是这个信号也有问题,就是失去焦点时无法触发,不管是鼠标点击其他控件还是敲回车,都不会触发,想要执行编辑结束事件,就只能敲回车了,失去焦点无法触发。

在槽函数内部判断是否继续执行

从逻辑上说,我们想在编辑结束后执行某个操作,一定是改变了lineedit的内容,通常情况下不会想要在内容不变的情况下执行操作。所以可以在槽函数内判断一下lineedig的内容是否发生改变,如果内容变了就继续执行槽函数的功能,内容没变就直接return了。而敲回车造成的失去焦点事件,中间的间隔非常短,基本不可能在这个间隔时间内改变lineedit的内容,所以虽然槽函数响应了两次,但真正有效的操作却只执行了一次。

相关推荐
djarmy1 小时前
MAIN.c(1): warning C318: can’t open file ‘STC8G.H’ 报错 解决 分析
c语言·开发语言·mongodb
HEJOO91 小时前
深入理解 Java volatile 关键字:原理、用法与常见误区
java·开发语言·spring
曹牧1 小时前
Java:no content to map due to end of input
java·开发语言
梦梦代码精1 小时前
《回收租赁系统技术选型避坑指南:业务闭环与二开自由度详解》
开发语言·低代码·docker·开源·代码规范
隔窗听雨眠2 小时前
记一次SQL Server数据库性能分析:从CPU100%到单配置修复的完整诊断
开发语言·数据库·php
David猪大卫2 小时前
【C++修炼】智能指针使用及原理
开发语言·c++·经验分享·笔记·学习·考研·面试
charlie1145141912 小时前
现代Qt开发之图像处理进阶:像素操作与格式转换
开发语言·图像处理·qt
李永奉2 小时前
中科蓝讯SDK开发-BT893x 面条耳机连接vivo手机后连接APP端,最后手机端设置页面手动断开蓝牙连接,此时耳机端假断开
c语言·开发语言·嵌入式硬件·物联网·智能手机·电脑
秦老师Q3 小时前
php零基础入门到实战,从语法到框架,一篇搞定
开发语言·php
驭渊的小故事3 小时前
多线程02
java·开发语言·jvm