cpp
QPluginLoader *loader = new QPluginLoader(path);
QJsonObject json = loader->metaData().value("MetaData").toObject();
解析:
cpp
// 创建插件加载器对象,path是插件文件路径(Windows .dll / Linux .so / Mac .dylib)
QPluginLoader *loader = new QPluginLoader(path);
// 读取插件内置元数据,取出键名为"MetaData"的JSON对象
QJsonObject json = loader->metaData().value("MetaData").toObject();
QPluginLoader 作用
Qt 官方插件加载类,专门用来动态加载二进制插件库:
- 支持运行时动态打开
.so/.dll/.dylib,不用编译链接; - 无需先加载插件本体,就能只读插件元数据(关键特性);
- 可以创建插件实例、卸载插件、获取插件接口。
cpp
QString path = "./plugins/myplugin.dll";
QPluginLoader *loader = new QPluginLoader(path);
loader->metaData () 核心原理
Qt 插件编译时,会通过**Q_PLUGIN_METADATA** 宏把一段 JSON 信息嵌入插件二进制文件 ,不依赖外部配置文件。 调用 metaData() 不会真正加载插件代码,只读取内嵌 JSON,开销极小。
返回值类型:QJsonDocument,整个插件元数据的根 JSON 文档。
cpp
// 插件头文件
class MyPlugin : public QObject, public MyInterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "com.test.MyInterface" FILE "meta.json")
Q_INTERFACES(MyInterface)
public:
// ...
};
配套 meta.json 文件内容:
bash
{
"IID": "com.test.MyInterface",
"MetaData": {
"name": "测试插件",
"version": "1.0.0",
"author": "xxx",
"desc": "功能描述"
}
}
内存:**QPluginLoader**用完必须 delete,否则插件库无法从内存卸载。
打开插件文件,不加载插件逻辑,仅读取插件内部预定义的自定义描述信息(名称、版本、作者等)存入 json 对象供业务读取。