关于QT5的信号槽语法使用注意事项

转载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);});

猜你喜欢

转载自blog.csdn.net/zuolj/article/details/79649567