Qt信号和插槽:是否复制了参考参数?

问题描述 投票:2回答:1

在qt框架中,大多数库信号和插槽使用指针作为参数。我想知道,如果我创建一个信号槽“结构”,它将参考作为参数而不是指针,整个参数是否会被复制,或者只是4个字节(32位系统),就像常规的c ++参考一样?

我问这个是因为当我用参考参数创建信号/槽方法时我发现了一些东西。当我然后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&)));

因此,我想知道,甚至参考信号/插槽?我将非常感谢所有的帮助。

c++ qt qt-signals slots
1个回答
5
投票

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

发生的情况取决于连接类型和QT需要知道通过调用保持有效的保证。同一线程上的直接连接解析为简单的函数调用,因此底层数据几乎不会发生。但是,排队连接无法保证实际发生呼叫,因此QT将进行复制以保持数据完整性。 QT隐含地将信号排队穿过线程边界。

如果任一方是按值传递,则QT复制数据以不影响基础对象的状态。

有关更多信息,请访问have a look at this blog post

© www.soinside.com 2019 - 2024. All rights reserved.