Qt-信号和槽(8)
目录
信号的概念
Qt中的信号三要素
connect函数
connect的原型
connect的使用
信号函数和槽函数
参数匹配
close关闭槽函数
运行结果
第一个问题:怎么知道
手册使用
第二个问题,为什么可以直接传递函数指针
自定义槽函数
第一种自定义槽函数纯代码
widget.cpp
widget.h
运行结果
第二种自定义槽函数图形化操作
自定义信号
emit关键字
带参数的信号槽
widget.h
widget.cpp
带参的用处
参数个数的影响
参数类型的影响
Q_OBJECT宏
信号和槽存在的意义
实际运用
信号和槽断开连接
disconnect()
使用lambda表达式定义槽函数
版本低要手动添加C++11的编译选项
信号槽小结
信号的概念
这一点和Linux的信号有相似的地方,当然了这个不完全相同

关于信号我们也在很多地方都见到过了

Qt中的信号三要素
这个我们在之前的文章中已经见到过了

关于的触发先后的问题上,我们得小心了,一定得先有处理方式,这样接收信号的时候就不会错过了

connect函数
这个函数十分重要,首先我们得知道connect从哪里来的,在Qt中它是属于QObject这个类里面的静态成员函数,并且在Qt中所有的控件都是继承自QObject这个类的,自然我们用的QWidget可以用connect这个函数了

我们也可以看到这个继承

connect的原型

connect的使用
老样子,我们创建一个新的项目


我们创建一个按钮,用户点击之后,这个窗口就会关闭
如同我们先把这个按钮创建出来,运行发现没有什么问题,可以点击,当然了是没有反应的

信号函数和槽函数
这一点我们也需要明白,信号函数和槽函数之间的区别和关系

参数匹配
connect要求参数前两个参数要匹配

close关闭槽函数

运行结果
当我们点击这个关闭的时候,这个窗口就会关闭了

第一个问题:怎么知道
手册使用
要多看文档

这里用手册来看看这个信号和槽到底是如何知道它存在呢,我们打开手册

索引找到 QPushButton

没找到,就找它的父类


我们从它的父类中找到了clicked()这个信号函数,里面的参数我们留到后序再谈,这里我们看到,下面还有两个信号函数哦,pressed()和released(),其实一个clicked()就是一个pressed()和released()
点击进去就可以看到关于clicked的说明了

clicked函数的介绍,关于它的简介也很容易看懂

第二个问题,为什么可以直接传递函数指针

connect重载了,并且使用了泛型编程

我们可以直接跳转过去看到函数现在的声明

泛型编程

自定义槽函数
第一种自定义槽函数纯代码
我们新建一个项目
widget.cpp
写定义

widget.h
头文件写声明

public slots:这种写法已经过时了

运行结果

第二种自定义槽函数图形化操作
创建一个新的项目,并且拖拽出一个按钮

回到cpp文件,之前我们提到过,可以直接用代码的方式进行连接,但是有一种更方便的方式可以关联这个

回到UI界面,对你想要关联的控件进行右键看到这个“转到槽”,进去

我们发现里面有很多选项,这里就会是目前全部可以关联到的信号函数

我们选择clicked(),完成相应的函数,就会发现直接可以实现上面代码所实现的情况了

我们发现这个有个很奇怪的函数自动生成,这是因为Qt还可以通过函数名字来自动连接

当然了假如你更改了它的名字,就会出现报错,这是因为下面这个继承的函数名规定了规则

所以总的来说,怎么方便怎么来,显然第二种方式更方便

自定义信号
我们创建一个新的项目

我们得明白信号是一类非常特殊的函数

写个信号函数的定义,再写一个槽函数的定义



实现后运行,这里不会运行出我们想要的结果,这是因为虽然我们关联了,但是这个信号怎么触发我们并没有设置,也就是说后面的槽函数根本就触发不了

建立连接,不代表信号发出来了

如何触发自定义的信号

emit关键字
这个是Qt自己创建的一个关键字,可以用来触发信号,如下

那么如何合理的利用这个来触发信号呢?怎么用它来和用户建立连接,这里我们就通过点击这个按钮进行关联

将其写入PushButton中的槽函数中去,实现了关联

我们把emit屏蔽掉,其实也能够正常运行,不过建议加上更好一点,可读性高


带参数的信号槽
信号和槽可以带参数

widget.h

widget.cpp

运行结果,发送参数的确得到了传递

带参的用处
至于为什么要带参呢,其实这也是为了代码的复用

复用,这里我们就创建两个PushButton按钮

如图我们就有了两个按钮了


还有一定要补充的是,Qt内置了很多的信号,其中也有带参的,相信各位在操作中也看到了

参数个数的影响
信号多一个参数,槽函数还是只有一个函数

发现可以正常运行

我们反过来,就会发现一堆错误,这是因为信号的参数可以多于槽函数,但是反过来却不行

打个比方

参数类型的影响

Q_OBJECT宏
这个宏不能缺少

信号和槽存在的意义
这是比较笼统的说法

实际使用的过程中其他的GUI开发框架相比起来会更加简洁

总结来说就是其他的开发框架不需要一个connect进行连接

Qt使用connect的原因,想法很好,现实很残酷

这一套和Mysql的理念有点像


Mysql中的多对多情况
实际运用
创建一个新的项目,定义三个信号和三个槽函数

在去实现它们,如图就是这么一种情况,Qt是可以实现多对多这个操作的

Qt中的多对多

理想很好,但是现实很残酷

信号和槽断开连接
我们新建一个项目,写出一个点击就修改窗口标题的项目,这个东西我们在上面写过很多次了,就不再赘述了

我们再创建一个按钮

disconnect()

如下我们使用了disconnect(),这个函数可以帮助我们断开原来的信号

我们使用qDebug()可以更好的观察这个过程,我们看终端就可以发现,的确是切换了槽函数了

如下,就会实现一对多的情况了

使用lambda表达式定义槽函数
在Qt中我们也能够使用lambda表达式来实现槽函数


不过有一点是由于是一次性的函数,lambda表达式是无法直接获取到上层的变量

要想获取到上层的变量,我们只能够捕获它们,如下我们就能够实现点击一下就会把按钮位置换掉的程序了

再捕获一下this

如果我们想要捕获上层的所有变量,我们可以使用 =

lambda捕获参数、

确保捕获的变量是有意义的

通常我们是用值传递的,引用少一点

如下我们这里引用捕获就会出现问题 ,因为这个变量是在构造函数中的,出了函数就会自动销毁

版本低要手动添加C++11的编译选项

具体在.pro文件中添加C++11的编译选项
信号槽小结


相关文章:
Qt-信号和槽(8)
目录 信号的概念 Qt中的信号三要素 connect函数 connect的原型 connect的使用 信号函数和槽函数 参数匹配 close关闭槽函数 运行结果 第一个问题:怎么知道 手册使用 第二个问题,为什么可以直接传递函数指针 自定义槽函数 第一种自定义槽函…...
80.游戏的分辨率修改思路与分析
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:易道云信息技术研究院 上一个内容:79.游戏分析工具闪屏问题优化与数据被修改高亮 GAMEHACKER2.exe 工具下载地址ÿ…...
MaxKB(二):Ubuntu24.04搭建maxkb开发环境
接上文:windows10搭建maxkb开发环境(劝退指南) 上文在windows10环境搭建maxkb开发环境遇到各种坑,后面就转战ubuntu平台,果然比较顺利的完成开发环境搭建。当然遇到相关的问题还是可以参考上文《windows10搭建maxkb开发…...
c#实现数据导出为PDF的方式
PdfSharp vs iTextSharp: C#中PDF导出功能比较 PdfSharp 优点 轻量级:适合简单的PDF生成任务易于学习:API相对简单,学习曲线较缓开源:提供开源版本,可自由使用和修改纯C#实现:不依赖外部库或COM组件支持…...
【联想电脑】:使用拓展坞后转接HDMI,无法识别显示屏
项目场景: 作为一个嵌入式软件开发者,有两个外接屏幕,不足为奇。 但是在今天的使用电脑过程中,出现了接了一个拓展坞上面有HDMI接口,但是HDMI接口接上外接显示屏的时候电脑无法识别到,导致只有电脑直连的HD…...
Verilog刷题笔记53
题目: Fsm serialdata See also: Serial receiver Now that you have a finite state machine that can identify when bytes are correctly received in a serial bitstream, add a datapath that will output the correctly-received data byte. out_byte needs …...
GoFly快速开发后台框架-后端接口请求返回403提示码就跨域问题/请求端域名拦截问题
问题: 大家在本地开发或者部署后请求后端时返回403,只有一个问题就是存在请求端跨域问题。 解决办法: 解决这个问题很简单,跨域的就解决跨域就好了。 我们官方给大家统一解决办法是: 到后端配置文件resource/conf…...
设备实时数据采集:开启制造业智能化、自动化的新篇章
传统制造业在进行生产过程中,会涉及到设备实时数据采集需求,这些数据对于监控生产流程、优化生产效率、保证产品质量以及降低成本等方面至关重要。以下是一些常见的数据采集需求: 1.生产数据:包括生产数量、生产批次、生产速度等&…...
【python与java的区别-03(集合、字典)】
一、Set python: 集合(set)是一个无序的不重复元素序列。 集合中的元素不会重复,并且可以进行交集、并集、差集等常见的集合操作。 可以使用大括号 { } 创建集合,元素之间用逗号 , 分隔, 或者也可以使用 set() 函数…...
Java继承
目录 一、继承概念 二、语法格式 三、类型及特性 四、关键字 4.1. super 4.2. super与this指针 4.3 final 关键字 一、继承概念 继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性 的基础上进…...
Kafka集群搭建的两种方式
目录 1. 依赖Zookeeper搭建集群 1. 下载Kafka二进制文件 2. 更改kafka配置 3. 启动Zookeeper集群和Kafka集群 4. 验证集群 1.创建主题 2. 检查主题是否存在 3. 创建生产者生产数据 4. 创建消费者消费数据 5. 检查Zookeeper中Kafka集群的元数据 2. 不依赖Zookeeper搭…...
两种变量初始化方法的区别
1. CarriageEntity carriageEntity new CarriageEntity()和 null的区别 1.1 CarriageEntity carriageEntity new CarriageEntity(); 初始化:这行代码创建了一个新的 CarriageEntity 对象,并将其引用赋值给 carriageEntity 变量。对象状态ÿ…...
群晖把硬盘共享给win10(虚拟机或物理机)的两种办法
1. 通过SMB共享 NAS地址:192.168.3.100 打开“此电脑”,在win10地址栏输入 \192.168.3.100\video,提示输入用户名、密码。在video文件夹右击,点击“映射网络驱动器” 在win10电脑上,复制文件到T盘上,在T盘…...
Java-Web面试题汇总
一、TCP 和 UDP 的区别 在网络通信中,TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protocol,用户数据报协议)是两种常见的协议,它们在多个方面存在显著差…...
数字化技术分别有哪些,数字化技术特点和优势是什么?
随着企业数字化进程的加速,人工智能、工业互联网、低代码等底层技术正全面重塑企业运营生产体系,推动新的生产要素、研发范式和商业模式的建立。 这个变革过程不仅是对原有制造体系的颠覆,而且会影响各行各业的所有细分行业和产业链价值链…...
微服务CI/CD实践(一)环境准备及虚拟机创建
微服务CI/CD实践系列: 微服务CI/CD实践(一)环境准备及虚拟机创建 微服务CI/CD实践(二)gitlabs部署 微服务CI/CD实践(三)nexus3部署 微服务CI/CD实践(四)数据库,redis,n…...
【SpringBoot】优化慢启动应用的用户体验
通过深入分析SpringBoot中WebServer的启动流程,插入自定义的Loading页面展示逻辑,优化软件使用时的用户体验。 背景 Java本身的特点,再加上开发人员能力差,软件开发工程化程度低等等问题,经过一段时间的迭代之后&…...
String str=“i“ 与 String str=new String (“i“) 一样吗?
String str"i" 与 String strnew String ("i") String str"i" 这种形式声明了一个 String 对象,其中 "i" 字符串字面量直接赋值给 str。在 Java 中,字符串字面量会自动放入字符串常量池中,这是一个…...
【数据结构】二叉树链式结构的实现
前置声明:在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。由于现在大家对二叉树结构掌握还不够深入,为了降低大家学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉…...
如何有效找到目标客户群体?
在激烈的市场竞争中,找到并锁定目标客户群体是企业成功的关键。以下是几种有效的策略,帮助您精准定位并吸引目标客户。 1. 明确市场定位与客户画像 首先,企业需要明确市场定位,并绘制详细的客户画像,包括年龄、性别、…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
