默认的信号和槽
-
案例
- 点击我的按钮 关闭窗口

- 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的地方(此时编译器可以自动推断出返回值的类型)时,这部分可以省略
- 函数体。{ },标识函数的实现,这部分不能省略,但函数体可以为空
























504

被折叠的 条评论
为什么被折叠?



