信号和槽 - 实现点击按钮关闭窗口
按钮–>点击 --> 窗口–>关闭
connect(信号的发送者,发送的具体信号,信号的接收者,信号的处理)
信号的处理就是槽
一个是信号的发送方, 一个是信号的接收方,信号槽有一个优点:松散耦合,即发送方和接收方本身是没有关联的,是通过connect
连接将两端耦合在一起。
信号通过帮助文档去查看,到底是从哪个类中去继承的,这里click
这个信号是从QPushButton
中来,同理槽函数
当然也可以从myPushButton中去得到click这个信号,从QWidge中得到close这个槽
自定义的信号和槽
需求:下课后,老师触发一个信号,饿了,学生响应信号,请客吃饭
新建项目,添加新文件,定义类,由于老师和学生都不是自定义的控件,所以继承最高的QObject
自定义的头文件长这样
自定义的信号 写到signals下面
老师的信号(函数)就是, 老师会饿, 那写个hungry
的函数, 信号函数规定返回值为void
类型,signals
函数不需要实现,可以有参数可以重载
到了学生方,老师发出信号,学生方接收函数
接收函数肯定不会写到signals
下面,在早期版本必须要写道public slots
下面,之后的版本可以写到piblic
下或者全局下,slots
函数要求返回值, 需要声明也需要实现,可以有参数也可以发生重载
老师发出饿了的信号,学生接收,就会作出”请客“的响应
在.cpp
中实现
回到窗口中
这边新出现的ui相关的代码是因为在新建文件的时候,忘记关闭可以创建控件的勾勾,不过没有影响,不去删它相关代码就好了。初期先不学这个。
先创建老师的一个对象,再创建学生的对象,现在.h中声明出来这两个对象, 再在构造函数中进行初始化,都给这两个对象声明父窗口。有了对象之后要给这两个对象进行连接,
这个时候, 对项目进行构建运行,会发现没有什么都没打印;这是因为信号的发送者还没有发送信号,老师会在下课后饿,不会一直饿着,所以没有下课后这个条件,就不会触发老师饿了的这个状态
因此可以再写一个私有的下课的方法
实现并调用它
在实现中需要用emit
关键字去触发信号
这时运行可以看到槽函数的打印
整个小总结
- 自定的信号:返回
void
,需要声明不需要实现,可以有参数,可以有重载
写到signal
下
- 自定义的槽函数:返回
void
,需要声明,也需要函数,可以有参数,可以有重载
可以写到public slot
下,或者public
或全局下
- 触发自定义的信号
emit
, 需要有函数来触发信号,
自定义的信号和槽发生重载的解决
老师重载:
学生也重载并实现:
对应下课结束可以触发两个状态,带名字和不带名字的
在连接处,connect
函数无法通过函数地址来判断到底是带参数的还是不带参数的
===>
用函数指针指向函数地址
结果顺利调用到有参函数部分
但这边的fish的引号也一并打印出来了,如何去掉引号呢, 以字符串char*
输出
这就没有引号了,先通过utf8
转成QByteArray
, 再通过.data()
转成char*
这部分小结
当自定义信号和槽出现重载,需要利用函数指针明确指向函数的地址,用void (Teacher::sSignal)(QString) = &Teacher::hungry
;