Qt的信号与槽(一)
- 1.信号和槽的基本认识
- 2.connect
- 3.关闭窗口的按钮
- 4.函数的根源
- 5.形参和实参的类型
🌟hello,各位读者大大们你们好呀🌟🌟
🚀🚀系列专栏:【Qt的学习】
📝📝本篇内容:信号和槽的基本认识;connect;关闭窗口的按钮;函数的根源;形参和实参的类型
⬆⬆⬆⬆上一篇:Qt中的坐标系
💖💖作者简介:轩情吖,请多多指教(>> •̀֊•́ ) ̖́-
1.信号和槽的基本认识
在之前的学习中,我们已经简单的了解了信号和槽相关的知识,接下来就是详细的将这一方面的知识展示讲一讲。
首先我们在Linux中也有信号的概念,虽然不同相同的概念,但有相似之处
在Linux中我们谈到信号,涉及到三个要素
①信号源:谁发出的信号
②信号类型:哪种类别的信号
③信号的处理方式:注册信号处理函数,在信号被触发的时候自动调用执行
在Qt中我们谈到信号,也是涉及到三个要素
①信号源:由哪个控件发出的信号
②信号类型:用户进行不同的操作,就会触发不同的信号
③信号的处理方式(也就是槽):处理信号的函数,通过connect函数,把信号和槽关联起来,这个槽函数其实是一个回调函数,当信号触发了,Qt就会自动执行槽函数
并且我们的信号在触发前,一定是把处理函数准备好了,因此我们一定是需要先将信号和槽进行关联到一起后,再触发信号,否则Qt就不知道怎么处理信号了(直接错过了)
2.connect
我们之前讲过,connect函数是QObject提供的静态函数,我们可以通过它进行关联信号和槽,但是我们为什么能直接在Widget的构造函数中使用呢?
这主要是因为我们的Widget继承于QWidget,QWidget又继承于QObject
在Qt中很多类都存在一定的继承关系,QObject是大部分类的祖宗
了解完这个,我们来详细看看我们的connect的一些情况
我们先来看看它的参数情况
第一个参数:这个参数的作用是哪个控件发出的信号
第二个参数:这个参数的作用是什么类型的信号
第三个参数:这个参数的作用是哪个控件来负责处理(槽是哪个类提供的)
第四个参数:这个参数的作用是处理信号的控件提供的成员函数
第五个参数:暂时不关心,有默认参数
3.关闭窗口的按钮
下面写了一个功能:点击按钮后,关闭窗口
接下来我们详细谈谈这份代码当中的一些细节
首先我们来说说第二个参数,这个参数我们在写代码时,会自动补充出一个比较相似的参数,这个就需要我们注意,不要选错了。第一个click是一个动词,它是一个slot(槽)函数,功能就是调用的时候点击一下按钮,它前面的图标是一个也像一个“槽”,可以通过这个辨别。第二个clicked是一个过去分词,点击完后的状态,这个才是我们需要的信号函数,它前面的图标也像一个wifi图标,代表了这个是个信号函数。
并且我们的connect要求第一个参数和第二个参数要匹配,第一个参数的类型是QPushButton*类型的,第二个参数也必须是QPushButton内置的信号(也可以是继承父类的信号)
而我们的close槽函数,是QWidget内置的槽函数,然后Widget又继承了QWidget的槽函数,因此不需要我们操心实现,只需要知道功能是关闭当前的窗口
4.函数的根源
现在虽然解决了使用问题,但是我们怎么知道他们从何而来呢?特别是内置的槽函数和信号,就以按钮为例,你怎么知道它有个内置信号叫做clicked()?答案是查文档
但是其实我们在里面再怎么翻找,也找不到clicked。那怎么办呢?其实在图片中已经给出答案了,去它的父类中去找找
abstract是抽象的意思,也就是抽象按钮,之所以会有这样一个类,是因为Qt中会提供好几种按钮,这些按钮之间存在一些”共性”内容
就把这些共性的东西,提取出来,放到了QAbstractButton类里面
继续点击我们的clicked信号函数就可以看到下面的内容
翻译:当按钮被激活时(即,当鼠标光标位于按钮内时按下然后释放)、键入快捷键或调用 click() 或 animateClick() 时,会发出此信号。值得注意的是,如果您调用 setDown()、setChecked() 或 toggle(),则不会发出此信号。
我们在看文档的时候主要关注的是信号的发送时机,即对控件进行了什么操作产生的信号
5.形参和实参的类型
不知道大家在使用connect的时候注意到一个点,就是它的第二个和第四个参数的类型都是char*类型的,但是我们传递的参数都是函数指针类型的,并且即使是函数指针类型的,也会有问题,因为两个实参的函数指针类型也是不一样。
C++是不允许两个不同类型之间进行赋值的
其实这个是旧版本的connect声明,现在新版的已经不是这样了,并且我们在旧版时,需要给信号参数传参时需要带上SIGNAL宏,给槽参数传参时需要带上SLOT宏,这样才能将参数转换成char*类型
现在的Qt5就不需要那么麻烦,connect有了重载版本,第二个和第四个参数变成了泛型类型,可以接受任何类型的函数指针
在图中所说的出自同一个类的意思是,参数二和参数四的函数指针是参数一和参数三类的成员函数
🌸🌸Qt的信号与槽(一)大概就讲到这里啦,博主后续会继续更新更多Qt的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!如有小伙伴需要Qt的安装包可以私信我,你们的支持是博主坚持创作的动力!💪💪