当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号
signal
。这种发出是没有目的的,类似广播。
如果有对象对这个信号感兴趣 ,它就会使用连接
connect
函数,意思是,将想要 处理的信号和自己的一个函数为槽
slot
绑定来处理这个信号。
也就是说,当信号发出时,被连接的槽函数会自动被回调。
一、信号和槽
1.1、Qt5的书写方式
connect(&b1,&QPushButton::pressed,this,&Widget::close);
/* &b1:信号发出者,指针类型
* &QPushButton::pressed:处理的信号, &发出者的类名::信号名字
* this:信号接受者
* &Widget::close:槽函数,信号处理函数 &发出者的类名::信号名字
*/
1.1.1、处理子窗口的信号不带参数
注意这样会产生二义性
connect(&subWin,&SubWideget::mySignal,this,&Widget::dealSub);
connect(&subWin,&SubWideget::mySignal,this,&Widget::dealSlot);
1.1.2、处理子窗口的信号带参数(使用函数指针)
void (SubWideget::*funSignal)() = &SubWideget::mySignal;
connect(&subWin,funSignal,this,&Widget::dealSub);
void(SubWideget::*testSignal)(int,QString) = &SubWideget::mySignal;
connect(&subWin,testSignal,this,&Widget::dealSlot);
1.2、Qt4的书写方式
Qt4信号连接:
- 使用了LSIGNAL和TSLOT这两个宏,将两个函数名转换成了字符串。
- 不方便检查错误
格式:connect(信号的发出者(指针类型), 处理的信号(SIGNAL(信号名字)), 信号的接受者, 信号处理的函数(SLOT(槽函数)));
connect(&subWin,SIGNAL(mySignal()),this,SLOT(dealSub())); //不带参数
connect(&subWin,SIGNAL(mySignal(int,QString)),this,SLOT(dealSlot(int,QString))); //带参数
1.3、Lambda表达式(匿名函数对象)
C++11中添加的新特性,需要在项目文件中添加:CONFIG += C++11
在Qt中配合信号一起使用,非常方便
- 不带参数
QPushButton *b4 = new QPushButton(this);
b4->setText("Lambda表达式");
b4->move(400,300);
int a =10,b=100;
connect(b4,&QPushButton::released,
//[]里面可以传一个变量也可以传多个变量 [b4,a,b]
//=:把外部所有的局部变量、类中所有成员以值传递方式
//this :类中所有成员以值传递方式
//&:把外部所有局部变量,引用符号
[=]()
{
b4->setText("123");
qDebug()<<"你好";
qDebug()<<a<<b;
}
);
- 带参数
connect(b4,&QPushButton::clicked,
[=](bool isCheck)
{
qDebug()<<isCheck;
qDebug()<<a<<b;
}
);
二、自定义信号槽
2.1、信号
- 信号必须有
singnals
关键字来声明
- 信号没有返回值,但可以有参数
- 信号就是函数的声明,只需声明,无需定义
- 使用
emit
在恰当的位置发信号
- 信号可以重载
signals:
void mySignal();
void mySignal(int,QString);//QString是Qt中的字符串
2.2、槽
- 槽函数是普通函数,作为成员函数,会受到
public,private,protected
的影响
- 槽函数需要和信号一致(参数和返回值)
- 由于信号没有返回值,则槽函数也没有返回值
- 任意成员函数,普通全局函数,静态函数,Lambda表达式都可以作为槽函数