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,点击下一步按钮,弹出的弹框中点击完

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Navicat for MySQL 使用基础与 SQL 语言的DDL

一、目的: Navicat for MySQL 是一套专为 MySQL 设计的高性能数据库管理及开发 工具。它可以用于任何版本 3.21 或以上的 MySQL 数据库服务器,并支持大 部份 MySQL 最新版本的功能,包括触发器、存储过程、函数、事件、视图、 管理用户等。…

动态规划-子数组1

文章目录 1. 最大子数组和(53)2. 环形子数组的最大和(918)3. 乘积最大子数组(152)4. 乘积为正数的最长子数组长度(1567) 1. 最大子数组和(53) 题目描述&…

Linux yum搭建Keepalived,2 台机器都有虚拟 IP 问题

文章目录 Keepalived 搭建一、安装二、keepalived配置1、配置文件详解global_defs模块参数vrrp_instance模块参数vrrp_script模块参数 2、修改配置文件3、启动服务 Tips:1️⃣问题:两台机器上面都有VIP的情况2️⃣完整配置文件 Keepalived 搭建 服务IP服务器Keepal…

[数据结构]——二叉树——堆的实现

1. 堆的概念及结构 如果有一个关键码的集合K { &#xff0c; &#xff0c; &#xff0c;…&#xff0c; }&#xff0c;把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中&#xff0c;并满足&#xff1a; < 且 < ( > 且 > ) i 0&#xff0c;1&…

【力扣TOP100热题图解】T1.两数之和

题目链接点这里—— 力扣&#xff08;LeetCode&#xff09;​​​​​​ 法一&#xff1a;暴力枚举 最容易想到的方法是枚举数组中的每一个数 x&#xff0c;寻找数组中是否存在 target - x。 当我们使用遍历整个数组的方式寻找 target - x 时&#xff0c;需要注意到每一个位…

ViT——nlp和cv进行了统一,使多模态成为可能

题目:AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE 1.概述之前的transformer在cv中应用,大部分是将CNN模型中部分替换成transformer block(整体网络结构不变)或者用transformer将不同网络连接起来,而本文提出:一个针对图像patch的纯的t…

雷达智能名片小程序源码系统 带完整的安装代码包以及搭建教程

在数字化高速发展的今天&#xff0c;名片作为商务交流中的一张“金名片”&#xff0c;其形式与功能也在不断地迭代升级。雷达智能名片小程序源码系统应运而生&#xff0c;为企业和个人提供了一个全新的、智能化的名片展示与互动平台。本文将对雷达智能名片小程序源码系统的开发…

二叉树的前、中、后序遍历【c++】

前序遍历&#xff1a;根左右 中序遍历&#xff1a;左根右 后序遍历&#xff1a;左右根 #include <iostream> #include <vector> using namespace std;//双链表节点结构 typedef struct treeNode {int value;struct treeNode* left;struct treeNode* right;treeNod…

【python】在pycharm用Django写一个API接口

背景 Django是一个高级的Python Web框架&#xff0c;它鼓励快速开发和干净、实用的设计。它由经验丰富的开发者设计&#xff0c;解决了Web开发的大部分麻烦&#xff0c;因此开发者可以专注于编写应用而不是重复造轮子。Django遵循MVC设计模式&#xff0c;并拥有自带的一套便捷…

Testng测试框架(2)-测试用例@Test

测试方法用 Test 进行注释&#xff0c;将类或方法标记为测试的一部分。 Test() public void aFastTest() {System.out.println("Fast test"); }import org.testng.annotations.Test;public class TestExample {Test(description "测试用例1")public void…

【Unity 实用工具篇】 | UIEffect 实现一系列UGUI特效,灰度、负片、像素化特效

前言 【Unity 实用工具篇】 | UIEffect 实现一系列UGUI特效&#xff0c;灰度、负片、像素化特效一、UGUI特效插件&#xff1a;UIEffect1.1 介绍1.2 效果展示1.3 使用说明及下载 二、组件属性面板三、代码操作组件四、组件常用方法示例4.1 使用灰度特效做头像(关卡)选择 总结 前…

C语言实现三子棋游戏(可以改变为四子棋或者多子棋版)

游戏介绍 三子棋游戏或者说是井字棋游戏&#xff0c;相信大家都玩过&#xff0c;一般的流程就是在一个棋盘上&#xff0c;玩家下棋之后&#xff0c;电脑下棋&#xff0c;然后判断输赢&#xff0c;如果没输没赢&#xff0c;就再玩家下棋&#xff0c;电脑下棋。 游戏框架 对于…

AI大模型探索之路-应用篇13:企业AI大模型选型指南

目录 前言 一、概述 二、有哪些主流模型&#xff1f; 三、模型参数怎么选&#xff1f; 四、参数有什么作用&#xff1f; 五、CPU和GPU怎么选&#xff1f; 六、GPU和显卡有什么关系&#xff1f; 七、GPU主流厂商有哪些&#xff1f; 1、NVIDIA芯片怎么选&#xff1f; 2、…

Web前端 Javascript笔记1

为什么学习 JavaScript? JavaScript 是 web 开发人员必须学习的 3 门语言中的一门&#xff1a; HTML 定义了网页的内容CSS 描述了网页的布局JavaScript 控制了网页的行为 JavaScript 是可插入 HTML 页面的编程代码。 JavaScript 插入 HTML 页面后&#xff0c;可由所有的现代浏…

FPGA原理与结构(8)——块RAM(Block RAM,BRAM)

系列文章目录&#xff1a;FPGA原理与结构&#xff08;0&#xff09;——目录与传送门 一、BRAM简介 大家对于RAM应该并不陌生&#xff0c;RAM就是一张可读可写的存储表&#xff0c;它经常被拿来与ROM进行对比&#xff0c;相比之下&#xff0c;ROM只可读。而在FPGA中&#xff0c…

图灵奖2023:Avi Wigderson的开创性贡献揭示计算中的随机性和伪随机性

文章目录 每日一句正能量前言背景什么是理论计算机科学&#xff1f;为什么随机性很重要&#xff1f;三篇影响深远的论文Avi Wigderson在计算复杂性理论方面的贡献及其对现代计算的影响Avi Wigderson对随机性和伪随机性在计算中作用的理解及其实际应用Avi Wigderson的学术生涯和…

用于密集视觉冲击的紧凑三维高斯散射Compact 3D Gaussian Splatting For Dense Visual SLAM

Compact 3D Gaussian Splatting For Dense Visual SLAM 用于密集视觉冲击的紧凑三维高斯散射 Tianchen Deng 邓天辰11Yaohui Chen 陈耀辉11Leyan Zhang 张乐妍11Jianfei Yang 杨健飞22Shenghai Yuan 圣海元22Danwei Wang 王丹伟22Weidong Chen 陈卫东11 Abstract 摘要 …

008、Python+fastapi,第一个后台管理项目走向第8步:ubutun 20.04下安装vscode+python环境配置

一、说明 白飘了3个月无影云电脑&#xff0c;开始选了个windows server 非常不好用&#xff0c;后台改为ubuntu想升级到22&#xff0c;没成功&#xff0c;那就20.04吧。 今天先安装下开发环境&#xff0c;后续2个月就想把他当做开发服务器&#xff0c;不知道行不行&#xff0c;…

行式存储VS列式存储对比

行式存储&#xff1a; 一行代表一个记录的所有字段。 可以快速读取和写入单条记录。 如果要检索一条数据&#xff0c;数据库会读取or写入整条记录&#xff0c;包含所有相关字段。 列式存储&#xff1a; 表中每一列的数据连续存放。这种方式在需要对某一列进行大量运算或分析时…

PSAvatar:一种基于点的可变形形状模型,用于3D高斯溅射的实时头部化身创建

PSAvatar: A Point-based Morphable Shape Model for Real-Time Head Avatar Creation with 3D Gaussian Splatting PSAvatar&#xff1a;一种基于点的可变形形状模型&#xff0c;用于3D高斯溅射的实时头部化身创建 Zhongyuan Zhao1,2, Zhenyu Bao1,2, Qing Li1, Guoping Qiu3,…