(二十三)槽函数的书写规则导致槽函数触发2次的问题

news2024/11/24 9:54:59

在创建QT的信号和槽时,经常无意间保留着QT书写槽函数的习惯,或者在QT设计界面直接右键【转到槽】去创建槽函数,但是后期需要用到disconnect时,又重新写了一遍connect函数,那么你会发现实际槽函数执行了2遍。

首先来看下这种QT的槽函数书写习惯:void on__();
例如,我创建了一个lineEdit,并且给这个控件的oeject name命名为lineEdit,那么这个lineEdit的textChanged信号对应的默认槽函数就是:
void on_lineEdit_textChanged(QString text);
那么这种命名方式有什么问题呢?首先看下这个代码:

void MainWindow::on_lineEdit_textChanged(QString text)
{
    count ++;//一个自增的int值
    qDebug() << count;
    ui->label->setText(text);//一个label来显示text变化
}

很明显这个命名规则是符合QT命名规则的,那么我们此时不去创建connect,仅仅去emit一个signal会发生什么呢?

emit ui->lineEdit->textChanged("test");

在这里插入图片描述
可以明显看到label的test发生了变化。

我们再做一个实验,新增一个connect去试下槽函数执行了几次:

connect(ui->lineEdit, &QLineEdit::textChanged, this, &MainWindow::on_lineEdit_textChanged);

在这里插入图片描述
可以看到实际槽函数执行了2遍,这就不符合我们的实际需求了。

我们来看下为什么呢?点击进去ui_文件中,你可以看到这一句函数:

QMetaObject::connectSlotsByName(MainWindow);

QT对此做了解释:
Searches recursively for all child objects of the given object, and connects matching signals from them to slots of object that follow the following form:
void on_();
Let’s assume our object has a child object of type QPushButton with the object name button1. The slot to catch the button’s clicked() signal would be:
void on_button1_clicked();
递归搜索给定对象的所有子对象,并将来自这些子对象的匹配信号连接到遵循以下形式的对象槽
可以看到QT会去搜索所有的对象,并且把这些子对象的信号连接到符合void on
_()形式的槽函数上,并且这种连接是自动的!!!!
难怪我们自己connect以后,槽函数会执行2遍,因为QT帮助我们自动connect了一次。

为了避免这种方式的错误,那么我们最好在写槽函数的时候,不要遵守QT的槽函数明明方式,最简单的就是不要加on_;或者如果想用QT自带的信号槽,那就不要多于的去connect。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

要在Ubuntu中查找进程的PID,可以使用pgrep或pidof命令。

一 查找进程 1.pgrep命令 pgrep命令可以根据进程名或其他属性查找进程的PID。例如&#xff0c;要查找名为"firefox"的进程的PID&#xff0c;可以在终端中输入以下命令&#xff1a; pgrep firefox如果有多个名为"firefox"的进程&#xff0c;pgrep命令将返…

互联网一个赛道只剩下几家,真要爆品

互联网一个赛道剩下几家&#xff0c;真要爆品 2017年的书&#xff0c;案例基本上是马后炮总结 趣讲大白话&#xff1a;说起来容易&#xff0c;做起来难 【趣讲信息科技136期】 **************************** 书中讲的范冰冰翻车了 书中不看好的线下渠道&#xff0c;现在成香饽饽…

面试篇-Java并发之CAS:掌握原理、优缺点和应用场景分析,避免竞态问题

1、CAS介绍及原理 多线程中的CAS&#xff08;Compare-and-Swap&#xff09;操作是一种常见的并发控制方法&#xff0c;用于实现原子性更新共享变量的值。其核心思想是通过比较内存地址上的值和期望值是否相等来确定是否可以进行更新操作&#xff0c;从而避免多线程条件下的竞态…

HMI实时显示网络摄像机监控画面——以海康威视网络摄像机为例

随着IOT技术的快速发展&#xff0c;网络摄像机快速应用于工业领域&#xff0c;结合其他智能设备建立一个智能系统&#xff0c;提高用户与机器设备之间的交互体验&#xff0c;帮助企业优化人员配置。 作为重要的可视化设备&#xff0c;HMI不仅可以采集现场设备数据&#xff0c;…

uniapp系列-使用uniapp携带收件人信息调用手机邮件应用发邮件的2种方案

背景描述 我们使用uniapp打包之后&#xff0c;某些情况下&#xff0c;需要使用uniapp打开手机其他应用去发邮件&#xff0c;携带对方email 信息以及主题信息等&#xff0c;那我们应该怎么处理呢&#xff1f; 方案一&#xff1a;使用uniapp标签-uni-link&#xff0c;注意这种方…

BGP实验(一)

实验要求&#xff1a; 1、As1存在两个环回&#xff0c;一个地址为192.168.1.0/24&#xff0c;该地址不能在任何协议中宣告&#xff0c; As3存在两个环回,.一个地址为192.168.2.0/24&#xff0c;该地址不能在任何协议中宣告&#xff0c; As1还有一个环回地址为10.1.1.0/24&…

研读Rust圣经解析——Rust learn-8(match,if-let简洁控制流,包管理)

研读Rust圣经解析——Rust learn-8&#xff08;match,if-let简洁控制流&#xff0c;包管理&#xff09;matchother和占位符_区别easy matchenum matchno valuematch innerOption matchmore better wayif-let整洁控制包管理模块(mod)拆分声明modpub公开use展开引用拆解模块结构m…

docker cmd

sudo docker run --gpus all --name uavrl1 themvs/uav_swarm_reinforcement_learning sudo docker p s-a 86850d5a9dc3 sudo docker run --gpus all --name uavrl12 uavrl:v1.2 ---------- 共享屏幕输入类似指令&#xff0c;实测可行 sudo docker run -it --nethost --ipc…

Leetcode每日一题——“轮转数组”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容是轮转数组&#xff0c;下面&#xff0c;让我们进入轮转数组的世界吧 小雅兰之前其实就已经写过了字符串旋转的问题了&#xff1a; C语言刷题&#xff08;7&#xff09;&#xff08;字符串旋转问题&#xff09…

优化 Kafka 的生产者和消费者

背景 如今&#xff0c;分布式架构已经成为事实上的架构模范&#xff0c;这使得通过 REST API 和 消息中间件来降低微服务之间的耦合变得必然。就消息中间件而言&#xff0c;Apache Kafka 已经普遍存在于如今的分布式系统中。Apache Kafka 是一个强大的、分布式的、备份的消息服…

HBase高手之路5—HBase的JavaAPI编程

文章目录Hbase高手之路5—Hbase的JavaAPI编程一、需求与数据集二、准备工作1.下载安装Java2.下载安装Idea3.下载安装maven4.Maven配置国内的镜像库5.Idea使用自定义的maven配置6.创建一个maven测试项目7.创建所需要的包8.创建类文件&#xff0c;输入代码9.运行项目三、创建HBas…

【2023 年第十三届 MathorCup 高校数学建模挑战赛】A 题 量子计算机在信用评分卡组合优化中的应用 详细建模过程解析及代码实现

更新信息&#xff1a;2023-4-15 更新了代码 【2023 年第十三届 MathorCup 高校数学建模挑战赛】A 题 量子计算机在信用评分卡组合优化中的应用 更新信息&#xff1a;2023-4-15 更新了代码 1 题目 在银行信用卡或相关的贷款等业务中&#xff0c;对客户授信之前&#xff0c;需…

Linux程序的内存

要研究程序的运行环境&#xff0c;首先要弄明白程序与内存的关系。程序与内存的关系&#xff0c;好比鱼和水一般密不可分。内存是承载程序运行的介质&#xff0c;也是程序进行各种运算和表达的场所。了解程序如何使用内存&#xff0c;对程序本身的理解&#xff0c;以及后续章节…

【CSS-Part3 样式显示模式、背景设置、三大特性 】

CSS-Part3 样式显示模式、背景设置、三大特性一 CSS元素显示模式&#xff1a;1.1块元素&#xff1a;1.2行内元素&#xff1a;1.3行内块元素&#xff1a;(同时具有行内元素和块元素的特点)元素显示模式总结&#xff1a;1.4元素显示模式转换&#xff1a;一种模式的元素需要另一模…

从Navicat 和 DBeaver中导出数据不要文本识别符号 “”

今天需要从MySQL和ClickHouse数据库中导出CSV数据文件&#xff0c;打开CSV数据文件后发现字段的数据带着""这种不需要的符号&#xff0c;研究了一下终于成功导出了不要文本识别符号“”的CSV文件 一、演示从DBeaver导出ClickHouse数据库的表文件 第一步&#xff0c…

SSH、OpenSSH、SSL、OpenSSL及CA

OpenSSL1. SSH、OpenSSH、SSL、OpenSSL关系及区别2. SSH介绍2.1 概念2.2 SSH的主要功能2.3 示例讲解2.4 ssh和sshd的区别3. OpenSSH介绍3.1 概念3.2 OpenSSH程序简介3.3 OpenSSH 包含的组件1. ssh2. scp3. sftp4. sshd5. ssh-keygen6. ssh-copy-id7. ssh-agent8. ssh-add9. ssh…

刘二大人《Pytorch深度学习实践》第九讲多分类问题

文章目录多分类问题损失函数课上代码transforms的使用方法view&#xff08;&#xff09;函数dim维度的理解为什么要使用item()多分类问题 把原来只有一个输出&#xff0c;加到10个 每个输出对应一个数字&#xff0c;这样可以得到每个数字对应的概率值&#xff0c;这里每个输出做…

Netty实战与调优

Netty实战与调优 聊天室业务介绍 代码参考 /*** 用户管理接口*/ public interface UserService {/*** 登录* param username 用户名* param password 密码* return 登录成功返回 true, 否则返回 false*/boolean login(String username, String password); }/*** 会话管理接口…

如何快速上手Vue框架?

编译软件&#xff1a;IntelliJ IDEA 2019.2.4 x64 运行环境&#xff1a;Google浏览器 Vue框架版本&#xff1a;Vue.js v2.7.14 目录一. 框架是什么&#xff1f;二. 怎么写一个Vue程序&#xff08;以IDEA举例&#xff09;&#xff1f;三. 什么是声明式渲染?3.1 声明式3.2 渲染四…

docker安装oracle_11g -- 命还长时,自己搞的小玩具!!!

前言: 如果不是嫌命长, 建议不这么玩, 因为装到最后你会很崩溃, 感觉毫无意义, 就是个玩具, 哎~~~就是玩!!! 参考文档 1.https://blog.51cto.com/u_12946336/5722259 2.https://www.muzhuangnet.com/show/118178.html 3.https://blog.csdn.net/qq_42957435/article/details/1…