![信号与槽的内容](https://img-blog.csdnimg.cn/4e9781686f6747479a494fd3860b0a92.png#pic_center)
自定义信号与槽
自定义信号
自定义信号需要写到 signals 下,其返回值为 void 类型,需要声明,但不需要实现,可以有参数·,也可以重载
自定义槽函数
槽函数的返回值为 void 类型 ,需要声明和实现,可以有参数也可以重载,写到 public slot 下,或者直接写在public下或写在全局函数下
当自定义信号和槽出现重载时
此时信号连接的之前,需要利用函数指针进行明确的指向函数的地址
void(Teacher:: *tSingal)(QString) = & Teacher::hungry;
QString 转成 char ※ 的步骤
- 首先使用 .ToUtf8()转换为QByteArray
- 接着使用 .Data 转换为 char *
信号的断开操作使用 disconnect函数
这里的函数参数与connect函数中的参数是一致的
disconnect(信号的发出方,发出的信号,信号的接收方,信号的处理)
拓展
- 信号可以连接信号
- 一个信号可以连接多个槽函数
- 多个信号可以连接同一个槽函数
- 信号和槽函数的参数必须类型一一对应
- 信号的参数可以多余槽函数的参数个数
Qt4以前版本的信号连接方式
connect(zt, SIGNAL (hungry()), st, SLOT(treat()))
在connect 参数中的发出信号用的是SIGNAL来具体标注,信号的处理槽处用的是SLOT进行的标注。
这里的主要优点:参数直观,
缺点是这种方式的连接在发出信号与槽的参数不对应的时候不会在编译的时候出现问题,在执行的过程中不会实现想要的结果
Lambda表达式
C++11中Lambda表达式用于定义并创建匿名的函数对象,用来简化编程工作
[capture] (parameters) mutable -> return-type
{
statement
}
[函数对象参数] (操作符重载函数参数) mutable -> 返回值 {函数体}
1.函数对象参数:[ ] ,标识着一个lambda的开始,这部分是必须存在的,不能省略。
函数对象参数是传递给编译器自动生成的函数对象类的构造函数。函数对象参数只能使用那些到定义Lambda为止时Lambda所在作用范围内可见的局部变量(包括Lambda所在类的 this)。
函数对象参数有以下几种参数:
空:没有使用任何函数对象参数
=:函数体内使用了Lambda所在作用范围内所有可见的局部变量(包括this),并且是值传递
&:函数体内可以使用Lambda所在范围内所有可见的局部变量(包括this),并且是引用传递
this:函数体内可以使用Lambda所在类的成员变量
a:将a按照值进行传递,按值进行传递时,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数是const的,要修改传递进来的a的拷贝,可以添加mutable修饰符。
&a:将a按引用进行传递
a,&b:将a按照值进行传递,b按照引用进行传递
=,&a,&b:除a和b按引用进行传递外,其他参数按照值进行传递
&,a,b:除a,b按值进行传递外,其他参数都按照引用进行传递
2.操作符重载函数参数:标识重载的()操作符的参数,没有参数时,这部分可以省略,参数可以通过按值(a,b)和按引用(&a,&b)两种方式进行传递。
3.可修改标识符:mutable声明,这部分可以省略。按值传递函数对象参数时,加上mutable修饰后,可以修改按值传递进来的拷贝(修改拷贝,不是值本身)
4.函数表达式:->返回值类型,标识函数返回值的类型,当返回值为void,或者函数体中有一处return的地方(此时编译器可以自动推断出返回值类型)时,这部分可以省略。
5.函数体{}:标识函数的实现,这部分不能省略,但函数体可以为空。