插件的通信通过插件管理器来管理,插件管理器转发插件的消息

首先,改一下接口,增加一个插件间通信的结构体,增加插件发送消息和接收消息的纯虚函数供插件实现

#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  不想下载可以发私信我发给你 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐