C++ Qt:通过常数参考的信号槽传递
许多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
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
。