Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 插件中的qt信号/插槽_C++_Qt_Boost_Signals Slots - Fatal编程技术网

C++ 插件中的qt信号/插槽

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中的

我有一个这样结构的应用程序:所有数据类型类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 );