当前位置: 首页 > news >正文

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 工具下载地址&#xff…...

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 变量。对象状态&#xff…...

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

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

【机器视觉】单目测距——运动结构恢复

ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛&#xf…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...