QPluginLoader 类
QPluginLoader 类在运行时加载插件。 更多...
头文件 | #include <QPluginLoader> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake | QT += core |
继承 | QObject |
- 包含所有成员列表,包括继承的成员
- QPluginLoader 是 插件类 的一部分。
注意: 此类中所有函数均为可重入的。
属性
公共函数
QPluginLoader(QObject *parent = nullptr) | |
QPluginLoader(const QString &fileName, QObject *parent = nullptr) | |
virtual | ~QPluginLoader() |
QString | errorString() const |
QString | fileName() const |
QObject * | instance() |
bool | isLoaded() const |
bool | load() |
QLibrary::LoadHints | loadHints() const |
QJsonObject | metaData() const |
void | setFileName(const QString &fileName) |
void | setLoadHints(QLibrary::LoadHints loadHints) |
bool | unload() |
静态公共成员
QObjectList | staticInstances() |
QList<QStaticPlugin> | staticPlugins() |
相关非成员
void | qRegisterStaticPluginFunction(QStaticPlugin plugin) |
详细说明
QPluginLoader 提供对Qt 插件的访问。Qt 插件存储在共享库(DLL)中,并提供了比使用 QLibrary 访问的共享库更多的好处
- QPluginLoader 检查插件是否链接到与应用程序相同的 Qt 版本。
- QPluginLoader 为根组件对象(instance())提供直接访问,而不是强迫您手动解析 C 函数。
QPluginLoader 对象的一个实例操作单个共享库文件,我们称之为插件。它以平台无关的方式提供对插件功能的使用。要指定加载哪个插件,可以在构造函数中传递一个文件名,或者使用 setFileName() 来设置。
最重要的函数是 load() 用于动态加载插件文件,isLoaded() 用于检查加载是否成功,以及 instance() 用于访问插件中的根组件。如果插件尚未加载,则instance() 函数将尝试加载插件。可以使用多个 QPluginLoader 实例访问相同的物理插件。
一旦加载,插件将保留在内存中,直到所有 QPluginLoader 实例被卸载,或者应用终止。可以使用 unload() 尝试卸载插件,但如果 QPluginLoader 的其他实例正在使用相同的库,调用将失败,并且只有当每个实例都调用 unload() 时才会发生卸载。在即将卸载之前,根组件也将被删除。
有关如何通过插件使应用程序可扩展的更多信息,请参阅 如何创建 Qt 插件。
请注意,如果你的应用程序是静态链接到 Qt 的,则无法使用 QPluginLoader。在这种情况下,你也需要静态链接插件。如果你需要在静态链接的应用程序中加载动态库,可以使用 QLibrary。
另请参阅 QLibrary。
属性文档
fileName : QString
此属性包含插件的文件名
建议在文件名中省略文件的后缀,因为 QPluginLoader 会自动寻找带有适当后缀的文件(参见 QLibrary::isLibrary)()。
在加载插件时,QPluginLoader 会检查所有由 QCoreApplication::libraryPaths 指定的插件位置,除非文件名具有绝对路径。在成功加载插件后,fileName() 返回插件的完全限定文件名,包括构造函数或传递给 setFileName() 的完整路径(如果给出)。
如果文件名不存在,则不会设置此属性。此时,该属性将包含一个空字符串。
默认情况下,此属性包含一个空字符串。
访问函数
QString | fileName() const |
void | setFileName(const QString &fileName) |
另请参阅 load
。loadHints : QLibrary::LoadHints
给 load 函数提供一些行为上的提示。
你可以为如何解决插件中的符号提供提示。默认情况下,从 Qt 5.7 开始,设置 QLibrary::PreventUnloadHint。
有关此属性的完整描述,请参见 QLibrary::loadHints 的文档。
访问函数
QLibrary::LoadHints | loadHints() const |
void | setLoadHints(QLibrary::LoadHints loadHints) |
另请参阅 QLibrary::loadHints
。成员函数文档
[显式]
QPluginLoader::QPluginLoader(QObject *parent = nullptr)
使用给定的父对象构建一个插件加载器。
[显式]
QPluginLoader::QPluginLoader(const QString &fileName, QObject *parent = nullptr)
构造一个具有给定父对象的插件加载器,该插件加载器将加载由fileName指定的插件。
要加载,文件的扩展名必须符合平台中可加载库的有效扩展名,例如 Unix 上的 .so
,macOS 和 iOS 上的 .dylib
,以及 Windows 上的 .dll
。可以使用 QLibrary::isLibrary() 验证扩展名。
另请参阅setFileName。
[虚函数 noexcept]
QPluginLoader::~QPluginLoader()
销毁 QPluginLoader 对象。
除非显式调用unload(),否则插件将保持在内存中,直到应用程序终止。
QString QPluginLoader::errorString() const
返回最后发生的错误的描述性文本字符串。
QObject *QPluginLoader::instance()
返回插件的最大组件对象。如果需要,将加载插件。如果插件无法加载或根组件对象无法实例化,该函数返回 nullptr
。
如果根组件对象已被销毁,调用此函数会创建一个新的实例。
由此函数返回的根组件在 QPluginLoader 销毁时不会被删除。如果想要确保根组件被删除,应该在不再需要访问核心组件之后立即调用 unload()。当库最终卸载时,根组件将自动被删除。
组件对象是一个 QObject。使用 qobject_cast() 访问您感兴趣的接口。
另请参阅 load
。bool QPluginLoader::isLoaded() const
如果插件已加载,则返回 true
;否则返回 false
。
另请参阅 load
。bool QPluginLoader::load()
加载插件并返回 true
表示插件已成功加载;否则返回 false
。由于 instance() 总是在解析符号之前调用此函数,因此无需显式调用它。在某些情况下,您可能想要提前加载插件,在这种情况下,可以使用此函数。
另请参阅unload。
QJsonObject QPluginLoader::metaData() const
获取该插件的元数据。元数据是在编译插件时使用 Q_PLUGIN_METADATA() 宏指定的 json 格式数据。
可以快速且经济地查询元数据,而无需实际加载插件。这使得将插件的能力存储在其中,并根据这些元数据决定是否加载插件成为可能。
[静态]
QObjectList QPluginLoader::staticInstances()
返回被插件加载器持有的静态插件实例(根组件)的列表。
另请参见 staticPlugins()。
[静态]
QList<QStaticPlugin> QPluginLoader::staticPlugins()
返回插件加载器持有的 QStaticPlugins 列表。此函数与 staticInstances() 类似,但增加了 QStaticPlugin 还包含元数据信息的附加功能。
另请参见 staticInstances()。
bool QPluginLoader::unload()
卸载插件并返回 true
(插件成功卸载);否则返回 false
。
在应用程序终止时会自动发生此操作,因此通常不需要调用此函数。
如果有其他实例的 QPluginLoader 使用相同的插件,将失败调用,只有在每个实例都调用电时卸载才会发生。
不要尝试删除根组件。相反,依靠 unload() 在需要时自动删除。
相关非成员函数
void qRegisterStaticPluginFunction(QStaticPlugin plugin)
将指定的 plugin 注册到插件加载器,并由 Q_IMPORT_PLUGIN 使用。
© 2024 Qt 公司有限。本文档的文档贡献权归各自所有者所有。其中提供的文档是根据自由软件基金会发布的条款和条件许可的,受 GNU 自由文档许可协议版本 1.3 的约束。Qt 及其相应的商标是芬兰的 Qt 公司及/或其他国家和地区的商标。所有其他商标均为其各自所有者的财产。