连接
信号和槽函数的参数类型及数量要完全一一对应
connect(sender, SIGNAL(clicked()), receiver, SLOT(onClicked()));
connect(sender, SIGNAL(clicked(bool)), receiver, SLOT(onClicked(bool)));
槽函数的参数数量可以比信号的参数数量更少,信号中多余的参数则被忽略
connect(sender, SIGNAL(EmitSignal(int, float)), receiver, SLOT(RecvSlot()));
connect(sender, SIGNAL(EmitSignal(int, float)), receiver, SLOT(RecvSlot(int)));
如果信号发送者与槽函数接收者属于同一个对象时,那么在连接调用中槽函数接收者这个参数可以忽略
connect(sender, SIGNAL(EmitSignal()), SLOT(RecvSlot()));
信号可以关联另一个信号,产生信号的蝴蝶效应
connect(sender, SIGNAL(EmitSignal()), SIGNAL(EmitOtherSignal()));
Qt5 使用函数指针,设置信号和槽函数。槽函数可以是任意函数,不一定要声明在 slots: 下
connect(sender, &Sender::clicked, receiver, &Receiver::onClicked);
connect(sender, &Sender::clicked, receiver, AnyFunction);
Qt5 使用函数指针,设置信号和槽函数。 信号或者槽函数若遇到同名重载函数,需明确指出具体的函数
void (Sender:: *clicked_bool)(bool)= &Sender::clicked;
connect(sender, clicked_bool, receiver, &Receiver::onClicked);
C++11 槽函数可以使用 Lambda 匿名函数
connect(sender, &Sender::clicked, receiver, [=] { /*code*/ });
connect(sender, &Sender::clicked, receiver, [=](int arg) { /*code*/ });
断开连接
- 在 disconnect 函数中 0 可以用作一个通配符,分别表示任何信号、任何接收对象、接收对象中的任何槽函数
- 但是发射者 sender 不能为 0,其它三个参数的值可以等于 0
- 或者更具体点,复制 connect 链接语句将方法名改成 disconnect 即可
disconnect(sender, 0, 0, 0);
disconnect(sender, SIGNAL(EmitSignal()), 0, 0 );
disconnect(sender, 0, receiver, 0 );
disconnect(sender, &Sender::clicked, receiver, &Receiver::onClicked);
sender->disconnect();
sender->disconnect(SIGNAL(EmitSignal()));
sender->disconnect(receiver);
Lambda 匿名函数
Lambda 匿名函数,= 表示局部变量值传递,& 表示局部变量引用传递
Lambda 匿名函数对象参数有以下形式:
[],没有使用任何函数对象参数。[=],函数体内可以使用Lambda所在作用范围内所有可见的局部交量(包括Lambda所在类的this),并且是值传递方式(相当于编译器自动为我们按值传递了所有局部变量)。[&],函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是引用传递方式(相当于编译器自动为我们按引用传递了所有局部变量)。[this],函数体内可以使用Lambda所在类中的成员变量。[a],将a按值进行传递。按值进行传递时,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数是const的。要修改传递进来的a的拷贝,可以添加mutable修饰符。mutable放在参数()后面,表示值传递过来的变量,可以在匿名函数内修改值,且只在匿名函数内有效,不影响变量本身的值。即修改的是拷贝,不是本体。可以作为 connect 的槽函数等[&a],将a按引用进行传递。[a,&b],将a按值进行传递,b按引用进行传递。[=,&a,&b],除a和b按引用进行传递外,其他参数都按值进行传递。[&,a,b],除a和b按值进行传递外,其他参数都按引用进行传递。
[=]()mutable {
button->setText("新标题");
}();
int ret = [] () -> int {
return 0;
}();