目录
基础概念
liunx与qt信号
liunx与qt信号在概念上有所不同,但也有相似之处。
linux:信号为系统内部的通知机制,是进程间通信的方式。
信号源:谁发的信号。
信号类型:那种类的信号。
信号处理方式:注册信号处理函数,在信号被触发的时候自动调用执行。
QT中,信号同样拥有三要素
信号源:哪个控件发的信号。
信号类型:用户进行不同的操作,可能触发不同的信号。
信号处理方式:槽(slot)=>函数。(回调函数)
Qt中可以使用connect函数,将信号和槽关联起来,后续只要信号触发,Qt便会自动调用该函数。
需要注意,在Qt中一定是先把信号和槽关联起来,然后再触发这个信号!!
connect函数使用及技巧
该函数与Linux的tcp的connect函数没有任何关系,只是名字恰巧一样。他是Qbject提供的一个静态成员函数。
在Qt中提供的类,本身是存在一定的继承关系的:

connect函数的原型:

sender:信号由那个控件发出;
signal:信号的类型;
receiver:有谁进行处理;
method:处理方式;
autoconnect:暂时不谈,很少使用;
快捷键:ctrl+点击函数名(跳转带定义),alt+左键(返回上一层);
使用样例1:关闭小窗口(控件)

问题思考:
我们如何知道QPUSHBUTTON由个clicked信号?
这需要我们多多查看文档



clicked继承自父类的Qabstactbutton,当然了,如果没找到,咱们继续去更上层的父类找。
如何得知Qwidget有个close槽呢?

上图中我们发现第二,第四个参数类型为char*,而我们传参给的确实函数指针,这是因为QT版本不同造成的,
旧版:

传参形式:
![]()

新版:

好处:通过类型萃取器,能够更好的进行参数类型检查。
自定义槽函数
方式一:

简单的说就是需要我们自己设计他的第四个参数,在widget.h中声明,.cpp定义,并调用。

方式二:右键点击"转到槽"。


双击clicked(常用槽函数),会直接生成对应的声明,定义函数框架(不完整),我们直接定义函数达成目的。

完整定义:

点击按钮后标题一会随之改变:

该方式并不需要链接信号槽,而是链接函数名的方式来自动连接。

当函数符合上述规则之后,Qt就能自动的把信号和槽建立联系。
自定义信号
Qt 中也允许自定义信号的。
自定义槽函数,非常关键,开发中大部分情况都是需要自定义槽函数的,槽函数,就是用户触发某个操作之后,要进行的业务逻辑,
自定义信号,比较少见.实际开发中很少会需要自定义信号,信号就对应到用户的某个操作,在 GU1, 用户能够进行哪些操作,是可以穷举的。Qt 内置的信号,基本上已经覆盖到了上述所有可能的用户操作。因此, 使用 Qt 内置的信号,就足以应付大部分的开发场景了。
Widget 虽然还没有定义任何信号,由于继承自 QWidget,和 QObject,这俩类里面已经提供了一些信号了,可以直接使用.
所谓的 Qt 的信号,本质上也就是一个"函数”Qt 5 以及更高版本中,槽函数和普通的成员函数之间, 没啥差别了。
但是信号,则是一类非常特殊的函数.程序员只要写出函数声明,并且告诉 Qt,这是一个"信号"即可这个函数的定义,是 Qt 在编译过程中, 自动生成的.(自动生成的过程, 程序员无法干预)
作为信号函数,这个函数的返回值必须是 void,有没有参数都可以. 甚至也可以支持重载.
signals:是 Qt 自己扩展出来的关键字,qmake 的时候,调用一些代码的分析/生成工具,扫描到类中包含 signals 这个关键字的时候,此时,就会自动的把下面的函数声明认为是信号,并且给这些信号函数自动的生成函数定义。
声明信号

声明槽函数

定义槽函数

建立连接(自定义类型信号需要手动发起信号)
![]()
发送信号
![]()
同样的,通过按钮执行也是可行的:

含参的信号和槽函数
信号和槽同样可以带参数,信号和槽函数参数类型必须一直,但是参数个数可以不同。
示例1:


正常情况下,信号的参数是可以比槽函数多的,并不影响程序的正常功能,反过来则不行。


直观的思考,应该是要求信号的参数个数和槽的参数个数,严格一致~~此处为啥允许信号的参数比槽的参数多呢??
一个槽函数,有可能会绑定多个信号,如果我们严格要求参数个数一致,就意味着信号绑定到槽的要求就变高了换而言之,当下这样的规则,就允许信号和槽之间的绑定更灵活了更多的信号可以绑定到这个槽函数上了。

代码如下:

如果不包含这个宏,在不定义信号的情况下正常,一旦定义了信号,就会报错!!!、
lambda定义槽函数

信号和槽的存在意义与断连
1.实现了信号和槽的解耦;
2.信号和槽可以进行“多对多操作”(与数据库表操作相似)-其他GUI往往不具备这个功能;

断连-disconnect(少见)
主动断开往往时需要把信号重新绑定到另一个槽上。
原先绑定的时handleclick槽,解绑后重新绑定handleclick2;
![]()

如果没有解绑就直接连接,那么一个信号就绑定了两个槽函数,实现了一对多;
1595

被折叠的 条评论
为什么被折叠?



