student.h :
#ifndef STUDENT_H
#define STUDENT_H
#include <QObject>
class Student : public QObject
{
Q_OBJECT
public:
explicit Student(QObject *parent = 0);
signals:
public slots:
//自定义信号 写到slots下,低版本可以卸载public下
//返回值是void 需要声明 也需要实现
//可以有参数,可以重载
void treat();
void treat(QString FoodName);
};
#endif // STUDENT_H
student.cpp :
#include "student.h"
#include<QDebug>
Student::Student(QObject *parent) :
QObject(parent)
{
}
void Student::treat()
{
qDebug()<<"请老师吃饭";
}
void Student::treat(QString FoodName)
{
qDebug()<<"请老师吃:"<<FoodName.toUtf8().data();
}
teacher.h :
#ifndef TEACHER_H
#define TEACHER_H
#include <QObject>
class Teacher : public QObject
{
Q_OBJECT
public:
explicit Teacher(QObject *parent = 0);
signals:
//自定义信号 写到signal下
//返回值是void 只需要声明 不需要实现
//可以有参数,可以重载
void hungry();
void hungry(QString FoodName);
public slots:
};
#endif // TEACHER_H
teacher.cpp:
#include "teacher.h"
Teacher::Teacher(QObject *parent) :
QObject(parent)
{
}
widget.h:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include"teacher.h"
#include"student.h"
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
Teacher * zt;
Student * st;
void ClassOver();
};
#endif // WIDGET_H
widget.cpp :
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
//Teacher 类 老师类
//Student 类 学生类
// 下课了 老师发出一个饿了的信号 学生请吃饭
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//创建老师对象
this ->zt = new Teacher(this);
//创建学生对象
this ->st = new Student(this);
// //老师饿了,学生请吃饭连接
// //发个信号
// connect(zt,&Teacher::hungry,st,&Student::treat);
// ClassOver();
//重载时 连接信号和槽 需要定义一个指针
void(Teacher:: *teacherSingal)(QString)= &Teacher::hungry;
void(Student:: *studentSlot)(QString) = &Student::treat;
connect(zt,teacherSingal,st,studentSlot);
//ClassOver();
//点击一个下课按钮
QPushButton *btn = new QPushButton("下课",this);
resize(600,400);
//点击按钮触发下课
//connect(btn,&QPushButton::clicked,this,&Widget::ClassOver);
//无参数信号和槽连接
void(Teacher:: *teacherSingal2)(void)= &Teacher::hungry;
void(Student:: *studentSlot2)(void) = &Student::treat;
connect(zt,teacherSingal2,st,studentSlot2);
//信号连接信号
connect(btn,&QPushButton::clicked,zt,teacherSingal2);
//断开信号
//disconnect(zt,teacherSingal2,st,studentSlot2);
//拓展
//1、信号可以连接信号
//2、一个信号可以连接多个槽函数
//3、多个信号也可以连接一个槽函数
//4、信号和槽函数的参数 一一对应的
//5、信号的参数个数可以多余槽函数参数的个数,但是有的参数类型要对应
//版本4的信号和槽连接函数
//connect(zt,SIGNAL(hungry()),st,SLOT(treat()));
//4版本优点,参数直观,缺点:编译器对类型不做检测(前后参数不一样不做检测)
// //Lambda表达式知识 匿名函数
//
// [=](){
// btn->setText("aa");
// }; //没()只是起到声明作用;
// [=](){
// btn->setText("aa");
// }(); //有()才会执行
//mutable关键字永续修饰值传递的变量,修改的时拷贝,而不是值,例子没写
//利用lambda表达式实现点击按钮 关闭窗口
QPushButton *btn2 = new QPushButton(this);
btn2->setText("关闭窗口");
btn2->move(100,0);
//connect(btn2,&QPushButton::clicked,this,&Widget::close);
connect(btn2,&QPushButton::clicked,this,[=](){ //若用lambda表达式连接 若第三个参数是this可以省略
//this->close();
emit zt->hungry("宫保鸡丁");
btn2->setText("bye!");
});
}
Widget::~Widget()
{
delete ui;
}
void Widget::ClassOver()
{
// emit zt->hungry();
emit zt->hungry("宫保鸡丁");
}