长春火车站出站要求,陕西网渭南站,网站建设交接表,wordpress主题主页修改文章目录 一、简介二、常用方法2.1 构造函数2.2 动态加载方法——load()2.3 检查是否加载成功——isLoaded()2.4 访问插件中的根组件——instance()2.5 卸载插件——unload() 一、简介 QPluginLoader 类在运行时加载插件。
QPluginLoader 提供对Qt插件的访问。Qt插件存储在共享… 文章目录 一、简介二、常用方法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上的.somacOS和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 QObjectclass 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_castMyPluginComponent *(rootComponent);if (myComponent) {myComponent-doSomething(); // 这里会访问已被删除的对象导致崩溃或未定义行为}}// 即使调用 unload()根组件已经被手动删除可能会导致内存错误loader.unload(); // 此时 unload() 不能正确处理已删除的对象return 0;
}