信号与槽
1.信号(Signal):发送信号消息
- 例如PushButton 最常见的信号就是鼠标单击时会发送的 clicked() 信号
2.槽(Slot):接收信号消息并响应函数
- 定义槽函数:public slots
3.关联信号和槽
- 函数模型:QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
- 参数1(sender):信号的发送者
- 参数2(SIGNAL):发送者的信号
- 参数3(receiver):信号的接收者
- 参数4(SLOT):接收者的处理函数(槽函数)
- 例子:实现点击按钮"btn”关闭窗口
- QMetaObject::Connection ret = connect(btn,&QPushButton::clicked,this,&QWidget::close )
- 发送者(按钮):btn(QPushButton变量)
- 发送的信号(单击):&QPushButton::clicked(QPushButton单击信号)
- 信号的接收者(窗口):this(QWidget变量)
- 处理函数(关闭):&QWidget::close (QWidget关闭窗口信号)
4.自定义信号和槽
- 定义信号函数:signals
- 只需要定义可以不实现
- 定义槽函数:public slots
- 需要定义和实现
- 关联:connect
- 带参数的方法
- 利用函数指针指明某个重载带参数函数进行关联
- 例子:void a(QString)函数指针pFunc指向一个函数Test::func,他的声明是void Test::func(QString);
-
void(Test::*pFunc)(QString) = &Test::func;
-
- 例子:void a(QString)函数指针pFunc指向一个函数Test::func,他的声明是void Test::func(QString);
- 利用函数指针指明某个重载带参数函数进行关联
- 在关联里直接传递函数地址并进行类型转换
- 例子:实现a发送信号Func触发b中槽函数ack_func
-
connect(&a, (void(Test:: *)(QString))&Test::Func, (void(test:: *)(QString))&b::ack_func);
-
- 例子:实现a发送信号Func触发b中槽函数ack_func
- 关联信号与信号
- Connect可以关联信号与信号;
- 信号a—>信号b—>槽1,信号a触发槽1函数处理
- 一个信号可以和多个槽或者信号关联,多个信号对接一个槽也可以关联
- 带参数的方法
5.信号断开(disconnect)
- disconnect参数同connect一样
Lambda函数
1. 函数体
- [捕捉列表] (参数) mutable - > 返回值类型 {函数体}
- 2.解析:
- [ ] :标识一个,Lambda匿名函数的开始,这个必须有,不能省略,函数对象参数是传递给编译器自动生成的函数对象类的构造函数的。函数对象参数只能使用到Lambda定义为止Lambda所在的作用域范围内可见的局部变量,包括Lambda所在类的this。函数对象参数有以下形式
- [ ] :“空”,没有使用任何的函数对象参数
- [=] :“=”,函数体内使用Lambda所在范围内的可见局部变量包括所在类的this的传值方式,相当于编译器给Lambda所在地的所有局部变量复制一份给Lambda函数
- [&]:“&”,函数体内使用Lambda所在范围内的可见局部变量包括所在类的this的引用方式,相当于编译器给Lambda所在地的所有局部变量引用一份给Lambda函数
- [this]:“this”,函数体内可以使用Lambda所在内的成员变量
- [&]:“&”,函数体内使用Lambda所在范围内的可见局部变量包括所在类的this的引用方式,相当于编译器给Lambda所在地的所有局部变量引用一份给Lambda函数
- [&a]:“&a”,Lambda内引用a
- [a,&b]:“a,&b”,拷贝a,引用b
- [=,&a,&b]:“=,&a,&b”,除ab引用,其余拷贝
- [&,a,b]:”&,a,b”。除ab拷贝,其余引用
- [ ] :标识一个,Lambda匿名函数的开始,这个必须有,不能省略,函数对象参数是传递给编译器自动生成的函数对象类的构造函数的。函数对象参数只能使用到Lambda定义为止Lambda所在的作用域范围内可见的局部变量,包括Lambda所在类的this。函数对象参数有以下形式
- 2.解析:
2.例子
- connect(btn,&QPushButton::clicked,this,[this] ()mutable{this->a+=100;qDebug()<a;});
- [this] ()mutable{this->a+=100;qDebug()<a;}
- [this]:函数体内可以使用this类内的成员变量
- this->a+=100;qDebug()<a;:函数体
- 返回值例子
- int ret = [this] ()mutable->int {this->ret*=2;return ret;}();
- [this]:函数体内可以使用this类内的成员变量
- int {this->ret*=2;return ret;} :函数体
- int ret = [this] ()mutable->int {this->ret*=2;return ret;}();
- Lambda在Connect中也可以使用
- 例子 :
- connect(btn,&QPushButton::clicked,[=] (){this->close();});
- 例子 :
- [this] ()mutable{this->a+=100;qDebug()<a;}