zoukankan      html  css  js  c++  java
  • 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))。所以这点需要我们特别注意。

  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    密码学-学习笔记
    让MySQL速度提升3倍的19种优化方式
    Oracle/云MySQL/MsSQL“大迁移”真相及最优方案
    tf.TFRecordReader()函数解析(最清晰的解释)
    Polkadot(波卡)简介
    Gavin Wood的故事:神级黄皮书、出走以太坊、乱世成名与三代区块链
    从设计哲学对比波卡与Cosmos
  • 原文地址:https://www.cnblogs.com/rickyk/p/4151464.html
Copyright © 2011-2022 走看看