【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数据库中进行发布,金…...
CODE-II:百万级心电图AI评估基准与深度学习模型实践
1. 项目概述:当心电图遇上AI,我们如何量化“看懂”的能力?心电图,这个在临床诊断中司空见惯的波形图,背后是心脏每一次搏动的电生理活动记录。医生们通过识别P波、QRS波群、T波的形态、间期和节律,来判断心…...
5分钟快速部署WebRTC Camera到Home Assistant:终极低延迟监控方案
5分钟快速部署WebRTC Camera到Home Assistant:终极低延迟监控方案 【免费下载链接】WebRTC Home Assistant custom component for real-time viewing of almost any camera stream using WebRTC and other technologies. 项目地址: https://gitcode.com/gh_mirror…...
知识图谱与量化LLM协同架构解析与应用
1. 知识图谱与量化LLM协同架构解析在自然语言处理领域,知识图谱(KG)与大型语言模型(LLM)的协同正展现出独特价值。这种架构的核心在于发挥两者的互补优势:KG提供结构化、可验证的语义网络,而LLM…...
K8s原生ML编排进入“编译期优化”时代(SITS 2026首次披露:eBPF驱动的模型感知调度器Alpha版已交付头部5家云厂商)
更多请点击: https://intelliparadigm.com 第一章:AI原生Kubernetes编排:SITS 2026 K8s for ML工作负载 SITS 2026 引入了专为机器学习工作负载深度优化的 AI-native Kubernetes 编排层,突破传统 K8s 在资源弹性、异构设备调度与…...
当三维基因组“打结”:从罕见病到癌症,那些被折叠改变的生命密码
当三维基因组“打结”:从罕见病到癌症,那些被折叠改变的生命密码 想象一下,如果把人类基因组比作一条长达两米的毛线,它需要被精巧地折叠进直径仅几微米的细胞核中。这种看似不可能的折叠并非随机——它遵循着严格的拓扑规则&…...
5步精通:Windows风扇智能控制终极指南
5步精通:Windows风扇智能控制终极指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/FanControl.Rel…...
Claude Code项目配置终极指南
Claude Code 项目深度配置指南:从零初始化到现有项目完美改造 在上一篇基础教程中,我们了解了Claude Code CLI的基本使用方法。但要真正发挥Claude Code的全部潜力,项目级别的深度配置才是关键。Claude Code提供了一套完整的配置体系…...
逆向工程师的视角:如何用Windbg双机调试分析一个未知Windows驱动(实战案例解析)
逆向工程师的视角:如何用Windbg双机调试分析未知Windows驱动 在安全研究和恶意代码分析领域,逆向工程师常常需要面对未知的Windows驱动程序。这些驱动可能是第三方闭源组件,也可能是潜在的恶意软件载体。与传统的驱动开发调试不同,…...
从IR2184到全桥驱动:搞懂H桥电路防短路与死区设置(附电路图分析)
从IR2184到全桥驱动:H桥电路防短路与死区设置的工程实践 在电机控制系统中,H桥电路的设计可靠性直接决定了整个驱动方案的成败。许多工程师在初次设计基于IR2184的全桥驱动时,往往会被"上下桥臂直通"问题困扰——这种短路状态能在微…...
Mysql 8.0 密码重置新思路:当传统跳过命令失效时,如何从零重建服务与数据目录
1. 当传统密码跳过命令失效时,我们遇到了什么? 最近在帮朋友处理MySQL 8.0的密码重置问题时,遇到了一个棘手的情况:按照网上流传的经典方法mysqld --skip-grant-tables完全不起作用。更糟糕的是,系统里连data目录和my.…...
