Qt信号和槽的参数类型,const参考限定符是否重要?

时间:2009-12-20 07:40:15

标签: qt connection types arguments signals-slots

对于以下类型的信号和插槽

signals:
    void textChanged(const QString &);

public slots:
    void setText(const QString & text)

textChanged和setText的参数类型似乎无法使用 const & 。与仅使用QString相比,常量和引用限定是否有任何区别?

QObject::connect(a,SIGNAL(textChanged(QString)),b,SLOT(setText(QString)));
QObject::connect(a,SIGNAL(textChanged(const QString &)),b,SLOT(setText(const QString &)));

编辑: 当SIGNAL或SLOT中使用不兼容的类型时,我没有注意到输出窗口显示错误消息。我认为信号槽机制能够在编译时检测参数类型错误。

2 个答案:

答案 0 :(得分:26)

Qt检查normalized signature,意思是

  

规范化将空格减少为a   最小,将'const'移到前面   在适当的情况下,删除'const'   从值类型和替换const   引用值。

答案 1 :(得分:4)

免责声明:我的qt相当生疏,但信号/插槽机制仍然只是C ++函数调用。如果信号/插槽机制实际上将对象复制到内部存储器中,我很抱歉(你需要检查Qt页面,信号/插槽上有一个很大的问题) - 因为下面的位只与C ++上下文相关,不在C ++ + Qt上下文中。

如果省略引用,则会复制字符串(并且const无关紧要,对其进行的任何更改都将保留在函数中)。
如果你留下引用但是取出const,你允许方法修改你给它的字符串。它们都有效,但对你传递的对象做了不同的事情(复制量/保留变化的可能性)。

我建议你阅读以下资源:

(关于const正确性)https://isocpp.org/wiki/faq/const-correctness

(参考文献)https://isocpp.org/wiki/faq/references

准确了解传递参数的方式以及方式 void foo(const A&) / void foo(const A) / void foo(A&) / void foo(A) 各有不同。