如果我们要实现一个需求,点击按钮关闭窗口,怎么实现呢。就要用到信号和槽的概念。
原本按钮和窗口是没有关联的,但是我们通过一个槽函数连连接他们。比如
按钮—点击----窗口-----关闭。
所以我们需要一个函数connect,意思就是把信号的发送者和接受者链接起来,就可以完成需求。
connect的参数是
1、信号发送者(按钮,具体的信号(比如clicked点击)信号接受者(窗口),槽函数(比如关闭)。
connect(btn1,&QPushButton::clicked,this,&mywidget::close);
前面的信号clicked,槽函数close都是系统有的,如何实现自定义的信号和槽呢?
比如实现下面这个需求:
下课后,老师饿了,学生在debug栏输出请吃饭。
这里,对象是学生和老师,所以需要创建这两个对象,而且这两个对象父类可以是QObject,因为不一定是窗口的子类。
然后信号发送者是老师,信号是饿了(要用下课这个触发信号),然后接受者是学生,槽函数是输出请老师吃饭。
注意以下,信号只需要声明没有返回值,不需要定义,槽函数要声明也要定义。在学生头文件声明槽函数treat(),cpp文件定义槽函数treat().老师的头文件只需要声明hungry是个信号。
另外,classisover()要在建立连接后面,因为连接一直存在的,一直在等信号的触发,不然的话没有作用,因为没有连接函数。
里面之所以写this->zx,this->st,是因为我把zx,zt的声明写在widget头文件里面了,teacher *zx,student *st.
也可以在cpp里面直接定义初始化。比如下面
teacher * zx=new teacher(this);只不过要注意把老师学生两个类的头文件包括进去。
另外,classover函数不能再用了,直接在连接函数后面写emit zx->hungry().
因为之前我们把zx,st都作为widget的私有成员变量了,所以可以在widget::classover()里面用zx,现在用的话会报错zx没有定义。