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_OBJECT
       Q_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()

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

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

相关文章

深度数据恢复,3个有效方法要掌握!

“我在电脑里保存了部分很重要的数据&#xff0c;但是不知道怎么就误删了它们&#xff0c;大家有什么比较简单的操作可以恢复这些被深度删除的数据吗&#xff1f;” 在数字化时代&#xff0c;我们的生活与工作已与数据紧密相连&#xff0c;这给我们带来了很多的便利。但不可否认…

Queue接口分析

一、Queue是什么 该接口是Java集合框架成员 Queue&#xff1a; 通常&#xff08;但不一定&#xff09;队列就是一个先入先出&#xff08;FIFO&#xff09;的数据结构&#xff0c;和堆一样&#xff08;但可以进行转换&#xff0c;比如优先级列队排序&#xff0c;又或者改为栈形…

功能分享【电商API接口】:商品采集正确使用方法!

相信很多做过电商的人&#xff0c;曾经有在淘宝、京东、天猫、拼多多、1688等平台上卖过自己的产品&#xff0c;但是每换一个平台&#xff0c;商品要重新上传&#xff0c;这浪费了很多没有必要的时间。 为此我们开发了商品采集API功能&#xff0c;一键完成上架商品&#xff0c…

代码随想录第五十天——买卖股票的最佳时机|||,买卖股票的最佳时机IV

leetcode 123. 买卖股票的最佳时机||| 题目链接&#xff1a;买卖股票的最佳时机||| 本题关键在于至多买两次&#xff0c;代表可以买卖0&#xff0c;1&#xff0c;2次。 确定dp数组以及下标的含义 一天一共可以有五个状态&#xff1a; 0.没有操作 &#xff08;可以不设置这个状…

云计算任务调度仿真02

前面已经分享过一个仿真项目&#xff0c;但是基于policy gradient方法实现的&#xff0c;考虑到许多人从零到一实现DQN方法有点难度&#xff0c;所以这次分享一个基于DQN实现的仿真项目&#xff0c;非常简单。 这里之所以简单主要得益于它是用pytorch实现的&#xff0c;而pyto…

Prometheus监控遇上报错invalid is not a valid start token

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 问题描述&#xff1a; 使用prometheus采集java应用的metric指标数据&#xff0c;在prometheus界面pod状态为down&#xff0c;报…

clickhouse常规的优化方法

一、建表优化 1.1日期字段避免使用String存储 建表时能用数值型或日期时间型表示的字段就不要用字符串&#xff0c;全String 类型在以Hive 为中心的数仓建设中常见&#xff0c;但ClickHouse 环境不应受此影响。 虽然ClickHouse 底层将DateTime 存储为时间戳Long 类型&#xf…

063:vue中一维数组与三维数组联动,类似购物车增减

第063个 查看专栏目录: VUE ------ element UI javascript 一维数组与三维数组联动,一维数组转换为三为数组,源文件下载 .zip 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安…

熟悉HDFS常用操作

1. 利用Hadoop提供的Shell命令完成下列任务 (1)向HDFS中上传任意文本文件,如果指定的文件在HDFS中已经存在,由用户指定是追加到原有文件末尾还是覆盖原有的文件。 #检查文件是否存在./bin/hdfs dfs -test -e text.txt echo $? #结果是1 代表已存在 #根据结果判断出文件已存…

[ 机器学习 ] 关于Jupyter Notebook中pytorch模块import失败的问题

0x01、问题描述 在使用WSL搭建Jupyter进行代码测试的时候 发现Miniconda&#xff08;虚拟环境均适用&#xff09;中安装的pytorch在Jupyter里面import失败 但在python解释器的命令模式里可以测试import成功 并且torch.cuda_available()打印True 以前用的是IDEA没怎么用Jup…

Python学习笔记-使用Anaconda+VSCode配置开发环境

文章目录 概述一、安装Anaconda1.1 下载软件1.2 安装anaconda1.3 配置环境 二、配置虚拟环境2.1 使用conda创建一个新的虚拟环境2.1.1 使用search指令查看支持的python的版本&#xff1a;2.1.2 使用create创建指定版本的虚拟环境&#xff1a;2.1.3 使用env list查看虚拟环境列表…

文件夹重命名技巧:如何通过重命名解决文件夹名混乱不规律的问题

在日常生活和工作中&#xff0c;我们经常需要管理大量的文件夹&#xff0c;整理文档、图片等其他类型的文件。随着时间的推移&#xff0c;文件夹名可能会变得混乱和不规律&#xff0c;导致查找和管理变得困难。现在一起来看云炫文件管理器如何让文件名变简洁的操作方法吧。 下…

【2024最新-python3小白零基础入门】No1.python简介以及环境搭建

文章目录 一 python3 简介二 python语言的特点三 python安装四 安装开发工具-pycharm五 新建一个python项目1.新建项目2 配置虚拟环境3 运行项目 一 python3 简介 Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性&a…

Js-基础语法(二)

运算符 赋值运算符 赋值运算符&#xff1a;对变量进行赋值的运算符 已经学过的赋值运算符&#xff1a; 将等号右边的值赋予给左边, 要求左边必须是一个容器 其他赋值运算符&#xff1a; - */% 使用这些运算符可以在对变量赋值时进行快速操作 一元运算符 众多的 JavaScrip…

使用Linux防火墙管理HTTP流量

在Linux系统中&#xff0c;防火墙是用于控制网络流量的重要工具。通过防火墙&#xff0c;你可以根据需要限制、过滤或允许特定的网络流量&#xff0c;从而提高系统的安全性。在处理HTTP流量时&#xff0c;防火墙可以帮助你实施访问控制、流量监控和其他安全策略。 iptables i…

CSS3新增边框样式

边框样式 概念:在CSS3中&#xff0c;针对元素边框增加了丰富的修饰属性。 常见的边框样式属性有以下 属性说明border-radius圆角效果box-shadow边框阴影border-image边框背景 border-radius属性 概念&#xff1a;border-radius属性可以为元素添加圆角效果 语法&#xff1…

新书速览|循序渐进Vue.js 3.x前端开发实战

Vue.js初学者和前端开发人员使用&#xff0c;网课、培训机构与大中专院校的教学用书 作者简介 张益珲 美国亚利桑那州立大学计算机工程技术硕士&#xff0c;架构师&#xff0c;从业近10年&#xff0c;多年大前端开发经验&#xff0c;曾就职于知名上市公司&#xff0c;主导开发…

Java项目:115SSM宿舍管理系统

博主主页&#xff1a;Java旅途 简介&#xff1a;分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 宿舍管理系统基于SpringSpringMVCMybatis开发&#xff0c;系统主要功能如下&#xff1a; 学生管理班级管理宿舍管理卫生管理维修登记访客管理 二、技术框…

MyBatis:自定义 typeHandler 处理枚举类型

MyBatis 枚举类型typeHandler 枚举类型 枚举类型&#xff0c;在 Java 中属于基本数据类型&#xff0c;而不是构造数据类型&#xff0c;用于声明一组命名的常数。枚举可以根据 Integer 、Long 、Short 或 Byte 中的任意一种数据类型来创建一种新型变量。这种变量可以设置为已经…

C++ std::move std::forward

std::move 统统转换为&& 右值引用。 std::foreward 有条件的转换。 左值转换为左值引用&#xff0c;右值转换为右值引用。