03_信号和槽01:自定义信号和槽函数的创建及使用
先写出一个功能需求:下课后 老师触发信号 饿了 学生响应信号 请客吃饭
一、建立老师类和学生类
基类直接选择QObject,这样就可以将其创建到对象树中,不用考虑释放的问题。
二、信号函数
在teacher类中定义信号函数,teacher.h中的内容:
添加自定义发出信号(饥饿hungry),无参函数
注意:信号不需要在.cpp中添加实现代码(void…)
三、槽函数
1、在student类中定义信号函数,student.h中的进行声明:
添加自定义接收信号(响应treat)
注意:槽函数必须声明,右键单击treat在.cpp中添加实现程序void Student::treat
如果没有实现,会出现如下报错
student.cpp中:
四、将老师和学生对象连接起来
widget.h
在widget.cpp中:
五、下课后函数触发信号槽
widget.h
widget.cpp
运行后槽函数触发。
六、自定义信号槽需要注意的事项:
发送者和接收者都需要是QObject的子类(当然,槽函数是全局函数、Lambda 表达式等无需接收者的时候除外);
信号和槽函数返回值是 void
信号只需要声明,不需要实现;
槽函数需要声明也需要实现;
槽函数是普通的成员函数,作为成员函数,会受到 public、private、protected 的影响;
使用 emit 在恰当的位置发送信号;
使用connect()函数连接信号和槽。
任何成员函数、static 函数、全局函数和 Lambda 表达式都可以作为槽函数
信号槽要求信号和槽的参数一致,所谓一致,是参数类型一致。
如果信号和槽的参数不一致,允许的情况是,槽函数的参数可以比信号的少,即便如此,槽函数存在的那些参数的顺序也必须和信号的前面几个一致起来。这是因为,你可以在槽函数中选择忽略信号传来的数据(也就是槽函数的参数比信号的少)。
七、学习视频地址:自定义信号和槽函数的创建及使用
参考: