前言
用过qt信号与槽机制的人应该都知道,qt中connect函数可以有两种写参数的方式,第一种是SIGNAL()和SLOT()宏,第二种是&App::member 函数指针,昨天突然发现有时候用第二种方式编译会报错
no matching member function for call to 'connect'
用第一种宏函数的时候就不会报错,并且能编译通过,因此对这两种方式做了一下区分
一、先说结论
第一种用SIGNAL和SLOT宏的方式,信号函数参数列表数量小于槽函数参数列表数量的情况下 可以通过编译,但是会运行时报错
qt.core.qobject.connect: QObject::connect: Incompatible sender/receiver arguments
同时,使用宏函数的方式可以显式指定信号与槽函数的重载版本
并且此方式无需考虑类的继承关系,编译器智能识别基类的槽函数
第二种用&App::member 函数指针的方式,信号函数参数列表数量小于槽函数参数列表数量的情况下 不可以通过编译,同时会显示报错
no matching member function for call to 'connect'
使用函数指针的方式,无法指定信号与槽函数的重载版本,如果函数有重载,则会产生二义性冲突
二、错误原因及原理
1.SIGNAL和SLOT宏的工作原理
宏函数将信号和槽函数转换为const char *类型的字符串,并调用connect的如下重载版本
QMetaObject::Connection QObject::connect(const QObject *sender, const char