假如使用了qt5 信号槽新语法:
QObject::connect(&newspaper, &Newspaper::newPaper,&reader, &Reader::receiveNewspaper);
信号有重载的时候,比如两个信号
void newPaper(const QString &name, const QDate &date);
void newPaper(const QString &name)
会出现编译错误:
..\control\mainwindow.cpp(57): error C2664: “bool QObject::disconnect(const QMetaObject::Connection &)”: 无法将参数 2 从“overloaded-function”转换为“const char *”
..\control\mainwindow.cpp(57): note: 上下文不允许消除重载函数的歧义
Qt4的信号槽语法因为带了参数,所以没有问题:
QObject::connect(&newspaper, SIGNAL(newPaper(QString, QDate)),&reader, SLOT(receiveNewspaper(QString, QDate)));
而新的信号槽的语法没有参数,当函数重载,编译器不知道要取哪一个函数的地址。所以我们需要指明是哪一个函数。
如下,定义一个 名为 newPaperNameDate的类函数指针:
void (Newspaper:: *newPaperNameDate)(const QString, const QDate) = &Newspaper::newPaper;
QObject::connect(&newspaper, newPaperNameDate,
&reader, &Reader::receiveNewspaper);
也可以写在一行:
QObject::connect(&newspaper,
static_cast<void (Newspaper:: *)(const QString, const QDate)>(&Newspaper::newPaper),
&reader,&Reader::receiveNewspaper);
同理:当槽函数有重载时,也必须指出是那个槽函数,如下:
QObject::connect(&newspaper,
static_cast<void (Newspaper:: *)(const QString, const QDate)>(&Newspaper::newPaper),
&reader,
static_cast<void (Reader:: *)(const QString, const QDate)>(&Reader::receiveNewspaper));
上面使用到的是类函数指针,类函数指针简单使用方式如下:
class CA
{
public:
int caAdd(int a, int b) {return a+b;}
int caMinus(int a, int b){return a-b;};
};
//定义类函数指针类型
typedef int (CA::*PtrCaFuncTwo)(int ,int);
//指针赋值
PtrCaFuncTwo pFunction = &CA::caAdd;
//使用指针,注意使用括号
CA ab;
int c = (ab.*pFunction) (1,2);