插件的通信通过插件管理器来管理,插件管理器转发插件的消息
首先,改一下接口,增加一个插件间通信的结构体,增加插件发送消息和接收消息的纯虚函数供插件实现
#ifndef PLUGININTERFACE_H
#define PLUGININTERFACE_H
#include <QtPlugin>
#include <QJsonObject>
struct PluginMetaData
{
QString from;//消息来源
QString dest;//消息目的地
QString msg;
QObject *object = nullptr;
QJsonObject info = QJsonObject();
};
Q_DECLARE_METATYPE(PluginMetaData);//确保类型可以通过信号槽传递
class PluginInterface
{
public:
virtual ~PluginInterface() {}
virtual QString get_name() const = 0;
virtual QString show_text() const = 0;
virtual void recMsgfromManager(PluginMetaData) = 0;//接收到来自创建管理器的消息
virtual void sendMsg2Manager(PluginMetaData) = 0;//给插件管理器发消息
};
Q_DECLARE_INTERFACE(PluginInterface,"org.galaxyworld.plugins.PluginInterface/1.0")
#endif // PLUGININTERFACE_H
修改插件01如下,实现插件接口的信息接收函数,将插件接口的发送函数实现为信号
#ifndef PLUGIN01_H
#define PLUGIN01_H
#include "Plugin01_global.h"
#include <QObject>
#include "PluginInterface.h"
#include <QDebug>
class PLUGIN01_EXPORT Plugin01 : public QObject,public PluginInterface
{
Q_OBJECT
Q_INTERFACES(PluginInterface)
Q_PLUGIN_METADATA(IID "my_plugin01")
public:
Plugin01();
QString get_name() const
{
return "Plugin01";
}
QString show_text() const
{
return "this is Plugin01";
}
virtual void recMsgfromManager(PluginMetaData metaData) Q_DECL_OVERRIDE
{
qDebug()<<"插件Plugin01接收到消息:"<< metaData.msg;
}
signals:
void sendMsg2Manager(PluginMetaData) Q_DECL_OVERRIDE;
};
#endif // PLUGIN01_H
然后是插件02,几乎一样的代码
#ifndef PLUGIN02_H
#define PLUGIN02_H
#include "Plugin02_global.h"
#include <QObject>
#include "PluginInterface.h"
#include <QDebug>
class PLUGIN02_EXPORT Plugin02 : public QObject,public PluginInterface
{
Q_OBJECT
Q_INTERFACES(PluginInterface)
Q_PLUGIN_METADATA(IID "my_plugin02")
public:
Plugin02();
QString get_name() const
{
return "Plugin02";
}
QString show_text() const
{
return "this is Plugin02";
}
virtual void recMsgfromManager(PluginMetaData metaData) Q_DECL_OVERRIDE
{
qDebug()<<"插件Plugin02接收到消息:"<< metaData.msg;
}
signals:
void sendMsg2Manager(PluginMetaData) Q_DECL_OVERRIDE;
};
#endif // PLUGIN02_H
插件管理器做如下修改:
让加载的插件信号管理插件管理器的转发函数,当插件发送含有消息内容的信号时,信号管理器捕捉信号并根据消息中包含的目标插件消息调用相对应插件的转发函数,让插件自己处理消息
改一下调用界面
发消息代码:
结果:
代码:https://download.csdn.net/download/kenfan1647/12647420 不想下载可以发私信我发给你