Qt学习笔记——信号和槽

默认的信号和槽

  • 案例

    • 点击我的按钮 关闭窗口
    • QPushButton中可能找不到信号的说明,可以从父类中去找,子类会继承父类的信号
  • 信号

    •  
  •  演示

  • 代码

    •     //需求 点击我的按钮 关闭窗口
          //参数1 信号的发送者 参数2 发送的具体信号(函数的地址) 参数3 信号的接受者  参数4 处理的槽函数
          connect(myBtn,&QPushButton::clicked,this,&QWidget::close);//父类的方式
          //connect(myBtn,&MyQPushbutton::clicked,this,&MyWindow::close);//子类的调用方式

自定义的信号和槽

  • 案例

    • Teacher 类  老师类
    • Student 类   学生类
    • 下课后,老师会触发一个信号——饿了,学生响应信号——请客吃饭
  •  自定义信号

    • 自定义的信号 写到signals下
    • 返回值是void,只需要声明,不需要实现
    • 可以有参数,可以重载
  •  槽函数

    • 早期的Qt版本必须写到public slots下,高级的版本可以写到public或者全局下
    • 返回值是void ,需要声明,也需要实现
    • 可以有参数,也可以重载
    •  在.c中实现
  •  运行

  •  代码

  •     ui->setupUi(this);
        //创建一个老师对象
        this->te = new Teacher(this);//放到对象树里面,方便释放
        //创建一个学生对象
        this->st = new Student(this);
    
        //老师饿了 学生请客吃饭
        connect(te,&Teacher::hungry,st,&Student::treat);
    
        //必须先连接好  再触发
        classIsOver();

自定义的信号和槽发生重载

  • 修改

    •  
  •  运行

    • 但是可以发现多了一个引号,这是不希望的,所以需要把debug的那部分改动一下
  • 改动

  • 再次运行


通过按钮触发信号

  • 修改

  • 运行


无参信号和槽连接/信号连接信号

  • 代码

    •     //无参信号和槽连接
          void (Teacher::*teSignalW)(void) = &Teacher::hungry;
          void (Student::*stSignalW)(void) = &Student::treat;
          connect(te,teSignalW,st,stSignalW);
          //信号连接信号
          connect(btn,&QPushButton::clicked,te,teSignalW);
  •  运行

  • 断开连接 

    •     //断开连接
          disconnect(btn,&QPushButton::clicked,te,teSignalW);

一个信号连接多个槽函数

  • 修改

  • 运行 


多个信号连接一个槽函数

  • 修改

  • 运行 


注意

  • 信号和槽函数的参数 必须类型一一对应。也就是信号无参数,槽函数也必须是无参数的;信号有一个QString的参数,那槽函数也必须有一个QString的参数
  • 信号和槽函数的参数个数可以不一致。信号的参数个数可以比槽函数的参数个数多
  • 信号的参数顺序必须要和槽函数的参数顺序一致

举个例子

  • 用按钮的click信号去连接一个void的槽函数,没有问题,可以运行(刚刚已经实验了)
  • 那如果去连接一个QString的槽函数了?

信号clicked

  • 所以这个和QString的槽函数参数不一致,报错了

Lambda表达式

函数对象参数

  • [ ],标识一个Lambda的开始,这部分必须存在,不能省略。函数对象参数是传递给编译器自动生成的函数对象类的构造函数的。函数对象参数只能使用那些到定义Lambda为止时Lambda所在作用范围内可见的局部变量(包括Lambda所在类的this)。函数对象参数有以下形式
      • 没有任何函数对象参数
    • =
      • 函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是值传递的方式(相当于编译器自动为我们按值传递了所有的局部变量)
    • &
      • 函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是引用传递的方式(相当于编译器自动为我们按引用传递了所有的局部变量)
    • this
      • 函数体内可以使用Lambda所在类中的成员变量
    • a
      • 将a按值传递。按值进行传递时,函数体内不能修改 传递进来的a的拷贝,因为默认情况下函数是const的。要修改传递进来的a的拷贝,可以添加mutable修饰符
    • &a
      • 将a按引用进行传递
    • a,&b
      • 将a按值进行传递,b按引用进行传递
    • =,&a,&b
      • 除a和b按引用进行传递外,其他参数都按值传递
    • &,a,b
      • 除a和b按值进行传递外,其他参数都按引用进行传递
  • 操作符重载的函数参数。标识重载的()操作符的参数,没有参数时,这部分可以省略,参数可以通过按值(如:(a,b))和按引用(如:(&a,&b))两种方式进行传递
  • 可修改标识符。mutable声明。按值传递函数对象时,加上mutable修饰符后,可以修改按值传递进来的拷贝(注意只能修改拷贝,而不是值本身)
    • 代码
      •     QPushButton *myBtn = new QPushButton(this);
            myBtn->move(0,200);
            QPushButton *myBtn2 = new QPushButton(this);
            myBtn2->move(100,200);
        
            int m = 10;
            connect(myBtn,&QPushButton::clicked,this,[m]()mutable{m = 100 + 10;qDebug() << m;});
            connect(myBtn2,&QPushButton::clicked,this,[=]()mutable{qDebug() << m;});
            qDebug() << m;
    • 运行
  • 函数返回值。->返回值类型,标识返回的类型,当返回值为void,或者函数体中只有一处return的地方(此时编译器可以自动推断出返回值的类型)时,这部分可以省略
  • 函数体。{ },标识函数的实现,这部分不能省略,但函数体可以为空
    •  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值