C++ 插件中的qt信号/插槽
我有一个这样结构的应用程序:所有数据类型类INode都存储在插件DLL中。如果某些数据类型是IDrawable,则可以绘制它们 要加载的对象,例如类PointCloudNode:public INode,我有一个特殊的输入插件DLL,称为类PointCloudParser:public IIOPlugin,IIOPlugin是一个具有某些特定功能的线程:类IIOPlugin:public QThread 所有对象都是由NodeFactory类创建的,NodeFactory类是存储在单独DLL中的单例 问题是:C++ 插件中的qt信号/插槽,c++,qt,boost,signals-slots,C++,Qt,Boost,Signals Slots,我有一个这样结构的应用程序:所有数据类型类INode都存储在插件DLL中。如果某些数据类型是IDrawable,则可以绘制它们 要加载的对象,例如类PointCloudNode:public INode,我有一个特殊的输入插件DLL,称为类PointCloudParser:public IIOPlugin,IIOPlugin是一个具有某些特定功能的线程:类IIOPlugin:public QThread 所有对象都是由NodeFactory类创建的,NodeFactory类是存储在单独DLL中的
void PointCloudNode::update()
{
QObject::connect (this,SIGNAL(tmptmp()),this,SLOT(drawObject()));
emit tmptmp();
}
如果我从任何线程主线程或输入插件线程执行此操作
NodeFactory* fab = NodeFactory::getInstance();
boost::shared_ptr<INode> pc(fab->createNode("pointCloud","myPC"));
boost::shared_ptr<IDrawable> dr = boost::dynamic_pointer_cast<IDrawable>(pc);
dr->update();
最后一个发射连接到此:
void GeomBox::updateVisualization(const QString& fileName)
{
boost::shared_ptr<INode> node = container_->getChild(fileName);
boost::shared_ptr<IDrawable> nodeDrawable = boost::dynamic_pointer_cast<IDrawable>(node);
nodeDrawable->update(); //this is the problem line: update() executes, connect() works, but the slot never runs :(
}
为什么?节点对象始终是相同的,它是有效的。在已启动的QObject::connect中,代码中的每一行都不会向调试窗口写入任何内容,会发出信号tmptmp,但在一种情况下永远不会到达插槽drawObject?有什么想法吗
Upd:如果我没有从QThread继承IIOPlugin,那么一切都可以正常工作,即在主线程中加载对象。我希望信号/插槽能够跨线程工作…因为您正在向另一个线程发送信号,您可能需要明确告诉Qt连接应该是排队连接:
QObject::connect(this, SIGNAL(tmptmp()), this, SLOT(drawObject()), Qt::QueuedConnection );
默认情况下,Qt将使用Qt::AutoConnection作为最后一个参数,如果插槽与发射器位于同一个线程中,它将选择是使用直接连接,还是使用队列连接(如果插槽位于不同的线程中)。但是,由于您的线程位于一个单独的库中,可能Qt在这里没有做出正确的假设。您完成了吗,qmake,make clean,make all?您是否在插件源代码中包含了最后一行?Q_EXPORT_pluginxxx,XXXyep,我已经完成了所有这些,DLL之间的信号/插槽似乎有问题。您是否仔细检查了插件是否已加载?在插件加载代码上添加一些断言是的,所有插件都正确加载。
QObject::connect(this, SIGNAL(tmptmp()), this, SLOT(drawObject()), Qt::QueuedConnection );