新旧语法对比
举例介绍。某个类在值变化时发送valueChanged(QString,QString)信号,需要在槽showValue(QString)中对改变的值做相应的处理。在Qt4中一般这样来关联信号和槽:
connect(sender,SIGNAL(valueChanged(QString,QString)),receiver,SLOT(showValue(QString)));
Qt4的SIGNAL和SLOT两个宏,实际是将其参数转换成相应的字符串。在编译之前,Qt的moc工具从源代码中提取出所需要的元数据,形成一张由使用了signals和slots修饰的所有函数组成的字符串表。connect函数将与信号关联起来的槽的字符串,同这张字符串中的信息进行匹配,也就能够在发出信号时知道需要调用哪个槽函数。
这种实现有下面两个问题:
1、没有编译期检查。由于信号和槽都会被SIGNAL和SLOT宏处理成字符串,字符串的对比是在运行时完成的,并且失去了类型信息。所以,我们在编写Qt4程序时,有时会出现编译通过但是运行时原本应该调用的槽函数却没有执行。此时,编译器不能给出任何错误信息,只能在运行时看有没有警告
2、无法使用相容类型的参数。由于connect函数使用的是字符串对比,所以槽函数参数类型的名称必须和信号的完全一致,也必须与头文件中的类型一致。这里的”一致“是严格的字符串意义上的相同,因此,那些使用了tyoedef或者namespace的类型,即便实际类型是相同的,依然可能由于字符串名字不一样而不能