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. 明确市场定位与客户画像 首先,企业需要明确市场定位,并绘制详细的客户画像,包括年龄、性别、…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...