Qt5插件开发入门+示例

目的

1、为什么用插件

现在大家最讲模块化开发了,怎么算模块化,分成不同的类,分成不同的文件夹,高内聚,低耦合,这个当然算是。

从高层次讲,它们是在一起的,只是逻辑上的模块化,不是物理上的模块化,或者说不是彻底的模块化,彻底的模块化应该像一个辆自行车一样,车轮子是车轮子,车把是车把,都是可以拿下来的,都是可以换的。

QT插件就实现了这种要求,本质上,它就是DLL,然而,QT又对其进行了加强,通过虚函数作为接口,实现了动态的绑定(当然也可以自己实现这个过程,有现成的,方便很多),这样实现了接口与实现的彻底分离,实现了面对接口的开发,这应该是正确模块化开发的样子。

2.Qt的插件是什么?优点是什么?

所谓的插件,只不过是重载了虚函数的dll,这跟抽象工厂类类似,这便是插件的原理。qt的插件可以说是一种动态库

在函数中,我们导入Interface接口文件,也就是插件接口文件,然后,加载动态库,获取具体实现类。

这样做的好处:定义开发范式,面向Interface编程,内部封装,模块和整体流程开发分离,提高开发效率。

应用场景QtCreator-IDE、WPS、visual studio、Nodepad++等等,都是采用这种开发方式。

插件程序

创建工程的时间选择DLL工程即可:
image.png

下面是项目结构:
image.png

重点代码:

接口头文件studentplugininterface.h:

#ifndef STUDENTPLUGININTERFACE_H
#define STUDENTPLUGININTERFACE_H
#include <QtWidgets>
class StudentPluginInterface
{
public://析构函数virtual ~StudentPluginInterface() {}//调用界面接口virtual QWidget* getStudentWidget() = 0;//调用普通接口virtual QString getStudentInfo() = 0;
};#define STUDENTPLUGININTERFACE_IID "com.test.studentplugin"
Q_DECLARE_INTERFACE(StudentPluginInterface, STUDENTPLUGININTERFACE_IID)
#endif // STUDENTPLUGININTERFACE_H

注:
1.虚析构函数一定要定义,这有助于确保利用基类的指针访问子类时,可以调用子类的析构函数,以避免内存泄漏
遗憾的是,大多数C++编译器并没有警示信息
2.Q_DECLARE_INTERFACE宏,将类定义为接口
3.DEVICEPLUGININTERFACE_IID 应该是与包名格式类似的唯一字符串,可以根据自己的喜好更改

接口的实现代码

头文件StudentPluginExport.h:

#ifndef DLLEXAMPLE1_H
#define DLLEXAMPLE1_H#include "dllexample1_global.h"
#include "studentplugininterface.h"
#include "StudentWidget.h"
#include <QObject>class STUDENTPLUGIN_EXPORT StudentPluginExport : public QObject, public StudentPluginInterface
{Q_OBJECTQ_PLUGIN_METADATA(IID "com.test.studentplugin")Q_INTERFACES(StudentPluginInterface)public:StudentPluginExport();//析构函数~StudentPluginExport();//调用界面接口QWidget* getStudentWidget();//调用普通接口QString getStudentInfo();
};#endif // DLLEXAMPLE1_H

1.添加接口类的头文件
2.确保导出类StudentPluginExport继承了QObject和StudentPluginInterface
3.添加必要的宏,以便将库识别为插件
Q_OBJECT Qt宏,以便使用Qt特定的功能
Q_PLUGIN_METADATA(IID “com.test.studentplugin”) 用于添加关于插件的元数据
Q_INTERFACES(StudentPluginInterface) 用于声明插件中实现的接口
CPP文件StudentPluginExport.cpp:

#include "StudentPluginExport.h"StudentPluginExport::StudentPluginExport()
{}StudentPluginExport::~StudentPluginExport()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/610196.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计-----ssm+mysql医药进销存系统

功能介绍 医药进销存系统&#xff0c;主要功能包括&#xff1a; 公告管理&#xff1a;发布公告、公告列表&#xff1b; 生产管理&#xff1a;订单列表、增加生产、订单日志&#xff1b; 分店采购&#xff1a;分店审核、采购&#xff1b; 总店仓库&#xff1a;出库管理、仓库列…

2024 Midjourney 基础教程(⼆):了解 Midjourney Bot 和AI绘画使用技巧进阶教学

在上⼀篇⽂章中&#xff0c;我们学到了如何注册 Midjourney &#xff0c;开通付费订阅&#xff0c;并画出了可能是⾃⼰的第⼀张 AI绘画。怎么样&#xff1f;这种将想象的画⾯&#xff0c;变为现实世界图⽚的感觉。 是否有种造物者的错觉&#xff0c;同时有种开盲盒的惊喜感&…

市域治理一体化综合指挥平台解决方案:PPT全文42页,附下载

关键词&#xff1a;市域社会治理&#xff0c;智慧网格&#xff0c;市域社会治理现代化&#xff0c;智慧网格综合管理平台&#xff0c;市域治理 一、市域治理&#xff08;智慧网格&#xff09;一体化建设需求分析 1、职能部门需求&#xff1a;职能部门在市域治理中发挥着主导作…

关于谷歌浏览器如何将背景换为黑色,字体换为白色

一.关于chorme浏览器如何换色 #跟着我一起来看一下吧 操作步骤 步骤 1.在谷歌的搜索框里搜索此网址——chrome://flags/ 如图 2.访问此网址 如图 3.我们在搜索框搜索:Auto Dark Mode for Web Contents 如图 4.开启Web内容的自动暗模式 选择enbled 5.确认重新启动 选择…

126.(leaflet篇)leaflet松散型arcgis缓存切片加载

地图之家总目录(订阅之前必须详细了解该博客) arcgis缓存切片数据格式如下: 完整代码工程包下载,运行如有问题,可“私信”博主。效果如下所示: leaflet松散型arcgis缓存切片加载 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYP

2.2.3机器学习—— 判定梯度下降是否收敛 + α学习率的选择

2.2.3 判定梯度下降是否收敛 α学习率的选择 2.1、 判定梯度下降是否收敛 有两种方法&#xff0c;如下图&#xff1a; 方法一&#xff1a; 如图&#xff0c;随着迭代次数的增加&#xff0c;J(W,b)损失函数不断下降当 iterations 300 之后&#xff0c;下降的就不太明显了 / …

赋能智慧农业生产,基于YOLOv3开发构建农业生产场景下油茶作物成熟检测识别系统

AI赋能生产生活场景&#xff0c;是加速人工智能技术落地的有利途径&#xff0c;在前文很多具体的业务场景中我们也从实验的角度来尝试性地分析实践了基于AI模型来助力生产生活制造相关的各个领域&#xff0c;诸如&#xff1a;基于AI硬件实现农业作物除草就是一个比较熟知的场景…

【数字图像处理】水平翻转、垂直翻转

图像翻转是常见的数字图像处理方式&#xff0c;分为水平翻转和垂直翻转。本文主要介绍 FPGA 实现图像翻转的基本思路&#xff0c;以及使用紫光同创 PGL22G 开发板实现数字图像水平翻转、垂直翻转的过程。 目录 1 水平翻转与垂直翻转 2 FPGA 布署与实现 2.1 功能与指标定义 …

Amazing OpenAI API:把非 OpenAI 模型都按 OpenAI API 调用

分享一个有趣的小工具&#xff0c;10MB 身材的小工具&#xff0c;能够将各种不同的模型 API 转换为开箱即用的 OpenAI API 格式。 让许多依赖 OpenAI API 的软件能够借助开发者能够接触到的&#xff0c;非 OpenAI 的 API 私有部署和使用起来。 写在前面 这个小工具软件写于两…

ChatGPT知名开源项目有哪些

ChatGPT-Next-Web&#xff1a;基于ChatGPT API的私有化部署网页聊天系统 主要功能&#xff1a; 只需在 1 分钟内即可在 Vercel 上一键免费部署&#xff0c;支持私有服务器快速部署&#xff0c;支持使用私有域名支持ChatGPT3.5、4等常见模型Linux/Windows/MacOS 上的紧凑型客户…

Ribbon学习思维导图

参考资料 1、OpenFeign与Ribbon源码分析总结与面试题 2、万字剖析OpenFeign整合Ribbon实现负载均衡的原理 3、扒一扒Nacos、OpenFeign、Ribbon、loadbalancer组件协调工作的原理 4、OpenFeign原来是这么基于Ribbon来实现负载均衡的

第18集《佛法修学概要》

戊五、结示法要 请大家打开讲义第四十四页。我们讲因果同时&#xff0c;借缘显现。 从因果转变的角度&#xff0c;佛教是说“罪从心起将心忏&#xff0c;心若灭时罪亦亡。”那么我们要知道&#xff0c;业是怎么来的&#xff1f;怎么会有业&#xff1f;为什么苹果掉下来&#x…

DEATHNOTE: 1

首先通过kali使用nmap进行主机发现 发现IP地址为192.168.75.129的主机 发现其22端口和80端口开放 对其进行详细扫描发现其操作系统是Linux 4.15 - 5.6 访问192.168.75.129&#xff1a;80会重定向到另一个页面 修改一下kali的/ect/hosts的添加一句192.168.75.129 deathnote.v…

【Vue3】2-8 : 条件渲染与列表渲染及注意点

本书目录&#xff1a;点击进入 一、条件渲染 - v-if 表达式 1.1 真值与假值 1.2 v-if &#xff0c;v-else-if &#xff0c;v-else 1.3 实战&#xff1a;isShow1 为真值时 显示 bbbbb &#xff1e; 代码 &#xff1e; 效果 二、列表渲染 - v-for 2.1 渲染 - 数组 &…

Spring基于注解的AOP控制事务

首先在.xml中开启sprong对注解事务的支持 applicationContext.xml <tx:annotation-driven transaction-manager"transactionManager"/> 然后再Service中加上注解 service Service Transactional(readOnlytrue,propagation Propagation.SUPPORTS) public cl…

Vue-11、Vue计算属性

Vue计算属性是Vue实例的属性&#xff0c;用来根据已有的数据进行计算得到新的数据。计算属性的值会根据它的依赖缓存起来&#xff0c;在依赖没有发生改变时直接返回缓存的值&#xff0c;提高了性能。 计算属性的定义方式为在Vue实例中使用computed关键字&#xff0c;并将计算属…

(Matlab)基于CNN-GRU的多输入分类(卷积神经网络-门控循环单元网络)

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分程序&#xff1a; 四、完整代码数据分享&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译…

雍禾医疗启动“毛发森林”公益计划 为地球种植“发际线”

不久前&#xff0c;由雍禾植发、新华网及中国绿化基金会三方共同发起的 “毛发森林地球生发计划”在内蒙古自治区阿拉善盟额济纳旗揭牌启动,此计划将陆续在西部严重沙化地区植下十万棵梭梭树改善荒漠化地区环境。 据悉,早在2023年3月,雍禾植发就主动与新华网一起启动“让美好生…

Rabbitmq 消息可靠性保证

1、简介 消息的可靠性投递就是要保证消息投递过程中每一个环节都要成功&#xff0c;本文详细介绍两个环节的消息可靠性传递方式&#xff1a;1&#xff09;、消息传递到交换机的 confirm 模式&#xff1b;2&#xff09;、消息传递到队列的 Return 模式。 消息从 producer 到 ex…

Msa全球最新研究:多系统萎缩特效药全球最新进展?

多系统萎缩&#xff0c;是一种以神经系统为主的遗传性疾病&#xff0c;典型症状表现为运动障碍、自主神经功能障碍和认知障碍等。对于这种疾病&#xff0c;西医目前尚未有明确的根治办法&#xff0c;大多数医生只能通过药物缓解患者的症状&#xff0c;但无法彻底治愈。 然而&a…