Qt connect

411 阅读3分钟

连接

信号和槽函数的参数类型及数量要完全一一对应

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 匿名函数对象参数有以下形式:

  1. [],没有使用任何函数对象参数。
  2. [=],函数体内可以使用Lambda所在作用范围内所有可见的局部交量(包括Lambda所在类的this),并且是值传递方式(相当于编译器自动为我们按值传递了所有局部变量)。
  3. [&],函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是引用传递方式(相当于编译器自动为我们按引用传递了所有局部变量)。
  4. [this],函数体内可以使用Lambda所在类中的成员变量。
  5. [a],将a按值进行传递。按值进行传递时,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数是const的。要修改传递进来的a的拷贝,可以添加mutable修饰符。
  6. mutable 放在参数()后面,表示值传递过来的变量,可以在匿名函数内修改值,且只在匿名函数内有效,不影响变量本身的值。即修改的是拷贝,不是本体。可以作为 connect 的槽函数等
  7. [&a],将a按引用进行传递。
  8. [a,&b],将a按值进行传递,b按引用进行传递。
  9. [=,&a,&b],除a和b按引用进行传递外,其他参数都按值进行传递。
  10. [&,a,b],除a和b按值进行传递外,其他参数都按引用进行传递。
[=]()mutable {
    button->setText("新标题");
}();
int ret = [] () -> int {
    return 0;
}();