信号槽
- 信号槽是 Qt 框架引以为豪的机制之一。所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。
- 优点:松散耦合,信号发出端和接收端可以毫无关联,如果要关联就用connect函数。
connect函数使用
QPushButton* button = new QPushButton("关闭窗口", this);
this->resize(1280, 720);
//信号与槽函数
connect(button, &QPushButton::clicked, this, &Widget::close);
自定义信号与槽
- 1,确定功能
- 2,添加发送类和接收类
- 3,发送类声明信号,接收类声明并实现槽函数
-信号:信号返回值为void,参数可以存在,仅声明不需要实现,可以重载
signals:
void send();
-槽函数:一般在public slots里面写,对于一些高版本qt来说,也可以写到public或全局变量;返回值void,参数可以存在,需要声明并实现,可以重载
- 4,创建发送对象,接收对象
槽函数使用拓展
- 一个信号可以链接多个槽函数,发送一个信号有多个处理信号
-需要写多个connect链接
-槽函数的执行顺序是随机的, 和connect函数的调用顺序没有关系(qt5后就是按connect顺序执行)
-信号的接收者可以是一个对象或者是多个对象 - 一个槽函数可以链接多个信号,多个不同的信息,处理动作是相同的
-写多个connect就可以 - 信号可以链接信号
-信号接收者可以补不出来接收的信号,继续发出新的信号->传递了数据,并没有处理
- 信号槽是可以断开的
Lambda表达式
- Lambda表达式是C++11最重要也是最常用的特性之一,是现代编程语言的一个特点,简洁,提高了代码的效率并且可以使程序更加灵活,Qt是完全支持c++语法的,因此在Qt中也可以使用Lambda表达式。
- Lambda表达式就是一个匿名函数,语法格式如下
[capture](params)opt -> ret {body;};
capture:捕获列表
params:参数列表
-opt:函数选项
-ret:返回值类型
- body:函数体
//示例代码->匿名函数的调用:
int ret=[](int a)-> int
return at1;
}(100);
- 关于Lambda表达式的细节介绍:
-1.捕获列表: 捕获一定范围内的变量
[]-不捕捉任何变量
[&]-捕获外部作用域中所有变量,并作为引用在函数体内使用(按引用捕获 )
[=]-捕获外部作用域中所有变量,并作为副本在函数体内使用(按值捕获 )。
[=,&foo]-按值捕获外部作用域中所有变量,并按照引用捕获外部变量 foo。
[bar]-按值捕获 bar 变量,同时不捕获其他变量
[&bar]-按值捕获 bar 变量, 同时不捕获其他变量
[this]-捕获当前类中的this指针
-2,让lambda表达式拥有和当前类成员函数同样的访问权限如果已经使用了 &或者=,默认添加此选项参数列表: 和普通函数的参数列表一样