QT插件开发(3)-- 插件之间相互通信

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

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

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

  • 15
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值