0

所以我想要做的是使用 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,所以我缺少什么吗?

4

1 回答 1

3

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

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

创建连接的方式是基于字符串的,因此很容易出错,尤其是在涉及命名空间时。使用typedef会稍微减轻痛苦并更容易发现错误。例如你可以做

typedef boost::shared_ptr<namespace::ImageData> ImageDataPtr;

ImageDataPtr从那时起使用。特别是在将类型注册为元类型时,由于您使用的是排队连接,因此您必须这样做。

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

QObject::connect(classAPtr.get(), &A::newImageSent,
                 classBPtr.get(), &B::newImageRecieved,
                 Qt::QueuedConnection);
于 2015-02-13T21:16:25.420 回答