Qt的信号与槽(二)

发布于:2025-07-09 ⋅ 阅读:(27) ⋅ 点赞:(0)

🌟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的安装包可以私信我,你们的支持是博主坚持创作的动力!💪💪


网站公告

今日签到

点亮在社区的每一天
去签到