Qt信号和插槽与Boost :: smart_ptr

时间:2015-02-13 20:46:03

标签: qt qt-signals boost-smart-ptr

所以我要做的是使用Qt信号和插槽通过smart_ptr传递图像,这样当需要使用数据的所有内容都可以访问它时,它会自行删除。

这是我的代码:

A类,继承QObject:

signals:
void newImageSent(boost::shared_ptr<namespace::ImageData> &image);

B类,继承QObject:

public slots:
void newImageRecieved(boost::shared_ptr<namespace::ImageData> &image)
{ 
// Manipulate Image 
}

连接代码:

QObject::connect(classAPtr.get(),
SIGNAL(newImageSent(boost::shared_ptr<namespace::ImageData>)),
classBPtr.get(),
SLOT(newImageRecieved(boost::shared_ptr<namespace::ImageData>)),
Qt::QueuedConnection);

当我尝试连接时总是返回false,那么我有什么遗漏吗?

1 个答案:

答案 0 :(得分:3)

在排队连接中,信号在事件循环中排队,并复制其参数。 因此,不直接执行插槽。 要进行复制,您必须通过qRegisterMetaType注册类型,另请参阅here

由于您使用的是共享指针,因此最简单的解决方案是按值传输它们,然后您就不必为Frank Osterfeld指出的引用而烦恼。

创建连接的方式是基于字符串的,因此很容易出错,尤其是涉及名称空间时。 使用typedef可以缓解疼痛,并更容易发现错误。 例如,你可以做

typedef boost::shared_ptr<namespace::ImageData> ImageDataPtr;
从那时起

并使用ImageDataPtr。 特别是在将类型注册为元类型时,您必须使用排队连接。

如果您正在使用 Qt5 ,那么您可以依赖新的连接语法来确保编译期间的正确性,因为它不依赖于字符串比较:

QObject::connect(classAPtr.get(), &A::newImageSent,
                 classBPtr.get(), &B::newImageRecieved,
                 Qt::QueuedConnection);