*初学过程遇到的问题 如有理解错误的地方 欢迎大佬们指正
先说结论:
Qt5才支持在connect中使用Lambda表达式
就是说 这种写法才可以
connect(this,&testMain::testsignal,[]{});
下边这样Qt4等老版本中connect的写法就会报错
connect(this,SIGNAL(testsignal()),[ ]{ });
下边是一些简单的笔记:
首先我们知道connect的基本格式
connect(sender, signal , receiver, slot);
其中信号和槽可以大致分为两种写法 以Http请求常用的请求结束信号举个栗子:
一种是写作函数地址的形式:
这种写法的优点在于 编译器会对信号和槽的参数类型进行检测
当信号或者槽有重载时 编译器会报错 需要使用函数指针来指向具体的某个函数
connect(baseManager,&QNetworkAccessManager::finished,this,&HttpBaseClientQObj::replyFinished);
另一种是Qt4及更早版本的写法:
这种写法可以直观的看到信号和槽中的参数类型
但缺点就是编译器不会对参数类型做出检测 就是说即使是参数不对应也不会报错
(新手就会产生一个想法:不报错还不好吗. 不报错只意味着程序语法的通过 而可能存在一些逻辑上隐藏的错误 直到代码运行出现异常 排查错误的时候才开始痛苦)
connect(baseManager,SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
Lambda表达式
简单来讲 Lambda表达式就是有三种括号组成 中括号 大括号 小括号 [ ] { } ( )
在connect中甚至只用到中括号和大括号就可以
connect(this,&testMain::testsignal,[]{});
一些详细的教学 就在下边分享一下大佬们的帖子
函数指针、函数符与Lambda表达式:
https://www.cnblogs.com/coolcpp/p/cpp-fuction.html
在connect中使用lambda实现高效的信号/槽关联: