所以我要做的是使用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,那么我有什么遗漏吗?
答案 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);