一、描述
QPluginLoader 提供对 Qt 插件的访问。Qt 插件存储在共享库(DLL)中,与使用 QLibrary 访问共享库相比,它具有以下优势:
- QPluginLoader 检查插件是否链接到与应用程序相同的 Qt 版本。
- QPluginLoader 提供对根组件对象(instance())的直接访问,而不是强制手动解析 C 函数。
QPluginLoader 对象的实例对单个共享库文件进行操作。它以独立于平台的方式提供对插件功能的访问。
如果插件尚未加载,则 instance() 函数会隐式地尝试加载插件。 QPluginLoader 的多个实例可用于访问同一个物理插件。加载后,插件将保留在内存中,直到卸载了 QPluginLoader 的所有实例,或者直到应用程序终止。
二、属性成员
1、fileName:QString
此属性保存插件的文件名。
建议在文件名中省略文件的后缀,因为 QPluginLoader 将自动查找具有适当后缀的文件。
加载插件时,QPluginLoader 会搜索 QCoreApplication::libraryPaths() 指定的所有插件位置,除非文件名有绝对路径。 成功加载插件后,fileName() 返回插件的完整路径。
2、loadHints:QLibrary::LoadHints
load() 函数载入插件的提示。
三、成员函数
1、~QPluginLoader()
销毁 QPluginLoader 对象。
除非显式调用 unload(),否则插件会一直保留在内存中,直到应用程序终止。
2、QString errorString()
返回对发生的最后一个错误的描述。
3、QObject * instance()
返回插件的根组件对象。 必要时加载插件。如果无法加载插件或无法实例化根组件对象,则该函数返回 nullptr。
如果根组件对象被销毁,则调用此函数会创建一个新实例。
该函数返回的根组件在 QPluginLoader 销毁时不会被删除。 如果要确保删除根组件,则应在不再需要访问核心组件时立即调用 unload()。 当库最终卸载时,根组件将自动删除。
组件对象是一个 QObject。 使用 qobject_cast() 可将其转成所需的对象。
4、bool isLoaded()
插件是否已加载。
5、bool load()
加载插件,如果插件加载成功则返回true; 否则返回false。因为 instance() 总是在解析任何符号之前调用这个函数,所以没有必要显式调用它。
6、QJsonObject metaData()
返回此插件的元数据。 元数据是在编译插件时使用 Q_PLUGIN_METADATA() 宏以 json 格式指定的数据。
无需实际加载插件即可以快速且廉价的方式查询元数据。这使得可以例如将插件的功能存储在那里,并根据此元数据决定是否加载插件。
7、[static] QObjectList staticInstances()
返回插件加载器持有的静态插件实例(根组件)列表。
8、[static] QList<QStaticPlugin> staticPlugins()
返回插件加载器持有的 QStaticPlugins 列表。 该函数与 staticInstances() 类似,但 QStaticPlugin 也包含元数据信息。
9、bool unload()
卸载插件,如果插件可以卸载则返回true,否则返回false。
这在应用程序终止时自动发生,因此通常不需要调用此函数。
如果 QPluginLoader 的其他实例正在使用相同的插件,则调用将失败,并且只有在每个实例都调用了 unload() 时才会发生卸载。
不要尝试删除根组件。 而是依靠 unload() 会在需要时自动删除它。
四、相关非成员
1、void qRegisterStaticPluginFunction(QStaticPlugin plugin)
注册插件加载器指定的插件,并由 Q_IMPORT_PLUGIN() 使用。