Qt信号槽连接在有默认形参下的情况思考

    写下这个给自己备忘,比如函数

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))。所以这点需要我们特别注意。

posted @ 2014-12-08 16:54  Ricky.K  阅读(1875)  评论(0编辑  收藏  举报