Qt创建基于应用程序的插件

应用程序插件

  • 什么是插件
  • 插件的好处
  • 插件的种类
  • 应用程序插件
    • 创建应用程序的插件步骤:
    • 创建测试插件的应用程序步骤:
    • 应用程序插件示例
      • 开发环境
      • 创建示例
      • 生成插件
      • 运行结果
  • 总结

什么是插件

插件是一种用于应用程序功能扩展和增强,且按照特定规范编写的应用程序接口的程序。

插件的好处

可以用于应用程序的功能扩展,同时可在程序运行时动态的加载、卸载。
其相对于动态库而言,即使dll不存在,应用程序也可正常运行,只是插件的功能不能使用。
动态库需要访问lib文件,且必须保证dll存在,否则程序无法正常启动。

插件的种类

Qt插件就相当于一个共享库。但是由于动态库又一定的区别。
在Qt插件中,可以分为两种:

1. 用于应用程序扩展的插件,也叫低级的API;
2. 用于Qt自身扩展,也称为高级API。如自定义数据库驱动,文本编码,图片格式和自定义样式等。

本文主要讲解基于应用程序扩展的低级API,即应用程序插件。

应用程序插件

创建应用程序插件,分为两部分:一部分创建应用程序的插件;
一部分创建测试,也就是使用插件的应用程序。

创建应用程序的插件步骤:

  1. 继承QObject和接口类,实现接口类中的功能函数;
  2. 使用Q_PLUGIN_METADATA()宏向元对象系统注册接口类;
  3. 使用Q_INTERFACES()宏导出插件;
  4. 编写能够生成插件的pro文件。
    注意:这里的接口类实际是一个内部含有纯虚函数的抽象类。C++中没有接口类一说。以下本文中的所有接口类指的都是抽象类。

创建测试插件的应用程序步骤:

  1. 创建一个接口类;
  2. 使用Q_DECLARE_INTERFACE()宏在Qt元对象系统中注册接口类;
  3. 使用插件加载器QPluginLoader加载插件;
  4. 使用qobject_cast()来测试插件是否实现了给定功能。

应用程序插件示例

开发环境

在这里插入图片描述
我这里是基于Qt6.6.0,且使用的是QtCreator编译时使用的MSVC2019 64bit的编译器。
这个是为了后续的基于Qt自身的插件,专门更改的环境。

创建示例

首先打开QtCreator,点击菜单栏的文件-》新建项目,弹出如下弹窗:
在这里插入图片描述
选择项目中的其它项目,对应的子目录项目,点击选择按钮,弹出如下弹窗:
在这里插入图片描述
在名称后面的编辑框输入项目文件夹的名称MyPlugin,同时在创建路径的编辑框中选择要将文件存储的位置(自己选择就行,路径中不能含有中文),点击下一步按钮,弹出如下弹窗:
在这里插入图片描述
勾选要使用的编译器,我这里选择的是Qt6.6.0 MSVC2019 64bit的编译器,点击下一步。弹出如下弹窗:
在这里插入图片描述
点击完成&添加子项目按钮。弹出如下弹窗:
在这里插入图片描述
选择其他项目下的子目录项目,点击选择按钮,图中红色的线已经圈出。弹出如下:
在这里插入图片描述
输入子项目的名称Plugin,选择创建路径,一般这里的路径采用默认的方式,为之前创建的子目录项目MyPlugin所在的路径下创建子项目。之后,点击下一步,弹出弹窗:
在这里插入图片描述
点击完成&添加子项目按钮。会继续弹窗如下的弹窗:
在这里插入图片描述
点击取消按钮。
至此插件项目的项目文件夹Plugin有了,还需创建使用插件的应用程序的项目。
在项目文件夹MyPlugin上点击右键,弹出菜单栏,选择创建新子项目,弹出:
在这里插入图片描述
选择Application(Qt)——》Qt Widgets Applicatin,创建基于Qt的应用程序。这个程序用于最终插件的测试,也就是使用插件的程序。点击选择按钮。弹出:
在这里插入图片描述
输入项目名称PluginWindow,创建路径采用默认的即可,这里都默认路径为创建子目录项目时的路径,也就是创建的插件项目Plugin和应用程序项目PluginWindow都是MyPlugin的子目录项目。点击下一步按钮,弹出弹窗:
在这里插入图片描述
继续点击下一步按钮,弹出弹窗:
在这里插入图片描述
这里使用默认的也行,本示例代码提供的是基于QWidget的应用程序,创建基于Qt的应用程序,这不是本文的重点。点击下一步按钮。弹出弹窗后,继续点击下一步按钮,弹出:
在这里插入图片描述
这里需要勾选与插件项目一样的编译器选项,反正就是选择一样的编译器就行,我这里依旧还是Qt6.6.0 MSVC2019 64bit编译器。点击下一步按钮。弹出弹窗后,点击完成按钮。
此时可以看到项目的结构类似于如下所示这样:
在这里插入图片描述
展开后是类似下面这样的:
在这里插入图片描述
此时,插件项目Plugin中只有一个pro文件,将来使用插件的应用程序PluginWindow中也缺少一个接口类文件。
这个项目结构的截图只是提供了创建一个插件和使用插件的应用程序的整个创建步骤中的一个环节,并非本示例创建过程中对应的项目结构。

接下来向使用插件的应用程序项目PluginWindow添加接口类。
在基于Qt创建的应用程序项目PluginWindow上,右键出现菜单,选择添加新文件,弹出:
在这里插入图片描述
选择C/C++——》C/C++ Header File,然后点击选择按钮,弹出:
在这里插入图片描述
输入文件名,即抽象类的类名PluginInterface,也是接口类,路径默认就可以,点击下一步按钮。然后再在弹出窗口中点击完成按钮。此时使用插件的应用程序项目下新增一个头文件。如下:
在这里插入图片描述
接下来在插件类项目Plugin的pro文件中修改器内容为下(如果不修改pro文件,这里无法添加新文件,需先修改pro文件):

CONFIG      += plugin debug_and_release
TARGET      = $$qtLibraryTarget(myPlugin)
TEMPLATE    = lib
INCLUDEPATH += ../PluginWindow
DESTDIR = ../Plugins

然后在该插件项目Plugin上右击,弹出菜单中选择添加新文件,弹出:
在这里插入图片描述
选择C/C++——>C/C++ Class,点击选择按钮。弹出:
在这里插入图片描述
输入类名Plugin,会在下面的头文件和源文件处生成对应的文件名plugin.h,plugin.cpp,不用选择基类,当然这里可以手动输入之前在使用插件的应用程序中创建的接口类的类名PluginInterface作为基类,同时勾选Include QObject,点击下一步按钮,弹出的弹框中点击完

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

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

相关文章

Socks5代理IP使用教程及常见使用问题

当我们在互联网上浏览网页、下载文件或者进行在线活动时,隐私和安全问题常常被提及。在这样的环境下,一个有效的解决方案是使用Sock5IP。本教程将向您介绍Sock5IP的使用方法,帮助您保护个人隐私并提升网络安全。 一、什么是Sock5IP&#xff1…

开源模型应用落地-chatglm3-6b-function call-入门篇(六)

一、前言 每个模型都有自己的限制,有些情况下它们无法满足复杂的业务需求。但是,可以通过一个外置函数的方式,例如:"Function Call",让开发者能够更加灵活地利用大型语言模型,帮助开发者在特定场…

7.接口自动化测试-Allure报告

1.环境搭建 (1)下载并解压allure.zip,不要用中文路径,将bin目录配置到path环境变量 官网:Allure下载 (2)cmd安装allure-pytest第三方库 pip install allure-pytest 检测是否安装成功 pip show …

从大量数据到大数据,King’s SDMS仪器数据采集及科学数据管理系统的应用

对于实验室或检测机构,仪器设备是所有业务开展的基础,数据则是核心命脉,而传统的仪器设备原始数据收集方式,效率低耗时长、操作流程不规范、不易保存与查找、错误率高、易篡改等成了制约检测机构持续高速发展的瓶颈和弊端&#xf…

Erlang中常用数据结构原理及其实现

文章目录 一、Erlang 简介二、数据结构2.1、元组(Tuple)2.1.1、示例:2.1.2、实现: 2.2、列表(List)2.2.1、示例2.2.2、实现2.2.3、原理 3. 字典(Dictionary)3.1、创建字典3.2、添加和…

ELK 日志分析系统(一)

一、概念 二、详解 2.1 Elasticsearch 核心概念 2.1.1 接近实时(NRT) 2.1.2 cluster集群 2.1.3 Node节点 2.1.4 index索引 2.1.5 类型(type) 2.1.6 文档(document) 2.1.7 分片和副本(shards & replicas) 2.2 Logstash主要组件 …

UE_导入内容_Maya静态网格体导出为FBX的常规设置

注意事项:单位设置统一为cm;轴朝向,Maya默认y轴朝上,UE4 z轴向上;变换枢轴,UE4会将导入模型前世界中心作为枢轴中心,要旋转就需要注意了;法线,UE4内材质默认单面显示&…

记录一个Kafka客户端Offset Explore连不上的问题

我昨天把集群重装了一下,再连这个工具就连不上了(你先把zk和kafka在集群启起来),报错截图如下: 英文翻译过来大概就是说遍历zk指定路径不存在,我还以为zk的问题,回去又把zk的文档翻了一遍&#…

HCIE考试第四题:业务个性化配置

文章目录 业务个性化配置题目与做题步骤如下4业务个性化配置4.1.创建节点池solo-2【4.13中的同步创建了】4.1.1.创建Namespace4.1.2.创建节点池和节点4.2.镜像制作solo:2.04.3.创建sol0-2.0日录4.4.NFS环境检查4.5.修改Dockerfie4.6.构建镜像solo:2.0并上传到SWR【4.2-4.6为1小…

锐化空间滤波器--二阶微分图像增强(提高清晰度的另一种方式)

书上一阶微分的定义可以理解,毕竟这里不死数学上的曲线的概念,而是像素点上的曲线。所以,不同于数学的严格单调递增曲线的导数是大于等于零,这里的严格单调递增曲线,只能是大于零。 至于二阶微分的定义,就…

项目4-图书管理系统2+统一功能处理

1. 拦截器(Interceptor) 我们完成了强制登录的功能, 后端程序根据Session来判断用户是否登录, 但是实现⽅法是比较麻烦的。 所需要处理的内容: • 需要修改每个接⼝的处理逻辑 • 需要修改每个接⼝的返回结果 • 接⼝定义修改, 前端代码也需…

解决宝塔的FTP无法使用被动模式

问题:宝塔安装完ftp管理软件之后,无法使用被动模式连接 解决: 提示: 如果还是不行,那么要看看防火墙和安全组有没有放行被动模式的端口,宝塔安装的pure-ftpd软件的被动模式端口默认是39000至400…