QPluginLoader 类

QPluginLoader 类在运行时加载插件。 更多...

头文件 #include <QPluginLoader>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += core
继承 QObject

注意: 此类中所有函数均为可重入的。

属性

公共函数

QPluginLoader(QObject *parent = nullptr)
QPluginLoader(const QString &fileName, QObject *parent = nullptr)
virtual~QPluginLoader()
QStringerrorString() const
QStringfileName() const
QObject *instance()
boolisLoaded() const
boolload()
QLibrary::LoadHintsloadHints() const
QJsonObjectmetaData() const
voidsetFileName(const QString &fileName)
voidsetLoadHints(QLibrary::LoadHints loadHints)
boolunload()

静态公共成员

QObjectListstaticInstances()
QList<QStaticPlugin>staticPlugins()
voidqRegisterStaticPluginFunction(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() 的完整路径(如果给出)。

如果文件名不存在,则不会设置此属性。此时,该属性将包含一个空字符串。

默认情况下,此属性包含一个空字符串。

访问函数

QStringfileName() const
voidsetFileName(const QString &fileName)

另请参阅 load

loadHints : QLibrary::LoadHints

load 函数提供一些行为上的提示。

你可以为如何解决插件中的符号提供提示。默认情况下,从 Qt 5.7 开始,设置 QLibrary::PreventUnloadHint

有关此属性的完整描述,请参见 QLibrary::loadHints 的文档。

访问函数

QLibrary::LoadHintsloadHints() const
voidsetLoadHints(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(),否则插件将保持在内存中,直到应用程序终止。

另请参阅isLoaded() 和 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() 在需要时自动删除。

另请参见 instance() 和 load()。

相关非成员函数

void qRegisterStaticPluginFunction(QStaticPlugin plugin)

将指定的 plugin 注册到插件加载器,并由 Q_IMPORT_PLUGIN 使用。

© 2024 Qt 公司有限。本文档的文档贡献权归各自所有者所有。其中提供的文档是根据自由软件基金会发布的条款和条件许可的,受 GNU 自由文档许可协议版本 1.3 的约束。Qt 及其相应的商标是芬兰的 Qt 公司及/或其他国家和地区的商标。所有其他商标均为其各自所有者的财产。