【问题标题】:Qt:signal slot pass by const referenceQt:信号槽通过常量引用传递
【发布时间】:2015-04-08 07:27:11
【问题描述】:

许多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 中构造“像素图”失败。

【问题讨论】:

    标签: c++ qt pass-by-reference signals-slots pass-by-value


    【解决方案1】:

    当您通过引用传递参数时,副本将在排队连接中发送。实际上,当您有排队连接时,始终会复制参数。所以这里关于图像的生命周期不会有任何问题,因为它将被复制而不是通过引用传递。

    【讨论】:

    • 所以改成qt里面传值?并且不需要为“图像”添加任何互斥锁吧?
    • 是的,它会被复制。不需要互斥体。
    • 虽然确实发送了副本,但此处提供的说明是错误的。 1) 排队的连接总是复制参数。它们是按值传递还是通过 (const) 引用传递都没有关系。 2)规范化签名与此无关。
    • 但是。有人告诉我,传递的对象必须在 qt 的元对象系统中注册,以确保复制。
    • @Nyaruko 是的,应该注册一个类型以在队列连接中使用。但我认为QImage 默认支持QMetaType
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多