Boost::smart_ptr 的 Qt 信号和槽

Qt Signals and Slots with Boost::smart_ptr

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

这是我的代码:

Class A、继承QObject:

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

Class 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);

当我尝试进行连接时,连接总是 returns 错误,所以我是否遗漏了什么?

在排队连接中,信号在事件循环中排队并复制其参数。 因此,插槽不会直接执行。 要使复制成为可能,您必须通过 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);