c++11中lambda表达式用于定义并创建匿名的函数对象 lambda表达式的基本构成:

[函数参数对象](操作符重载函数参数)mutable->返回值{函数体};





void(Teacher::*tsignal)(QString)=&Teacher::hungry; //函数地址就是函数的名字
void(Student::*ssignal)(QString)=&Student::treat;
connect(tt,tsignal,st,ssignal); //里面填的都是地址
//调用下课函数
//classisover();
//点击按钮,触发下课
QPushButton* btn=new QPushButton("请客",this);
//无参信号和槽
void(Teacher::*tsignal2)(void)=&Teacher::hungry;
void(Student::*ssignal2)(void)=&Student::treat;
connect(tt,tsignal2,st,ssignal2);
//信号和信号连接
//不需要无参的emit触发
//clicked信号的参数是bool类型,只有一个,如果这边用有参,参数类型不一致
connect( btn,&QPushButton::clicked,tt,tsignal2);
//lambda表达式:
[=](){btn->setText("下课");}();//最后加一个小括号,才是函数调用,否则只是函数声明
// QPushButton *btn1=new QPushButton(this);
// QPushButton* btn2=new QPushButton(this);
// btn2->move(100,100);
// int m=10;
// //默认情况下m为只读状态,修改加mutable,但是只会修改拷贝,而非值本身,因为是值传递
// connect(btn1,&QPushButton::clicked,this,[m]()mutable{m=100+10;qDebug()<<"m="<<m;});
// connect(btn2,&QPushButton::clicked,this,[=](){qDebug()<<"m="<<m;});
// qDebug()<<m;
//返回值
int ret=[=]()->int{return 1000;}();
qDebug()<<"ret="<<ret;
//利用lambda表达式实现,点击按钮关闭窗口
QPushButton *btn3=new QPushButton;
btn3->setParent(this);
btn3->setText("关闭");
btn3->move(100,0);
//如果第三个参数是this,可以省掉不写
connect(btn3,&QPushButton::clicked,[=](){close();
emit tt->hungry("宫保鸡丁");});
//断开信号
//disconnect(tt,tsignal2,st,ssignal2);
//拓展
//1.信号可以连接信号
//2.一个信号可以连接多个槽
//3.多个信号可以连接同一个槽函数
//4.信号和槽的参数必须类型一一对应
//5.信号的参数个数可以多于槽函数,但类型也要对应
}
void Widget::classisover()
{
//下课后,触发老师饿了的信号
//emit 触发:emit这里是为了触发老师的hungry函数
//如果采用信号连接信号,那么当按钮按下的时候,老师的hungry函数就会被触发
//emit tt->hungry();
//带参数
//emit tt->hungry("宫保鸡丁");
}
Widget::~Widget()
{
delete ui;
}