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

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...

Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...