【Qt】QPluginLoader 类学习
文章目录
- 一、简介
- 二、常用方法
- 2.1 构造函数
- 2.2 动态加载方法——load()
- 2.3 检查是否加载成功——isLoaded()
- 2.4 访问插件中的根组件——instance()
- 2.5 卸载插件——unload()
一、简介
QPluginLoader 类在运行时加载插件。
QPluginLoader 提供对Qt插件的访问。Qt插件存储在共享库(如 DLL 文件)中,相比于 QLibrary访问的共享库, QPluginLoader 具有以下优点:
QPluginLoader会检查插件是否与应用程序使用的Qt版本一致;QPluginLoader提供对根组件对象 (instance())的直接访问,而无需动手解析C函数。
QPluginLoader对象的实例操作单个共享库文件,这个共享库文件被称为插件。它以独立于平台的方式提供对插件中功能的访问。要指定要加载的插件,请在构造函数中传递文件名,或者使用setFileName()方法进行设置。
使用
QPluginLoader类一旦加载成功,插件会保留在内存中,直到所有QPluginLoader实例都被卸载,或者直到应用程序终止。可以使用多个unload()卸载插件,但如果其它QPluginLoader实例仍在使用相同的库,则调用将失败,卸载仅在所有实例都调用了unload()后才会发生。在卸载之前,根组件也将被删除。
注意:
请注意,如果您的应用程序是静态链接 Qt 的,则不能使用 QPluginLoader。在这种情况下,您还需要静态链接插件。如果需要在静态链接的应用程序中加载动态库,可以使用 QLibrary。
二、常用方法
2.1 构造函数
原型:
QPluginLoader::QPluginLoader(const QString &fileName, QObject *parent = Q_NULLPTR)
解释:
使用给定的父级构造一个插件加载器,该加载器将加载fileName指定的插件。
为了可加载,文件的后缀必须是符合平台的可加载库的有效后缀,例如Unix上的
.so,macOS和iOS上的.dylib,以及Windows上的.dll。后缀可以通过QLibrary::isLibrary()进行验证。
注:parent是可选的。
2.2 动态加载方法——load()
原型:
bool QPluginLoader::load()
解释:
作用:动态加载插件。
如果插件加载成功,则返回true,否则返回false。由于instance()总是在解析任何符号之前调用此函数,因此没有必要显示地调用它。在某些情况下,我们可能希望提前加载插件,此时则可以使用该方法。
2.3 检查是否加载成功——isLoaded()
原型:
bool QPluginLoader::isLoaded() const
解释:
如果插件已加载,则返回true,否则返回false。
2.4 访问插件中的根组件——instance()
原型:
QObject *QPluginLoader::instance()
解释:
返回插件的根组件对象,必要时加载插件。如果无法加载插件或无法实例化根组件对象,则函数返回 0 。
如果根组件被销毁,调用此函数将创建一个新实例。
当QPluginLoader被销毁时,此函数返回的根组件不会被删除。如果你想确保根组件被删除,你应该在不需要再访问核心组件是调用unload()。当库最终卸载时,根组件将自动删除。
组件对象时QObject。使用qobject_cast()访问你感兴趣的接口。
2.5 卸载插件——unload()
原型:
bool QPluginLoader::load()
解释:
如果可以卸载插件,则卸载插件并返回true;否则返回false。
在应用程序终止时,会自动卸载插件,因此通常不需要调用此函数。
如果 QPluginLoader 的其它实例正在使用相同的插件,则调用将失败,并且只有在每个实例都调用了unload()时才会进行卸载。
注: 不要手动删除根组件对象,而是依赖于unload()方法来自动删除它。因为手动删除根组件对象可能会引起内存管理问题,比如访问已删除对象的错误或资源泄露。
错误举例 (手动删除根组件,会导致未定义行为):
#include <QPluginLoader>
#include <QObject>class MyPluginComponent : public QObject {Q_OBJECT
public:MyPluginComponent() {}~MyPluginComponent() {}void doSomething() {}
};int main() {QPluginLoader loader("MyPlugin.dll");QObject *rootComponent = loader.instance();if (rootComponent) {// 错误的手动删除根组件delete rootComponent; // 这里手动删除了根组件对象// 尝试再次使用 rootComponent,会导致未定义行为MyPluginComponent *myComponent = qobject_cast<MyPluginComponent *>(rootComponent);if (myComponent) {myComponent->doSomething(); // 这里会访问已被删除的对象,导致崩溃或未定义行为}}// 即使调用 unload(),根组件已经被手动删除,可能会导致内存错误loader.unload(); // 此时 unload() 不能正确处理已删除的对象return 0;
}
相关文章:
【Qt】QPluginLoader 类学习
文章目录 一、简介二、常用方法2.1 构造函数2.2 动态加载方法——load()2.3 检查是否加载成功——isLoaded()2.4 访问插件中的根组件——instance()2.5 卸载插件——unload() 一、简介 QPluginLoader 类在运行时加载插件。 QPluginLoader 提供对Qt插件的访问。Qt插件存储在共享…...
DataGear 企业版 1.2.0 发布,数据可视化分析平台
DataGear 企业版 1.2.0 已发布,欢迎体验! http://datagear.tech/pro/ 企业版 1.2.0 修复严重漏洞,新增文件源管理模块,新增JWT统一登录支持,MQTT数据集主题支持通配符,具体更新内容如下: 新增…...
为啥https比http慢
Https有ssl的握手 HTTP没有 HTTPS TCP 和HTTP 的TCP 时间差不是很大 HTTPS请求中,ssl所占的时间比例是请求时间总和93.37%, HTTPS请求中,ssl的请求会是tcp请求的14倍,而HTTP中没有这个问题 建议:对安全要求不是很高的,不要使用https请求 图例...
软件测试需要具备的基础知识【功能测试】---后端知识(三)
您好,我是程序员小羊! 前言 为了更好的学习软件测试的相关技能,需要具备一定的基础知识。需要学习的基础知识包括: 1、计算机基础 2、前端知识 3、后端知识 4、软件测试理论 后期分四篇文章进行编写,这是第三篇 …...
详解 Redis 队列 实现
Redis 是一个高性能的键值存储系统,它的多种数据结构使其能够以不同方式实现队列,包括普通队列、延时队列和异步队列的介绍和示例。 介绍 Redis 的 List 数据结构可以用来实现普通的队列。 生产者使用 LPUSH 或 RPUSH 命令将消息添加到列表的头部或尾部…...
分析SQL的count(*)并优化
最近优化过几个慢查询接口的性能,总结了一些心得体会拿出来跟大家一起分享一下,希望对你会有所帮助。 我们使用的数据库是Mysql8,使用的存储引擎是Innodb。这次优化除了优化索引之外,更多的是在优化count(*)。 通常情况下&#…...
Java学习日记(day18)
一、软件的结构 C/S (Client - Server 客户端-服务器端) 典型应用:QQ软件 ,飞秋,印象笔记。 特点: 必须下载特定的客户端程序。服务器端升级,客户端升级。 B/S (Broswer -Server 浏览器端- 服务器端&a…...
Oracle(61)什么是外部表(External Table)?
外部表(External Table)是Oracle数据库中的一种特殊表类型,用于访问存储在外部文件系统中的数据,而不需要将数据实际加载到数据库内部。外部表的主要优势在于允许数据库用户在不移动或复制数据的情况下,直接查询和处理…...
物联网HMI/网关搭载ARM+CODESYS实现软PLC+HMI一体化
物联网HMI/网关搭载CODESYS实现软PLCHMI一体化 硬件:ARM平台,支持STM32/全志T3/RK3568/树莓派等平台 软件:CODESYS V3.5、JMobile Studio CODESYS是一款功能强大的PLC软件编程工具,它支持IEC61131-3标准IL、ST、FBD、LD、CFC、…...
Java中Stream流
Java中Stream流 Stream 使用flatMap处理嵌套集合: 有一个对象列表,每个对象又包含一个列表,可以使用flatMap来“展平”这个结构。 List<List<String>> listOfLists Arrays.asList(Arrays.asList("a", "b"),Arrays.a…...
纯css实现多行文本右下角最后一行展示全部按钮
未展开全部: 展开全部: 综上演示按钮始终保持在最下方 css代码如下: <div class"info-content"><div class"info-text" :class"!showAll ? mle-hidden : "><span class"show-all"…...
WPF篇(17)-ListBox列表控件+ListView数据列表控件
ListBox列表控件 ListBox是一个列表控件,用于显示条目类的数据,默认每行只能显示一个内容项,当然,我们可以通过修改它的数据模板,来自定义每一行(元素)的数据外观,达到显示更多数据…...
HAProxy 全解析:驾驭网络负载均衡与高可用的强大引擎
一、什么是HAproxy HAProxy是一个免费、开源的高性能TCP/HTTP负载均衡器和代理服务器软件,主要用于实现以下功能 一、负载均衡 多种负载均衡算法支持: 轮询(Round Robin):它依次将请求均匀分配到后端的各个服务器。例…...
陶瓷材质的防静电架空地板越来越受欢迎的原因
目前市面上的陶瓷防静电架空地板主要分为两种:钢基和硫酸钙基。前者是以全钢冲孔裸板作为板基,经粘接、固定整型和灌浆的方式加工而成,后者是以复合硫酸钙板为基材,表面粘接防静电陶瓷砖,四周导电PVC边条封边。近年来陶…...
Mariadb数据库本机无密码登录的问题解决
Mariadb数据库本机无密码登录的问题解决 安装了mariadb后,发现Mariadb本机无密码才能登录 百度了很多文章,发现很多人是因为root的plugin设置的值不正确导致的,unix_socket可以不需要密码,mysql_native_password 是正常的。 解…...
校园外卖平台小程序的设计
管理员账户功能包括:系统首页,个人中心,用户管理,商家管理,菜品信息管理,菜品分类管理,购买菜品管理,订单信息管理,系统管理 微信端账号功能包括:系统首页&a…...
Python3 第八十一课 -- urllib
目录 一. 前言 二. urllib.request 三. urllib.error 四. urllib.parse 五. urllib.robotparser 一. 前言 Python urllib 库用于操作网页 URL,并对网页的内容进行抓取处理。 本文主要介绍 Python3 的 urllib。 urllib 包 包含以下几个模块: url…...
Vue 3+Vite+Eectron从入门到实战系列之(五)一后台管理登录页
前面已经讲了不少基础知识,这篇开始,我们进行实操,做个后台管理系统,打包成多端的,可安装的桌面app!!其中,登录,退出的提示信息用系统的提示,不使用elemengplus的弹窗提示!ÿ…...
Docker 网络代理配置及防火墙设置指南
Docker 网络代理配置及防火墙设置指南 背景 在某些环境中,服务器无法直接访问外网,需要通过网络代理进行连接。虽然我们通常会在 /etc/environment 或 /etc/profile 等系统配置文件中直接配置代理,但 Docker 命令无法使用这些配置。例如&am…...
基于PostGIS(Postgres)+Node.js实现的xyz瓦片地图服务器
背景介绍 前两天研究GeoServer发布存储在PostGIS中栅格数据,最终目的是想在PostGIS中存储金字塔瓦片,用GeoServer发布,但是最后经过研究不改GeoServer源码的情况下,好像只支持将大图tif存在PostGIS数据库中进行发布,金…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
