写下这个给自己备忘,比如函数
void test(int a = 0)
你在调用端如论是test(3)或者test(),都可以正确调用到这个函数。
但是,如果放到Qt中的信号槽的话,这个还是值得讲一讲的,不然的话,可能会引起相应的误会。
其实说到底,Qt在connect信号的时候,采取的方式其实是类似于Java的反射,但由于C++本身特性的约束,并没有达到语言级,是Qt自己写的一套基于字符串查找的原则。
如果这个时候我有一个信号test(QString),一个槽onTest(QString)自然是可以链接的。但如果是test(QString a = QString())和onTest(QString a = QString())呢?
其实这里,你只需要记住一个原则,就是在connect的时候,它的默认规则其实和调用是一致的。
怎么理解?
也就是你在connect(test())或者connect(test(QString))的时候,在你声明信号为void test(QString a = QString())时,这两种调用同时成立。举例来说,如果我信号和槽的声明方式如下
signal: void test(const QString &a = QString()); private slots: void onTest(const QString &a = QString());connect(p, SIGNAL(test()), q, SLOT(onTest()))
此时如果我
connect(p, SIGNAL(test()), q, SLOT(onTest()))
那么不用担心和怀疑,这样做其实是可以的,就跟平常对待默认形参的函数调用一样。
但如果你这么写
connect(p, SIGNAL(test()), q, SLOT(onTest(QString)))
你可能会想当然,既然参数可以采取默认,那我信号的test()其实就是test(QString),这种情况下你就错了,Qt采用的反射机制还没有这么智能,因为他到不了语言层,所以只能用基于字符串的匹配方式来进行connect,所以你可能以为因为我采取了默认参数那么SIGNAL(test())应该就等于SIGNAL(test(QString))。所以这点需要我们特别注意。