Qt 信号和槽:是否复制了引用参数?

Qt signal and slots: are reference arguments copied?

在qt框架中,大多数库信号和槽都使用指针作为参数。我想知道,如果我创建一个信号槽 "structure" 将引用作为参数而不是指针,是否会复制整个参数,或者像常规 c++ 中那样只复制 4 个字节(32 位系统)参考资料?

我问这个是因为我在使用引用参数创建信号/槽方法时注意到了一些事情。当我然后 connect 它们时,QTCreator 中的自动完成机制不会像他对指针参数那样提示我使用引用参数。他用常规参数提示我。例如:

我创建了一个信号和槽:

...
signals:
     void mySignal(int& parameter);
private slots:
     void on_mySignal(int& parameter);

然后我尝试连接它们,但 Qt 没有在参数中添加 & 以供参考:

...
connect(this, SIGNAL(mySignal(int)), this, SLOT(on_mySignal(int)));

我必须手动更改为:

connect(this, SIGNAL(mySignal(int&)), this, SLOT(on_mySignal(int&)));

因此我想知道,引用甚至可以与 signal/slot 一起使用吗?我将不胜感激。

如果您在同一线程上发送和接收引用,默认情况下不会进行复制。如果您执行任何其他操作,包括 sending/receiving 一个值或发送对另一个线程的引用,将生成一份、两份甚至三份副本。

发生什么情况取决于连接类型和 QT 需要知道引用在整个调用中保持有效的保证。同一线程上的直接连接解析为简单的函数调用,因此底层数据几乎不会发生任何变化。但是,排队的连接无法保证调用实际发生的时间,因此 QT 将制作副本以保持数据完整性。 QT 对跨越线程边界的信号进行隐式排队。

如果任何一方是 pass-by-value,则 QT 复制数据以不影响底层对象的状态。

更多信息,have a look at this blog post