从0到1学习Qt -- 信号和槽(二)

1. 自定义信号和槽
1.1. 基本语法
在 Qt 中,允许⾃定义信号的发送⽅以及接收⽅,即可以⾃定义信号函数和槽函数。但是对于⾃定义的信号函数和槽函数有⼀定的书写规范。
1.⾃定义信号函数书写规范(1)⾃定义信号函数必须写到 "signals" 下;(2)返回值为 void,只需要声明,不需要实现;(3)可以有参数,也可以发⽣重载;
2.⾃定义槽函数(1)⾃定义信号函数必须写到 "signals" 下;(2)返回值为 void,只需要声明,不需要实现;(3)可以有参数,也可以发⽣重载;
3.发送信号使⽤ "emit" 关键字发送信号 。"emit" 是⼀个空的宏。"emit" 其实是可选的,没有什么含义,只是为了提醒开发⼈员。
1.2. 示例1
1.2.1. 先在widget.h中声明自定义函数和槽函数

1.2.2. 在widget.cpp中实现自定义的槽函数

1.2.3. connect绑定自定义的信号和槽函数并发射信号

测试结果:

1.3. 示例2
1.3.1. 示例说明
当⽼师说 "上课了",学⽣们就 "回到座位,开始学习"。
1.3.2. 对项目先添加两个新的类
注意点击Add New...之后再定义Class name的时候要讲Base class置为 QObject
添加之后的效果:

1.3.3. 分别在teacher.h和student.h两个文件中分别加上自定义函数声明和槽函数声明
在 teacher.h 中声明信号函数:

在student.h中声明槽函数:

1.3.4. 在 widget.h 中实例化 "⽼师类对象" 和 "学⽣类对象"

1.3.5. 在 student.cpp 中实现槽函数

1.3.6. 在 widget.cpp 中连接⾃定义信号和槽
注意:要先new出来Teacher对象和Student对象

1.3.7. 结果演示

1.4. 自定义信号和槽函数的总结
1. 自定义信号只要进行声明,Qt自动生成自定义信号的定义,而自定义槽函数要进行声明和定义
2. 自定义信号要在前面加上关键字:signals,自定义槽函数可以加上public slots 或者 public
3. 当我们connect的时候要注意信号的发送对象和接收信号的对象
2. 带参数的信号和槽函数
2.1. 简单说明
Qt 的信号和槽也⽀持带有参数, 同时也可以⽀持重载.
此处我们要求, 信号函数的参数列表要和对应连接的槽函数参数列表⼀致.
此时信号触发, 调⽤到槽函数的时候, 信号函数中的实参就能够被传递到槽函数的形参当中.
2.2. 示例1
2.2.1. 重载信号槽,在 "widget.h" 头⽂件中声明重载的信号函数以及重载的槽函数

2.3.2. 在 "Widget.cpp" ⽂件实现重载槽函数以及连接信号和槽

2.3.3. 观察执行结果
执行结果如下:

3. 信号与槽的连接方式
3.1. 一对一连接
主要有两种连接形式,分别是:一个信号连接一个槽,一新信号连接到另外一个信号
3.1.1. 一个信号连接一个槽

示例:一个按钮被触发执行自定义槽函数
widget.h代码如下:

widget.cpp代码如下:

执行结果如下:

3.1.2. 一个信号连接一个信号

示例:按钮的clicked信号关联到自定义的信号,自定义的信号关联到自定义槽函数
widget.h代码如下:

widget.cpp代码如下:

执行结果如下:
按一次按钮就会在控制台上打印相关信息

3.2. 一对多的链接
一对多的连接分为:一个信号连接多个槽函数,一个槽函数连接多个信号
3.2.1.一个信号连接多个槽函数

示例:按钮的触发信号关联多个自定义槽函数
widget.h代码如下:

widget.cpp代码如下:

执行结果如下:

3.2.2. 多个信号关联一个槽函数

示例:自定义多个信号,关联一个槽函数
widget.h代码如下:

widget.cpp代码如下:

执行结果如下:


