基于Qt的插件进行扩展
定义插件接口
#if defined(WORKFLOW_LIBRARY)
# define WORKFLOW_EXPORT Q_DECL_EXPORT
#else
# define WORKFLOW_EXPORT Q_DECL_IMPORT
#endif
class WORKFLOW_EXPORT IPlugin
{
public:
virtual ~IPlugin() {}
virtual void initModelRegistry(QStringList& vecCategoryIndex,
std::map<QString, std::map<QString, QString>>& categorysInfo,
std::shared_ptr<QtNodes::NodeDelegateModelRegistry>& modelRegistry) = 0;
};
QT_BEGIN_NAMESPACE
#define WORKFLOW_IID "org.qt-project.Qt.Vision.Workflow"
Q_DECLARE_INTERFACE(IPlugin, WORKFLOW_IID)
QT_END_NAMESPACE
定义自己的插件类
#include "IPlugin.h"
#include <QObject>
#include <QtPlugin>
class WORKFLOW_EXPORT FacePlugin : public QObject, public IPlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID WORKFLOW_IID)
Q_INTERFACES(IPlugin)
public:
virtual void initModelRegistry(QStringList& vecCategoryIndex,
std::map<QString, std::map<QString, QString>>& categorysInfo,
std::shared_ptr<QtNodes::NodeDelegateModelRegistry>& modelRegistry)override;
};
加载插件
QPluginLoader loader("./lib/libfacePlugin.so");
if(loader.load())
{
if(QObject * plugin = loader.instance())
{
IPlugin* pluginNode = dynamic_cast<IPlugin *>(plugin);
QStringList vecCategoryIndex;
std::map<QString, std::map<QString, QString>> categorysInfo;
pluginNode->initModelRegistry(vecCategoryIndex, categorysInfo, m_modelRegistry);
}
}
else
{
qDebug()<<loader.errorString();
}