转载https://www.devbean.net/2012/08/qt-study-road-2-catelog/的笔记
一、信号函数有重载
使用函数指针显示指明使用的信号函数,比如两个信号函数:
void newPaper(const QString &name);
void newPaper(const QString &name, const QDate &date);
槽函数为
void receiveNewspaper(const QString & name)
;
连接使用:
void (Newspaper:: *newPaperNameDate)(const QString &, const QDate &) = &Newspaper::newPaper;
QObject::connect(&newspaper, newPaperNameDate,
&reader, &Reader::receiveNewspaper);
这样,使用了函数指针newspaperNameDate声明一个带有QString和QDate两个参数,返回值是 void 的函数,将该函数作为信号,与Reader::receiveNewspaper()槽连接起来。
也可以写成一行这样:
QObject::connect(&newspaper,
static_cast<void (Newspaper:: *)(const QString &, const QDate &)>(&Newspaper::newPaper),
&reader,
&Reader::receiveNewspaper);
使用C++的类型转换。
二、带有默认参数的槽函数
一般情况下,槽函数的参数个数不能多于信号函数,但当槽函数带有默认参数时,槽函数参数个数可多于信号函数,比如,假设信号函数为:
void receiveNewspaper(const QString &name, const QDate &date = QDate::currentDate());
这时可以连接void newPaper(const QString &name);
但如果继续使用这种语法:
QObject::connect(&newspaper,
static_cast<void (Newspaper:: *)(const QString &)>(&Newspaper::newPaper),
&reader,
static_cast<void (Reader:: *)(const QString &, const QDate & =QDate::currentDate())>(&Reader::receiveNewspaper));
会出现断言错误:
The slot requires more arguments than the signal provides.
我们不能在函数指针中使用函数参数的默认值。这是 C++ 语言的限制:参数默认值只能使用在直接地函数调用中。当使用函数指针取其地址的时候,默认参数是不可见的!
可以使用Lambda表达式解决这个问题:
QObject::connect(&newspaper,
static_cast<void (Newspaper:: *)(const QString &)>(&Newspaper::newPaper),
[=](const QString &name) {reader.receiveNewspaper(name);});