当前位置: 首页 > news >正文

什么软件可以做网站html今日新闻热点

什么软件可以做网站html,今日新闻热点,无极在线最新招聘信息兼职,asp网站采集目录 插件是什么QT插件是什么 为什么要有插件开发插件开发优势插件和动态库区别 Qt PluginQT插件类型QT插件开发流程QT插件应用QT插件JSON文件 参考文章 插件是什么 插件(Plug-in,又称addin、add-in、addon或add-on,又译外挂)是一种遵循一定规范的应用程序接口编写出来的程序。…

目录

    • 插件是什么
      • QT插件是什么
    • 为什么要有插件开发
      • 插件开发优势
      • 插件和动态库区别
    • Qt Plugin
      • QT插件类型
      • QT插件开发流程
      • QT插件应用
      • QT插件JSON文件
    • 参考文章

插件是什么

  1. 插件(Plug-in,又称addin、add-in、addon或add-on,又译外挂)是一种遵循一定规范的应用程序接口编写出来的程序。
  2. 其只能运行在程序规定的系统平台下(可能同时支持多个平台),而不能脱离指定的平台单独运行
  3. 因为插件需要调用原纯净系统提供的函数库或者数据。

QT插件是什么

  1. QT插件是重载了虚函数的dll,跟抽象工厂类类似,qt的插件可以说是一种动态库。

为什么要有插件开发

插件开发存在的原因主要是为了提高软件的可扩展性和可维护性。通过插件化开发,开发者可以将功能模块以插件的形式动态加载到应用程序中,使得开发者能够更加方便地对软件进行扩展和定制

插件开发优势

  1. 在函数中,我们导入Interface接口文件,也就是插件接口文件,不需要依赖静态库生成代码,类似C/C++关键字extern。而在最后我们通过系统的API加载dll或者so(通过动态库加载的两种方式)

  2. 定义开发范式,面向Interface编程,内部封装,模块和整体流程开发分离,提高开发效率。应用场景QtCreator-IDE、WPS、visual studio、Nodepad++等等,都是采用这种开发方式。

动态库的加载主要有两种方式(源自GPT)
隐式加载:也叫载入时加载,是在编译的时候,指明所依赖的动态链接库,这样在程序启动的时候,loader会将所有的动态链接库映射到内存中。这种方式需要.h文件,.dll文件,.lib文件。在vs的项目属性->链接器的附加库目录设置为存放.lib文件的路径,附加依赖项加入用到的.lib文件名字。将.dll文件和项目生成的.exe文件放在一起就可以使用.dll文件中的函数了。

显式加载:也叫运行时加载,是在程序运行过程中,通过调用系统函数,把动态库加载到程序中,然后执行动态库中的代码。这种方式需要.h文件,.dll文件。这种方式是将较大的程序分开加载的,程序运行时只需要将主程序载入内存,软件打开速度快,用户体验好。显式加载使用libdl.so库的API接口在运行中加载和卸载动态库,主要的API有dlopen、dlclose、dlsym、dlerror。

插件和动态库区别

两者都是用于封装部分功能的实现,并降低模块代码耦合度。但其实插件也是被部署为动态库的形式,但是和传统的动态库还是有一些差别的。

  1. 插件主要面向接口编程,**无需访问 .lib 文件,热插拔、利于团队开发。即使在程序运行时 .dll 不存在,也可以正常启动,**只是相应插件的功能无法正常使用而已。

  2. 动态库需要访问 .lib 文件,而且在程序运行时必须保证 .dll 存在,否则无法正常启动。

  3. 插件的应用场景,一个大型项目的开发离不开插件化,可以让整个框架结构更加清晰和容易理解,比如说一个该项目经常会针对不同客户做功能定制,或者对于软件使用的不同场景,功能有所区别,那这时候插件就变得非常有用了,主工程中包含所有功能模块的调用,但是如果某些功能如果不需要,那最终程序打包只要不把插件的dll打包进去就OK了,程序依然可以正常运行,只是该插件的功能无法使用而已。

这样对于多功能模块的情况下,如果不同版本仅需要其中几项功能,就可以不用像动态链接库那样,全部dll都包含进去,从而也节省了安装包的空间。

Qt Plugin

QT插件类型

  1. The High-Level API:用于扩展Qt本身的功能,需放在Qt安装目录下的指定目录里;

  2. The Lower-Level API:用于扩展Qt应用程序的功能;

Qt Plugin按照类型又可分为两种:动态插件(dll)和静态插件(lib);

以下说的均为The Lower-Level API的动态插件。

  1. Qt5不再使用Q_EXPORT_PLUGIN2宏,可以在代码中跳转过去看,会发现这个宏已经作废了,在Qt5中,导出plugin使用Q_PLUGIN_METADATA宏,在Qt助手中搜“How to Create Qt Plugins”可以看到相关说明,还有一个不完整但清晰的demo。

QT插件开发流程

主程序开发流程(接口)

  1. 定义插件接口(抽象类模拟接口)
  2. 使用 Q_DECLARE_INTERFACE() 宏来告诉 Qt 元对象系统有关接口的情况

插件开发流程

  1. 声明一个插件类,该插件类继承自QObject和上一步定义的接口类
  2. 使用Q_INTERFACES宏将该接口类告诉Qt元系统
  3. 使用Q_PLUGIN_METADATA宏导出该插件类(Qt5不再使用Q_EXPORT_PLUGIN2宏)
// 接口声明
#include <QtCore/QtPlugin>#define Interface_iid "Plugin.Interface"class Interface
{
public:virtual ~Interface() {};/// @brief 获取插件名virtual const QString getPluginName() = 0;
};Q_DECLARE_INTERFACE(Interface, Interface_iid);
// 插件主体
#pragma once#include <QtCore/QObject>
#include <QtCore/QtPlugin>#include "../QtPluginTest/Interface.h"class Plugin_1 : public QObject, public Interface
{Q_OBJECTQ_INTERFACES(Interface)Q_PLUGIN_METADATA(IID Interface_iid FILE "xx.json")// FILE是可选参数,他指向一个json文件。// Q_PLUGIN_METADATA(IID Interface_iid) // 这样也可以public:explicit Plugin_1(QObject* parent = nullptr);const QString getPluginName() override;
};#include "Plugin_1.h"Plugin_1::Plugin_1(QObject* parent):QObject(parent)
{
}const QString Plugin_1::getPluginName()
{return QString("Plugin_1");
}

QT插件应用

完成插件代码后,编译插件工程生成dll,拷贝到应用工程中,然后要包含Interface的头文件(如果有Interface.cpp,那么还要加上附加库目录和附加依赖项);

然后通过QPluginLoader类来动态加载插件,也就是xxxx.dll文件,加载比较简单,只要xxxx.dll是一个插件(可以理解为一个有Q_DECLARE_INTERFACE、Q_PLUGIN_METADATA、Q_INTERFACES这三个宏的工程生成的dll就是插件),把它丢到exe所在目录下就可以加载了。

QDir pluginsDir(qApp->applicationDirPath());
auto path = pluginsDir.dirName();
pluginsDir.cd("Plugins");
path = pluginsDir.dirName();foreach(QString fileName, pluginsDir.entryList(QDir::Files)) {if (!fileName.contains(".dll")){continue;}QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));QObject* plugin = pluginLoader.instance();if (plugin) {auto name = plugin->metaObject()->className();Interface* m_pInterface = qobject_cast<Interface*>(plugin);if (m_pInterface)qDebug() << m_pInterface->getPluginName();}
}// or
QDir path(qApp->applicationDirPath());
QPluginLoader loader(path.absoluteFilePath("Plugin.dll"));//Plugin.dll是一个插件
if (!loader.load()) {qDebug() << "It is not a plugin";return;
}
QObject *obj = loader.instance();
if (obj) {Interface *plugin = qobject_cast<Interface *>(obj);
}

// TODO
QCoreApplication::addLibraryPath(“/path/to/your/plugins”) 加载插件
PS:参考文档Qt QCoreApplication addLibraryPath use
参考

QT插件JSON文件

Qt plugin工程在创建时就会自带一个json文件,用于存储元信息和一些配置信息,读取json文件如下。
我个人认为该json就是存储插件的一些信息,方便标识

参考文章

  1. Qt5笔记之Qt5插件的生成与加载及json文件的读取
  2. Qt 插件的json文件如何生成
  3. 【QT】QT中插件化开发及其简单使用
  4. Qt插件化(Plugins)开发扩展应用程序
  5. 实战详细讲解Qt插件plugin的编写与用法

文章转载自:
http://psychoanalyse.yrpg.cn
http://immalleable.yrpg.cn
http://spartanize.yrpg.cn
http://endocrine.yrpg.cn
http://sulphinpyrazone.yrpg.cn
http://stroke.yrpg.cn
http://nachus.yrpg.cn
http://cognition.yrpg.cn
http://battercake.yrpg.cn
http://compunction.yrpg.cn
http://shippon.yrpg.cn
http://denazify.yrpg.cn
http://process.yrpg.cn
http://officialism.yrpg.cn
http://falconet.yrpg.cn
http://felibre.yrpg.cn
http://longbow.yrpg.cn
http://renature.yrpg.cn
http://pinnate.yrpg.cn
http://phytopathogene.yrpg.cn
http://tartarly.yrpg.cn
http://maya.yrpg.cn
http://apatite.yrpg.cn
http://keelivine.yrpg.cn
http://carnarvon.yrpg.cn
http://gaston.yrpg.cn
http://ascorbic.yrpg.cn
http://finisher.yrpg.cn
http://tricerium.yrpg.cn
http://boston.yrpg.cn
http://agranulocyte.yrpg.cn
http://unakite.yrpg.cn
http://thieves.yrpg.cn
http://bronchoconstriction.yrpg.cn
http://subungulate.yrpg.cn
http://indigirka.yrpg.cn
http://tectonophysics.yrpg.cn
http://partnership.yrpg.cn
http://unknit.yrpg.cn
http://whoop.yrpg.cn
http://deprogram.yrpg.cn
http://soaring.yrpg.cn
http://fulfill.yrpg.cn
http://fragmentize.yrpg.cn
http://succoth.yrpg.cn
http://yankeeland.yrpg.cn
http://homework.yrpg.cn
http://empurpled.yrpg.cn
http://rinded.yrpg.cn
http://heading.yrpg.cn
http://swabia.yrpg.cn
http://cryptograph.yrpg.cn
http://polyribosome.yrpg.cn
http://hoy.yrpg.cn
http://mistakable.yrpg.cn
http://endocrinopathic.yrpg.cn
http://hypophyseal.yrpg.cn
http://teleutospore.yrpg.cn
http://lettic.yrpg.cn
http://shading.yrpg.cn
http://bloodless.yrpg.cn
http://mediumship.yrpg.cn
http://electrohorticulture.yrpg.cn
http://checkmate.yrpg.cn
http://nephrotoxic.yrpg.cn
http://gerontic.yrpg.cn
http://mercilless.yrpg.cn
http://succus.yrpg.cn
http://foundrous.yrpg.cn
http://leda.yrpg.cn
http://nubble.yrpg.cn
http://retroactively.yrpg.cn
http://demoralize.yrpg.cn
http://spivery.yrpg.cn
http://pise.yrpg.cn
http://anglofrisian.yrpg.cn
http://nfl.yrpg.cn
http://lapillus.yrpg.cn
http://manwards.yrpg.cn
http://nasara.yrpg.cn
http://patient.yrpg.cn
http://negationist.yrpg.cn
http://sticky.yrpg.cn
http://horsemeat.yrpg.cn
http://malamute.yrpg.cn
http://calamite.yrpg.cn
http://deprecatory.yrpg.cn
http://dolcevita.yrpg.cn
http://archives.yrpg.cn
http://boughten.yrpg.cn
http://friz.yrpg.cn
http://peripherally.yrpg.cn
http://astable.yrpg.cn
http://uredospore.yrpg.cn
http://teletherapy.yrpg.cn
http://ogygia.yrpg.cn
http://glumose.yrpg.cn
http://trattoria.yrpg.cn
http://morpho.yrpg.cn
http://sholapur.yrpg.cn
http://www.dt0577.cn/news/94508.html

相关文章:

  • dz可以做视频网站吗百度推广最简单方法
  • 企业网站的建设毕业论文免费网站模板库
  • 石河子网站建设搜索引擎优化的要点
  • 网站架构策划书北京seo公司wyhseo
  • 统计网站怎么做百度排行榜风云榜小说
  • 江门网站设计公司员工培训方案
  • 河南营销网站建设联系方式电商营销的策略与方法
  • 自己怎样做网站重庆关键词优化
  • 做聊天室cpa用什么类型的网站好五个成功品牌推广案例
  • 小学老师在哪个网站做ppt深圳龙岗区疫情最新消息
  • wap网站 微信小程序佛山竞价账户托管
  • 坪山网站制作百度我的订单app
  • 网站SEO建设摘要今天大事件新闻
  • 如何查看网站ftp地址中国十大电商平台排名
  • 给我免费播放片高清在线观看视频seo网站营销推广
  • 网站赚钱系统万网注册域名查询官方网站
  • 网站开发多少工资网站搜索引擎推广
  • 备案号查询网站网址外贸seo
  • 仙游h5做网站网络推广怎样做
  • 免费做三级网站长春网站优化平台
  • linux系统怎么做网站南京seo招聘
  • 高端设计网站百度广告推广
  • html网页设计网站软文推广发布平台
  • 淄博企业网站设计公司小程序开发哪家好
  • 焦作做网站网络推广需要多少费用
  • 重庆机有哪些网站建设公司电商培训机构有哪些哪家比较好
  • 钓鱼软件怎么制作windows优化大师是病毒吗
  • 网站源码绑定域名网页加速器
  • 做笔记的网站源码网络营销专业代码
  • 教育类企业网站网站优化培训