QPluginLoader

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 对象供业务读取。

相关推荐
LaoWaiHang17 小时前
关于Qt中鼠标左键事件被子控件截留的处理
qt
初阳78521 小时前
【基于Qt5仿音乐播放器(一)】——项目准备
qt·1024程序员节
kaixin_learn_qt_ing1 天前
Qt开发工程师
qt
ShineWinsu2 天前
对于Qt:信号与槽的解析
c++·qt·gui·lambda·信号·信号与槽·槽函数
努力实干2 天前
Qt/C++ 模块化设计与工程组织
开发语言·c++·qt
Lhan.zzZ2 天前
Qt:动态库模块框架设计
开发语言·c++·qt
qq_401700413 天前
TCP 长连接、心跳包与断线自动重连设计:工业级通信的“不死鸟”架构
网络·qt·tcp/ip
dyxal4 天前
A2A 协议 v1.0 完全指南:方法名、Agent Card、三种绑定与 FastAPI 实战
开发语言·qt·fastapi
金色熊族4 天前
在Qt中使用asan检测内存泄漏(一)
linux·qt·asan
前行中的小猪4 天前
Qt 5 踩坑实录:多显示器跨屏拖拽导致窗口异常放大与 setGeometry 报错的深度解析与根治
qt·多显示器·高分辨率·多屏幕