【Qt】QPluginLoader 类学习

devtools/2024/9/25 11:10:13/

文章目录

  • 一、简介
  • 二、常用方法
    • 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;
}

http://www.ppmy.cn/devtools/94529.html

相关文章

计算机网络中点到点与端到端协议的区别

计算机网络中的点到点协议和端到端协议的主要区别在于它们的服务层次、‌通信方式、‌可靠性和资源利用方面。‌ 服务层次和通信方式&#xff1a;‌点到点通信主要发生在物理层、‌数据链路层和网络层&#xff0c;‌它直接连接的两个节点之间的通信&#xff0c;‌不涉及程序或…

CentOS7下载与安装 即配置网卡

CentOS7是基于RHEL的企业级Linux操作系统&#xff0c;引入了Systemd、XFS文件系统和Docker支持。它提供了新的软件包、工具和性能调优选项&#xff0c;同时加强了系统安全和稳定性。总的来说&#xff0c;CentOS7是一个稳定、安全、长期支持的操作系统&#xff0c;适用于企业和个…

【Unity打包Android】Gradle报错,Deprecated Gradle features were used in this build ···

Unity 2020.3.41f1c1 打包Android 加入Google Admob广告SDK后&#xff0c;打包Android失败&#xff0c;具体报错如下&#xff1a; 报错1&#xff1a; Starting a Gradle Daemon, 2 stopped Daemons could not be reused, use --status for details> Configure project :l…

微信小程序预览PDF、H5预览PDF、网页预览PDF,并添加专属文字水印

下载PDF.js 点击PDF.js下载地址 引入预览PDF 文件 // const url new URL("./1.pdf", import.meta.url).href // 在本地项目获取pdf // const url "https://xxxx/05d833041f.pdf" // 在线上链接获取pdf const url query.get(url) // 在地址栏获取pdf c…

无人机之飞行过程天气影响篇

在无人机飞行中&#xff0c;风速、雨雪等天气条件是飞手必须考虑的重要因素。这些天气条件不仅会影响飞行的稳定性&#xff0c;还可能带来安全隐患。以下是风速及雨雪对无人机飞行的影响&#xff0c;以及飞行中的注意事项&#xff1a; 一、风速对无人机飞行的影响 风力较大时&…

OSPF进阶

一、LSA详解 Type&#xff1a;LSA的类型&#xff08;1、2、3、4、5、7类&#xff09; link-state-ID&#xff1a;链路状态表示符 ADV router&#xff1a;产生该LSA的路由器 age&#xff1a;老化时间 Metric&#xff1a;开销值&#xff0c;一般都为ADV router到达该路由的开…

C语言实现排序之快速排序算法

一、快速排序讲解 基本思想 快速排序的核心在于选择一个“基准”元素&#xff0c;然后通过一系列操作将数据分为两部分&#xff0c;使得一部分的所有元素都比另一部分的元素小。具体来说&#xff0c;选择一个基准元素后&#xff0c;所有比基准小的元素都会被移动到基准的左边&…

Ubuntu系统的基础操作和使用|Linux|安装|网络连接|更新与升级系统|系统维护|故障排除|监控|桌面环境|虚拟机|快捷键

目录 1. Ubuntu系统的安装与初步设置 1.1 下载与安装Ubuntu 1.2 创建用户和设置密码 1.3 配置网络连接 1.4 更新与升级系统 2. Ubuntu的基本操作 2.1 文件与目录管理 2.2 系统进程管理 2.3 软件安装与管理 2.4 权限与用户管理 3. 系统维护与故障排除 3.1 系统日志查…