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);
所以我想做的是使用 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);