Qt插件:QPluginLoader

一、描述

QPluginLoader 提供对 Qt 插件的访问。Qt 插件存储在共享库(DLL)中,与使用 QLibrary 访问共享库相比,它具有以下优势:

  • QPluginLoader 检查插件是否链接到与应用程序相同的 Qt 版本。
  • QPluginLoader 提供对根组件对象(instance())的直接访问,而不是强制手动解析 C 函数。

QPluginLoader 对象的实例对单个共享库文件进行操作。它以独立于平台的方式提供对插件功能的访问。

如果插件尚未加载,则 instance() 函数会隐式地尝试加载插件。 QPluginLoader 的多个实例可用于访问同一个物理插件。加载后,插件将保留在内存中,直到卸载了 QPluginLoader 的所有实例,或者直到应用程序终止。

二、属性成员

1、fileName:QString

此属性保存插件的文件名。

建议在文件名中省略文件的后缀,因为 QPluginLoader 将自动查找具有适当后缀的文件。

加载插件时,QPluginLoader 会搜索 QCoreApplication::libraryPaths() 指定的所有插件位置,除非文件名有绝对路径。 成功加载插件后,fileName() 返回插件的完整路径。

2、loadHintsQLibrary::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() 使用。

  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt QPluginLoaderQt 框架中的一个类,用于动态加载插件并在运行时创建插件实例。 通过 QPluginLoader,您可以将 Qt 插件(也称为共享库或动态链接库)加载到您的应用程序中。这些插件可以包含任何类型的功能,例如界面元素、数据存储、网络通信等等。 要使用 QPluginLoader,您需要提供插件的路径,并使用 load() 方法加载插件。如果加载成功,您可以使用 instance() 方法创建插件实例,并与其交互。 以下是 QPluginLoader 的简单示例: ``` #include <QApplication> #include <QPluginLoader> #include <QDebug> #include "myplugin.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); QPluginLoader loader("myplugin.dll"); QObject *plugin = loader.instance(); if (plugin) { MyPlugin *myPlugin = qobject_cast<MyPlugin *>(plugin); if (myPlugin) { myPlugin->doSomething(); } else { qWarning() << "Failed to cast plugin to MyPlugin"; } } else { qWarning() << loader.errorString(); } return a.exec(); } ``` 在此示例中,我们加载名为 "myplugin.dll" 的插件,并使用 qobject_cast 将其转换为 MyPlugin 类型。如果转换成功,我们调用 doSomething() 方法执行插件中的操作。 需要注意的是,QPluginLoader 只能用于加载 Qt 插件,而不是任意的共享库或动态链接库。要创建 Qt 插件,您需要使用 Qt Creator 或 qmake 工具创建一个项目,并将其编译为共享库。详情请参阅 Qt 文档。 ### 回答2: Qt的QPluginLoader是一个用于加载Qt插件的类。它可以加载动态链接库,并获取插件的元对象信息,从而可以在运行时动态实例化该插件。 QPluginLoader提供了一种使用Qt插件的灵活机制。插件是一种通过将功能模块拆分为单独的动态链接库来扩展应用程序的方式。使用插件可以使应用程序更易于维护和扩展。 QPluginLoader可以通过指定插件路径或文件名来加载插件。在加载插件之后,可以使用其metaObject()方法获得插件的元对象,进而实例化插件并访问其属性和方法。 使用QPluginLoader可以实现插件的热插拔功能。如果插件的路径或文件名发生变化,可以通过重新加载插件来更新应用程序的功能,而无需重新编译整个应用程序。 除了动态加载Qt插件以外,QPluginLoader还有其他一些功能。例如,它可以检查插件是否已加载,获取插件的元数据(包括依赖关系和元数据版本),以及在插件加载失败时获取错误信息。 总之,QPluginLoaderQt提供的一个强大的工具,它简化了Qt插件的加载和使用过程,使应用程序更具灵活性和可扩展性。使用QPluginLoader,开发人员可以更方便地实现插件机制,并轻松地将插件集成到应用程序中。 ### 回答3: Qt的QPluginLoader类是一种用于加载插件的工具。 插件是一种外部提供的、可扩展的模块,可以在应用程序中动态加载和卸载。 QPluginLoader提供了一种方便、灵活的方法来加载这些插件,并在运行时使用它们。 QPluginLoader的主要功能之一是加载插件。它可以从文件系统中加载指定的插件文件,并将其加载到当前应用程序中。插件文件一般具有动态链接库(DLL)的格式,其中包含了插件的实现代码。加载插件时,QPluginLoader会自动查找并加载插件所需的依赖库,以确保插件能够正确执行。 加载插件后,QPluginLoader提供了一种检查插件状态和使用插件的方式。它可以提供插件的元数据,如插件的名称、版本和作者等信息。QPluginLoader还提供了一种用于获取插件接口的方法,可以使用这些接口来调用插件的功能。使用插件接口,应用程序可以与插件进行通信,并根据需要执行插件所提供的功能。 另外,QPluginLoader还支持动态加载和卸载插件。这意味着应用程序可以在运行时根据需要加载或卸载插件,从而实现动态扩展功能。这对于需要灵活性和模块化的应用程序来说非常有用,可以根据应用程序环境的变化加载不同的插件,从而实现不同的功能。 总的来说,QPluginLoaderQt中一个非常有用的工具类,它提供了一种方便的方法来加载、管理和使用插件。使用QPluginLoader,开发人员可以轻松地将插件集成到应用程序中,实现更灵活和可扩展的应用程序架构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值