Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt:通过常数参考的信号槽传递_C++_Qt_Pass By Reference_Signals Slots_Pass By Value - Fatal编程技术网

C++ Qt:通过常数参考的信号槽传递

C++ Qt:通过常数参考的信号槽传递,c++,qt,pass-by-reference,signals-slots,pass-by-value,C++,Qt,Pass By Reference,Signals Slots,Pass By Value,许多qt示例执行以下操作: signal: passByConstRef(const QImage &) slot: receivedByConstRef( const QImage &) 它们通过不同线程中的排队连接进行连接。 在线程1中: {QImage image; image = fromData(...); emit passByConstRef(image); } 在线程2中: receivedByConstRef(const QImage& ima

许多qt示例执行以下操作:

signal: passByConstRef(const QImage &)
slot: receivedByConstRef( const QImage &)
它们通过不同线程中的排队连接进行连接。 在线程1中:

{QImage image; 
 image = fromData(...);
 emit passByConstRef(image);
}
在线程2中:

receivedByConstRef(const QImage& image){
   ...
   pixmap = fromImage(image);
   ...
 }

由于信号槽通过const Ref传递QImage,这意味着没有复制发生,那么当构造“pixmap”时,线程1中“image”的生存期是否可能结束,并导致线程2中构造“pixmap”的失败。

当通过引用传递参数时,副本将在排队连接中发送。事实上,当您有排队连接时,参数总是被复制的。因此,这里关于图像的生存时间不会有任何问题,因为它将被复制而不是通过引用传递。

所以它在qt内被更改为通过值传递?没有必要为“图像”添加任何互斥,对吗?是的,它会被复制。不需要互斥。虽然确实发送了副本,但此处提供的解释是错误的。1) 排队连接总是复制参数。它们是通过值还是(const)引用传递并不重要。2) 规范化签名与此无关。但是。有人告诉我,传递的对象必须注册到qt的元对象系统,以确保复制。@Nyaruko是的,应该注册一个类型,以便在排队连接中使用。但是我认为默认情况下,
QMetaType
支持
QImage