【发布时间】:2017-06-30 10:41:46
【问题描述】:
在 qt 框架中,大多数库信号和槽都使用指针作为参数。我想知道,如果我创建一个将引用作为参数而不是指针的信号槽“结构”,会复制整个参数,还是像常规 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&)));
因此我想知道,参考是否甚至可以与信号/插槽一起使用?我将不胜感激。
【问题讨论】:
-
你的前提是有缺陷的。常规 C++ 引用没有大小,因为它们不是对象。例如,您不能使用
sizeof来获取引用的大小。此外,您应该停止使用已弃用的信号/插槽语法。正确的语法是connect(this, &Class::mySignal, this, &Class::on_mySignal);,这样您就不必担心了。 -
我明白了,谢谢。但要回答主要问题:如果使用带有引用的信号/槽,是否会复制大量数据?
-
我希望得到
int的副本,即使您指定了int &。您可以通过分配给插槽中的参数来测试它,并查看您传入的参数是否更改。 -
int 只是一个例子。在我的代码中,我有大型容器作为引用传入参数。这就是为什么它与我有关。也非常感谢您展示新的信号/插槽连接方法。确实很方便。
-
请注意,
QVector等 Qt 容器在写入时使用复制,因此复制QVectors 周围不会复制数据。如果您使用的是std::vectors,他们实际上会复制数据。
标签: c++ qt qt-signals slots