Qt 5 中的信号槽

Qt4中的信号槽

Qt4中的信号槽是通过SIGNAL,SLOT两个宏,将参数转换成字符串.Qt编译前,会从源码的头文件中提取由signalslot声明的信号和槽的函数,
将其组成一张信号和槽对应的字符串表.connect函数的作用是,将信号关联的槽字符串,同这张表的信息进行对比.这样信号发出的时候,就可以知道调用哪一个槽函数了.

Qt4信号槽的不足

  1. 没有编译期的检查:Qt4中的信号槽会被宏转化成字符串处理,而字符串的比较机制是在程序运行的时候检测的.而且,转换成字符串后,信号槽的参数数据类型就会丢失.这就导致,有的时候,信号槽在编译的时候没有问题,在运行的时候,反而出错.
  2. 无法使用相容类型的参数:因为信号槽的机制使用的是字符串的匹配的方法,所以,槽函数的参数类型的名字,必须和信号参数类型的名字一致,同时,还必须和头文件中声明的类型名字一致,也就是字符串意义上的严格相同.如果使用了typdef或者namespace这样的类型,虽然实际的类型是一样的,但是由于字符串的名字不一样,所以Qt4中是会有错误的.如下伪代码示例(实际类型都是int,但因为按照字符串处理,所以Qt4中,编译前不能通

Qt5中的信号槽

Qt5中不仅解决了上述Qt4中的问题,而且还有一些扩充.

  1. 支持编译期的检查:拼写错误,槽函数参数个数大于信号参数的个数等;
  2. 支持相容类型的自动转换;
  3. 槽允许连接到任意的函数:Qt5中,因为槽使用的是函数指针,所以槽的调用,可以是任意的成员函数,静态函数,还可以是C++11 的lambda表达式;Qt4中槽的声明一般是private slots,private是私有限制,只有把槽函数当作普通函数使用的时候,才会体现私有的性质.而SLOT,把槽函数转化成了字符串,此时private是不起作用的.Qt5中,因为使用的是函数指针,所以在类的外部,connect是无法关联一个类的私有槽的,否则,编译的时候就会报错.

总之,Qt5中,增加了信号槽的灵活性,加强了信号槽的检测性.

Qt5信号槽的语法例子

常用用法

信号槽的重载

解决方法:

  • 使用Qt4的方法(不再介绍)
  • Qt5显示转换函数指针

带默认数值的槽函数

解决方法:

  • 进一步的封装函数(不做介绍)
  • 采用Qt5的C++11 lambda表达式(表达式规则暂且不做详细介绍)

[update:2016_11_20]

思考this的省略?

前面提到过connect函数的第三个参数this指针是可以省略的.但是在某些情况下this是绝不可以省略的.甚至我建议大家为了避免不必要的错误, this指针最好不要省略, 还是带上比较好.connect函数基本是如下的原型:

所以,一定要明确的区分每个参数的具体意义, 马马虎虎最终还是自己填坑.

你也看到connect是可以使用C++的匿名函数的, 也是可以省略this的,但是, 这一步一定要小心了. 尤其是当你在使用线程的时候, 在接收线程信号的时候, 一万个小心.比如:

参考

《Qt 5编程入门》

1 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部