【Qt5基础】:信号与槽+Lambda函数的使用

信号与槽

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;

    • 在关联里直接传递函数地址并进行类型转换
      • 例子:实现a发送信号Func触发b中槽函数ack_func
        • connect(&a, (void(Test:: *)(QString))&Test::Func, (void(test:: *)(QString))&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引用,其余拷贝
        • [&,ab]:”&,ab”。除ab拷贝,其余引用

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;} :函数体
    • Lambda在Connect中也可以使用
      • 例子 :
        • connect(btn,&QPushButton::clicked,[=] (){this->close();});
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值