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

2023-10-29

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT插件开发(3)-- 插件之间相互通信 的相关文章

  • 通过Socket通信理解TCP机制

    通过Socket通信理解TCP 1 什么是TCP协议 TCP是一种面向连接的 可靠的 基于字节流的传输层通信协议 即客户端和服务器之间在交换数据之前会先建立一个TCP连接 才能相互传输数据 并且提供超时重发 丢弃重复数据 检验数据 流量控制
  • 图片服务器项目测试用例

    单元测试 这里只对imageDAO层进行了单元测试 public class ImageDAOTest Test public void queryCountByMd5 ImageDAO imageDAO new ImageDAO int
  • 机械加工行业MES系统项目实施8大步骤

    搭建好的MES系统要应用到车间制造中 服务商应对MES的推进过程做总体的规划 通过数字化车间的建设 解决企业车间信息化系统与生产流程的融合问题 机械加工企业根据 总体规划 分步实施 以点带面 整体推进 的原则 首先在某个车间生产线上进行试点
  • android 实现发送短信功能

    离职五天左右 学习了一些基础理论并用于实践 也算是学到了点东西 1 实现短信的发送功能 在学习的视频里面发现了这个发送短信的功能实现 就好奇写了一个小demo 先看一下页面的效果吧 很简单的布局 两个输入框 一个按钮 看一下具体的实现效果
  • 随机产生长度不少于6位密码

    随机产生长度不少于6位 包含大写 小写 数字 特殊字符至少三种的密码 string randpass int n string res if n lt 6 cout lt lt 长度不能少于6位 lt
  • 元宇宙热潮:缘起、影响与展望

    当下科技界和产业界最热的话题非 元宇宙 莫属 2021年3月 元宇宙第一股 美国网络游戏和社交平台公司Roblox在纽约证券交易所上市 10月 美国互联网巨头Facebook更名为 元 Meta 宣告其强势进军元宇宙相关产业 由此 2021
  • H5页面跳转微信小程序

    实现H5页面跳转微信小程序有三种方式来实现 如果需求为在微信浏览器中实现跳转 则推荐使用微信官方接口 wx open launch weapp 文档点击这里 wx open launch weapp接口文档 注意 该方法只开放给已认证的服务
  • 用UGUI方式实现图片的遮罩,圆角图片,圆形图片效果

    实现图片的圆角效果 圆形图片效果 是一个很常见的功能 如下 很多人会使用shader来做 但是太麻烦了 网上关于UGUI实现这种效果的方法我也一直没有找到 我这里知道一个很简单的方法 不用写一行代码 现在我打算告诉你 原理 就是通过Mask
  • Unity3D

    使用UGUI实现一个公告板 IMGUI Immediate Mode GUI 及时模式图形界面 它是代码驱动的 UI 系统 没有图形化设计界面 只能在 OnGUI 阶段用 GUI 系列的类绘制各种 UI 元素 因此 UI元素只能浮在游戏界面
  • 《JavaScript语言精粹》笔记(内附《JavaScript语言精粹》百度云下载链接)

    章节 3 4 引用 P22 页码 知识点 对象通过引用来传递 它们永远不会被传递 var a obj a 1 var b obj a obj b obj是a obj的引用 b obj a 2 console log a obj a 2 章节
  • linux shell 日志函数

    各位运维的兄弟们 你们输出的日志有没有标识呢 标识有没有颜色变化呢 打开日志文件 大片大片的文字 头晕脑胀 很难一眼发现哪些是报错信息 哪些是正常输出的信息 怎么办 这便是大家今天看到这篇文章的原因了 接下来我们来看看具体的实现吧 bin
  • 本地启动项目,用Burp Suit抓不到包问题解决(火狐浏览器)

    本文介绍关于本地启动项目 用Burp Suit抓不到本地包问题的解决方法 1 首先打开Firefox菜单 设置 2 将about preferences修改为about config 3 点击页面 接受风险并继续 4 在搜索框输入 netw
  • 关于Jenkins操作的一套流程

    目录 一 在IDEA中创建maven项目 二 将maven项目初始化为git本地仓库 1 在Testcase5项目的文件内右击 进入Git Bush Here 2 初始化一个空的git本地仓库 3 配置用户名和邮箱 这边我一直存在疑问 这个
  • VUE-数字格式化每三位加一个逗号

    描述 将数字格式化成金融格式的数据展示 我的项目不包含小数 方式一 通过过滤器进行格式化 filters 1 在数据出添加过滤方法 div style text align center font size 12px span style
  • docker macvlan虚拟化网络与宿主机通信问题解决——筑梦之路

    默认情况下各个macvlan之间可以通讯 但是不能与宿主机进行通讯 主要原因 为了安全而禁止互通 如宿主机ping容器的ip 尽管他们属于同一网段 但也是ping不通的 反过来也是 这里用两个实例来说明如何解决这个问题 实例一 环境说明 宿
  • 实现strstr函数

    题目 给定两个两个字符串 str1和str2 str1是否包含str2 若包含则返回字符串出现的第一个位置 错误返回 1 示例1 输入 str1 hello str2 ll 输出 2 思路 1 判断两个字符串长度大小 2 判断两个字符串是否
  • The Serenity Prayer

    The Serenity Prayer God grant me the serenity to accept the things I cannot change courage to change the things I can an
  • JavaScript 身份证号合法验证

    let reg 1 9 d 5 18 19 20 3 d d 2 0 1 9 1 0 2 0 2 1 9 10 20 30 31 d 3 0 9Xx if reg test this dataForm visitorCode false t
  • 某个网站(比如CSDN、GitHub)突然打开、加载很慢,有些途径访问正常、其他网站访问正常,可尝试指定域名服务器的IP地址,不走DNS查询。

    摘要 若在电脑上访问某个网站比如CSDN主页 CSDN 专业开发者社区 GitHub主页 GitHub Let s build from here GitHub 通过WIFI或者网线访问很慢 甚至网页打不开 但通过流量访问却很快 访问其他网

随机推荐

  • VSCode出现请更新includePath错误的解决方法

    问题 文件添加 include
  • epoll 与select poll区别

    1 select gt 时间复杂度O n 它仅仅知道了 有I O事件发生了 却并不知道是哪那几个流 可能有一个 多个 甚至全部 我们只能无差别轮询所有流 找出能读出数据 或者写入数据的流 对他们进行操作 所以select具有O n 的无差别
  • ajax跨域post文件上传,ajax跨域上传文件加了xhr报不支持options错误

    用ajax跨域上传文件不加xhr就能请求成功 为了实现进度条功能在ajax里面加了xhr就报错了 ajax url http localhost 823 api FileStream Upload type post contentType
  • python序列和字典

    一 序列 1含义 包含若干个元素 元素有序排列 可通过下标访问一个或多个元素这样的对象 eg 字符串 列表 元组 2 标准类型操作符 expr 1 lt expr 2 3 序列类型操作符 1 in not in 判定一个元素是否在序列中 返
  • 如何复制网上的收费文本

    选中你要复制的内容打开f12开发者工具 查看选中部分地方源代码 鼠标左键打开 直接复制完事 新手博主 请前辈批评指正 丁一
  • JAVA接口实验:卡车要装载一批货物,货物由电视机、计算机和洗衣机组成,卡车需要计算出整批货物的重量。

    卡车要装载一批货物 货物由电视机 计算机和洗衣机组成 卡车需要计算出整批货物的重量 编写能够满足如下条件的程序 定义一个接口 包含计算货物重量的抽象方法 分别定义实现上述接口的用于计算电视机 计算机和洗衣机的类 定义一个卡车类 在其中定义一
  • Android软件开发之获取通讯录联系人 联系人图像

    Android软件开发之获取通讯录联系人信息 十二 发布于2011 10 12 图中选中的数据库 contacts2 db就是系统储存联系人的数据库 我们将它打开看看里面储存了些什么东东 打开contacts db后 发面里面有一堆表 同学
  • Java定时注解@Scheduled的使用,fixedDelay,fixedRate,cron的使用

    Java定时注解 Scheduled的使用 fixedDelay fixedRate cron的使用 问题背景 参数简介 项目创建 测试结果 心得 Lyric 咸咸的汗水 问题背景 项目中经常使用定时任务 spring提供了定时注解 很方便
  • 前端笔试题1

    HTML CSS 题1 1 使用CSS 让该节点不可见 方法越多越好 div class hidden Hi div 使用CSS 让节点不可见的方法有以下几种 把 visibility 属性设置为 hidden 这样元素框不会被绘制 但仍然
  • 【C++】详解声明和定义

    2023年8月28日 周一下午 研究了一个下午才彻底弄明白 写到晚上才写完这篇博客 目录 声明和定义的根本区别 结构体的声明和定义 声明结构体 定义结构体 类的声明和定义 函数的定义和声明 声明函数 定义函数 变量声明和定义 声明变量 定义
  • 人工智能的三个层次:运算智能,感知智能,认知智能

    2016年 人工智能成为产业界和学术界的大热词 年初 李世石与Alpha Go的人机围棋大战吸睛无数 人工智能的话题始料未及地席卷了世界每处 此外 今年也恰逢人工智能学科诞生一甲子 Alpha Go再一次打败人类 受到全世界的瞩目 历经波折
  • android集成友盟推送遇到的问题

    在自身项目集成友盟推送时 参考了官方文档的教程 导入 PushSDK 把下载的 zip 文件解压缩 解压后的文件路径不能有中文 把解压缩后得到的目录下的 PushSDK 当做 Module 导入到自己的工程 在之前的 AndroidMani
  • C++——可变模板参数

    声明 由于对可变模板参数了解资源有限 以下有些观点仅为个人参考手册实践得出的 不要被我个人的观点误导 文章目录 一 基本语法知识 1 基本知识 2 基本语法 二 基本使用方法 1 基本演示 2 参数展开 一 基本语法知识 1 基本知识 C
  • linux文件系统初始化过程(2)---挂载rootfs文件系统

    一 目的 本文主要讲述linux3 10文件系统初始化过程的第一阶段 挂载rootfs文件系统 rootfs是基于内存的文件系统 所有操作都在内存中完成 也没有实际的存储设备 所以不需要设备驱动程序的参与 基于以上原因 linux在启动阶段
  • 无监督学习分类

    目录 1 聚类 1 1 K 均值算法 K Means 1 2 层次聚类 Hierarchical Clustering 1 3 基于密度聚类Mean Shift 1 4 基于密度聚类DBSCAN 1 5 高斯混合模型 GMM 与EM 1 6
  • 加密算法 AES和RSA

    一 加密 一 加密基础 通过互联网发送数据 数据可能会被第三者恶意窃听 造成损失 因此需要给重要的数据进行加密 加密后的数据被称为 密文 接收方通过解除加密或得原本的数据 把密文恢复为原本数据的操作叫做 解密 像这样就减少了数据被恶意窃听的
  • HBuilder运行项目到IOS真机设备

    公司项目 开发多端应用 在此记录下开发后在ios端真机测试的步骤 在Hbuilder点击运行 gt 运行到手机或模拟器 gt 运行到IOS App基座 连上ios设备 这里需要设置一下Apple证书签名才可以使用 点击 使用Apple证书签
  • Python安装及环境配置

    编程语言分类 编译型 go语言 c语言 一次性把源代码进行翻译 特点是 执行效率高 平台依赖性一般比较高 解释型 js语言 python语言 ruby语言 逐行地对源代码进行翻译和运行 特点是 执行效率相对较低 平台的依赖性不高 安装各个平
  • 4 Swagger3 接口测试

    swagger ui图形客户端提供了接口测试功能 默认情况下 这些参数都不能填写 禁用的 我们点击 Try it out 按钮 即可开启接口测试功能 输入请求参数后 点击 Execute 按钮 即可执行 下方是后端返回信息 类似的 我们可以
  • QT插件开发(3)-- 插件之间相互通信

    插件的通信通过插件管理器来管理 插件管理器转发插件的消息 首先 改一下接口 增加一个插件间通信的结构体 增加插件发送消息和接收消息的纯虚函数供插件实现 ifndef PLUGININTERFACE H define PLUGININTERF