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

  • 相关阅读:
    springmvcIntercept(拦截器)
    springmvc多文件上传
    websphere8 从安装到部署 测试集群应用程序 安装j2ee程序(非常详细)
    WebSphere集群环境修改IHS端口号的方法
    WAS缓存问题
    websphere部署中文乱码问题
    WAS8.5安装和部署
    MQ7.5以后的权限问题解决
    IBM websphere MQ远程队列的简单配置
    MQ--API总结
  • 原文地址:https://www.cnblogs.com/rickyk/p/4151464.html
Copyright © 2011-2022 走看看