Qt的信号与槽(二)

  • 1.自定义槽
  • 2.通过图形化界面来生成自定义槽
  • 3.自定义信号
  • 3.信号和槽带参数
  • 4.参数数量
  • 5.connect函数的设计

🌟hello,各位读者大大们你们好呀🌟🌟
🚀🚀系列专栏:【Qt的学习】
📝📝本篇内容:自定义槽;通过图形化界面来生成自定义槽;自定义信号;信号和槽带参数;参数数量;connect函数的设计
⬆⬆⬆⬆上一篇:Qt的信号与槽(一)
💖💖作者简介:轩情吖,请多多指教(>> •̀֊•́ ) ̖́-

1.自定义槽

在Qt中我们也可以自己定义信号和槽,我们先来讲自定义槽,其实自定义的槽和普通的成员函数没有区别。不过在以前的版本中我们对于自定义的槽函数声明时需要放在public/private/protected slots:中,
在这里插入图片描述
学习C++后的同学应该都知道,这个public slots不是C++标准,这是Qt自己拓展的关键字,Qt通过qmake代码生成代码的方式,扫描到有slots这种,基于特定的关键字生成一堆代码(元编程)。
在这里插入图片描述
这是最简单的自定义槽,前面也见过

2.通过图形化界面来生成自定义槽

在这里插入图片描述
这个窗口列出了QPushButton提供的所有信号和它父类的信号
在这里插入图片描述
经过我们一系列的操作,在.h和.cpp中,Qt都帮我们自动生成了槽函数的声明和定义
在这里插入图片描述
在这里插入图片描述
功能也是没有问题的
在这里插入图片描述
这其实是通过函数名的方式来自动连接信号和槽的
在这里插入图片描述
当函数名符合上面的规则后,Qt就自动能够把信号和槽建立联系
为了进行验证,我们修改函数的名字
在这里插入图片描述
通过下面的提示我可以发现,调用QMetaObject::connectSlotsByName::这个函数就会触发上述自动连接信号槽的规则。它其实不在我们可以直接看到的文件中,而是在Qt自动生成的ui_widget.h文件中调用的
在这里插入图片描述
如果使用图像化界面来创建控件,就推荐使用这种方式来快速的链接信号和槽
如果是使用代码的方式来创建控件,还是得通过connect来连接信号和槽,因为代码中并没有调用connectSlotsByName

3.自定义信号

在Qt开发中,自定义信号其实是比较少见的,主要还是自定义槽,因为自定义槽是为了当用户触发某些操作后,自定义槽函数是处理业务逻辑的。而自定义信号就是对应用户的某一个操作,在GUI开发中,这些操作是可以穷举的,因此我们的Qt内置的一些信号已经足够我们使用了

在我们前面的使用也发现了,我们的信号本质上也就是一个函数,但是信号是一类比较特殊的函数:我们只需要写出信号函数的声明,并且告知Qt这是一个信号即可,信号函数的定义是在编译阶段Qt自动生成的。这主要是因为信号是Qt中特殊的机制,我们的信号函数的实现要配合Qt框架做很多既定的操作
并且我们的信号函数没有返回值,是void类型的,但是有没有参数都可以,也支持函数重载
对于自定义信号,Qt还提供了一个拓展的关键字signals,它像public/private一样使用,用来声明以下的函数是信号函数。它的作用是当qmake在调用代码扫描/分析工具的时候,扫描到类中用signals这个关键字,就自动认为这个关键字声明下的函数是信号函数,并且为信号函数自动生成函数定义
代码实现目标:通过点击按钮来触发自定义信号,自定义信号被触发后,修改窗口标题
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
不知道大家有没有注意是怎么触发自定义信号的呢?Qt内置的信号触发是不需要担心的,Qt已经内置在框架里了,当用户进行操作后,就会自动触发。但是自定义信号需要手动触发,就需要使用到emit关键字,这个单词的意思是“发射”的意思,就是用来触发自定义信号的。其实在现在的Qt5中不写emit也是可以的,emit的功能都实现在自定义函数定义中了,现在的emit什么都干,但是为了代码的可读性,还是建议加上。

3.信号和槽带参数

我们的信号和槽函数其实也可以带函数参数的,当信号有信息需要传递给槽函数时,就可以通过参数进行传递了。因此我们的槽函数和信号的参数需要一致,但是这里有个例外,参数类型是需要一致,但是个数不一定需要一致,当不一致的时候,只需要满足信号的参数个数必须多于槽函数即可。
先来看一段单纯有相同数量参数的代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面一整套代码展示了通过传递参数可以起到一个复用代码的作用,整体逻辑一致,但是数据不同,就可以根据不同场景传递不同参数
Qt内置的信号也有带参数的,只是不需要我们进行传递
在这里插入图片描述

4.参数数量

接下来该谈谈我们参数数量的问题了?为什么Qt允许信号的参数多于槽函数而不是一一对应呢?
这其实也是为了更加的灵活,一个槽函数可能绑定多个信号。如果严格按照参数数量一致,就会导致信号绑定槽的要求变高。当参数个数不一致时,槽函数参数就会按照顺序,拿到信号的的前N个参数,保证每个槽函数的参数都能拿到值。
当槽函数的参数多于信号的参数时就会报错
在这里插入图片描述
但是当槽函数的参数少于信号的参数时,同样的代码就没问题
在这里插入图片描述
并且我们在某个类中使用信号和槽的时候,一定不能没有Q_OBJECT这个宏定义,必须在类的最开始的地方写上
在这里插入图片描述
在这里插入图片描述
它会展开很多的代码,并且这些代码中也是宏,还会展开很多复杂的代码,设计到Qt的设计原理,如果没有这个宏,就会报错,并且提醒你
在这里插入图片描述

5.connect函数的设计

其实说到底,我们的信号和槽的工作就是为了处理用户想要执行的操作,所以说引入的connect函数,但是这只是在Qt中是这样设计的。在像网页开发,其他的语言中,是将槽函数是作为控件的一个属性的,而不是像Qt那么麻烦。Qt那么设计的原因是为了能够将控件和槽函数进行解耦,并且能够支持多对多,即一个信号可以connect多个槽函数,一个槽函数可以connect多个信号。但是理想是美好的,现实是残酷的,在实际的开发中,基本上用不到多对多,大部分都是一对一的情况。
在这里插入图片描述
在这里插入图片描述
上面演示了简单的多对多使用

🌸🌸Qt的信号与槽(二)大概就讲到这里啦,博主后续会继续更新更多Qt的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!如有小伙伴需要Qt的安装包可以私信我,你们的支持是博主坚持创作的动力!💪💪

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java研学-MongoDB(三)

三 文档相关 7 文档统计查询① 语法: // 精确统计文档数 慢 准 dahuang> db.xiaohuang.countDocuments({条件}) 4 // 粗略统计文档数 快 大致准 dahuang> db.xiaohuang.estimatedDocumentCount({条件}) 4② 例子: // 精确统计文档数 name为奔波儿灞…

TCP协议格式与连接释放

TCP报文段格式 TCP虽然是面向字节流的,但TCP传送带数据单元确是报文段。TCP报文段分为首部和数据段部分,而TCP的全部功能体现在它在首部中各字段的作用。因此,只有弄清TCP首部各字段的作用才能掌握TCP的工作原理。 TCP报文段首部的前20字节是…

CSS05:结构伪类选择器和属性选择器

结构伪类选择器 /*ul的第一个子元素*/ ul li:first-child{background: #0af6f6; }/*ul的最后一个子元素*/ ul li:last-child{background: #d27bf3; } /*选中p1:定位到父元素,选择当前的第一个元素 选择当前p元素的父级元素,选中父级元素的第…

使用策略模式 + 自动注册机制来构建旅游点评系统的搜索模块

✅ 目标: 搜索模块支持不同内容类型(攻略、达人、游记等)每种搜索逻辑用一个策略类表示自动注册(基于注解 Spring 容器)新增搜索类型时,只需添加一个类 一个注解,无需改工厂、注册表等&#x…

第八十九篇 大数据开发中的数据算法:贪心策略 - 生活中的“精打细算”艺术

在资源有限的世界里,贪心算法教会我们:局部最优的累积,往往是通往全局最高效的捷径。本文通过3个生活化场景原创图表,揭示大数据开发中最实用的优化策略。目录一、贪心算法核心思想:当下即最优二、三大核心应用场景详解…

【论文阅读】Dynamic Few-Shot Visual Learning without Forgetting

系统概述如下: (a) 一个基于卷积神经网络(ConvNet)的识别模型,该模型包含特征提取器和分类器; (b) 一个少样本分类权重生成器。这两个组件都是在一组基础类别上训练的,我们为这些类别准备了大量训练数据。在测试阶段,权重生成器会接收少量新类别的训练数据以及基础类别的…

HTML应用指南:利用GET请求获取全国山姆门店位置信息

山姆会员店作为全球知名的零售品牌,自进入中国市场以来,始终致力于为消费者提供高品质商品与便捷的购物体验。随着新零售业态的快速发展,门店位置信息的获取变得愈发重要。品牌通过不断拓展门店网络,目前已覆盖多个一、二线城市&a…

java ThreadLocal源码分析

写个demo测试下&#xff1a;private static void testThreadLocal() {ThreadLocal<Integer> threadLocal new ThreadLocal<>();new Thread(){Overridepublic void run() {threadLocal.set(9527);System.out.println("curr thread: " Thread.currentThr…

后端Web实战(项目管理)

Restful风格 我们的案例是基于当前最为主流的前后端分离模式进行开发 在前后端分离的开发模式中&#xff0c;前后端开发人员都需要根据提前定义好的接口文档&#xff0c;来进行前后端功能的开发。 后端开发人员&#xff1a;必须严格遵守提供的接口文档进行后端功能开发&#…

Leetcode 3604. Minimum Time to Reach Destination in Directed Graph

Leetcode 3604. Minimum Time to Reach Destination in Directed Graph 1. 解题思路2. 代码实现 题目链接&#xff1a;3604. Minimum Time to Reach Destination in Directed Graph 1. 解题思路 这一题思路上就是一个广度优先遍历&#xff0c;我们不断考察当前时间点以及位置…

OpenXR Runtime切换工具-OpenXR-Runtime-Switcher

在开发VR时&#xff0c;有时有多个设备&#xff0c;大家可能也会选择不同的串流工具&#xff0c;OpenXR类似于默认浏览器&#xff0c;如果设置错误可能导致游戏无法串流。 推荐一个工具&#xff0c;可以设置默认的OpenXR工具。 OpenXR-Runtime-Switcher 对于没有的设备&#…

Opencv探索之旅:从像素变化到世界轮廓的奥秘

在你已经能熟练地为图像施展“降噪”、“缩放”等魔法之后&#xff0c;你的探索之旅来到了一个全新的领域。你可能会好奇&#xff1a;我们人类能轻易地识别出照片中杯子的边缘、建筑的轮廓&#xff0c;那计算机是如何“看见”这些边界的呢&#xff1f;仅仅依靠滤波和颜色变换&a…

Ubuntu 22.04 + MySQL 8 无密码登录问题与 root 密码重置指南

背景场景 在 Ubuntu 系统中使用 apt 或 deb 包方式安装 MySQL 8 时&#xff1a; 初次安装后会自动初始化数据库&#xff1b;但 没有提示 root 初始密码&#xff1b;导致 mysql -u root -p 无法登录。 为了解决该问题&#xff0c;通常我们使用 --skip-grant-tables 方式跳过权限…

题解:P13017 [GESP202506 七级] 线图

首先明白定义&#xff1a; 线图 L(G)L(G)L(G) 的顶点对应原图 GGG 的边&#xff0c;当且仅当原图中的两条边有公共顶点时&#xff0c;对应的线图顶点之间有一条边。 不难想到&#xff0c;对于原图中的每个顶点 vvv&#xff0c;其度数 d(v)d(v)d(v) 对应的边集可以形成 (d(v)2)\…

c++ duiLib环境集成2

继续上一篇&#xff0c;现在需要把控制台隐藏&#xff0c;只显示调用duiLib框架显示的窗口。右键项目 → 属性 → 链接器 → 系统 → ‌子系统‌改为 窗口(/SUBSYSTEM:WINDOWS)。原来是这样&#xff1a;修改为&#xff1a;运行报错&#xff1a;需要修改入口函数为WinMain。如下…

常见的网络攻击方式及防御措施

常见的网络攻击方式及防御措施&#xff1a;全面解析网络安全威胁 前言肝文不易&#xff0c;点个免费的赞和关注&#xff0c;有错误的地方请指出&#xff0c;看个人主页有惊喜。 作者&#xff1a;神的孩子都在歌唱在信息化高速发展的今天&#xff0c;网络安全威胁无处不在&#…

JavaScript 中导入模块时,确实不需要显式地写 node_modules 路径。

1. 正确的导入语法在 Webpack、Vite 等打包工具中&#xff0c;node_modules 目录是默认的模块搜索路径&#xff0c;因此直接写包名即可&#xff1a;// ✅ 正确&#xff1a;直接使用包名import nprogress/nprogress.css;// ❌ 错误&#xff1a;不需要显式写 node_modules 路径im…

ELK Stack技术栈

文章目录一、日志收集所解决的问题二、Elastic Stack 组件介绍2.1 Elasticsearch2.2 Logstash2.3 Kibana2.4 Filebeat beats三、ELK Stack集群安装3.1 安装JAVA环境&#xff08;所有ES节点&#xff09;3.2 安装ES集群3.2.1 ES单节点部署3.2.2 ES JAVA调优&#xff1a;堆(heap)内…

大腾智能国产 3D CAD:设计自由度拉满,数据安全锁死

在智能制造与数字化转型的浪潮中&#xff0c;大腾智能CAD作为一款自主研发的三维计算机辅助设计软件&#xff0c;凭借其从概念设计到制造落地的全流程覆盖能力&#xff0c;正成为国产工业设计软件领域的新锐力量。软件深度融合先进建模技术与工程实践需求&#xff0c;为机械制造…

ubuntu 操作记录

1&#xff1a;安装minicom 1: sudo apt-get install minicom minicom -s 2&#xff1a;Ctrl Z C 的区别 ctrlz的是将任务中断,但是此任务并没有结束,他仍然在进程中他只是维持挂起的状态,用户可以使用fg/bg操作继续前台或后台的任务,fg命令重新启动前台被中断的任务,bg命令…