如何结合Qt Plugin类使用配套JSON文件实现组件参数配置
基于Q_PLUGIN_METADATA的Qt插件组件配置实现方案
Q_PLUGIN_METADATA宏指定的JSON文件会被Qt的moc工具直接嵌入插件二进制,无需额外打包发布,你可以直接在这个JSON里自定义组件配置,运行时读取使用即可,具体实现步骤如下:
1. 编写指定的file.json配置文件
JSON根节点必须包含和宏定义一致的IID字段,自定义配置建议放在单独的MetaData节点下避免和Qt保留字段冲突,绘图画布的配置示例如下:
{ "IID": "descComponentIID", "MetaData": { "componentName": "绘图画布组件", "defaultConfig": { "canvasWidth": 1920, "canvasHeight": 1080, "backgroundColor": "#FFFFFF", "gridEnabled": true, "gridSpacing": 10 } } }
你可以根据需求自由扩展字段,支持所有JSON标准数据类型。
2. 读取配置参数的代码实现
有两种读取场景,分别对应主程序加载插件时读取,和插件内部自行读取:
场景1:主程序加载插件时读取配置
#include <QPluginLoader> #include <QJsonObject> // 加载插件实例,不同平台插件后缀自行替换 QPluginLoader canvasPluginLoader("./libDrawingCanvas.so"); if (canvasPluginLoader.load()) { // 获取嵌入的JSON元数据 QJsonObject fullMeta = canvasPluginLoader.metaData(); // 提取自定义配置段 QJsonObject canvasConfig = fullMeta.value("MetaData").toObject().value("defaultConfig").toObject(); // 读取对应参数初始化画布,第二个参数为默认fallback值 int canvasW = canvasConfig.value("canvasWidth").toInt(1280); int canvasH = canvasConfig.value("canvasHeight").toInt(720); QString bgColor = canvasConfig.value("backgroundColor").toString("#F5F5F5"); bool enableGrid = canvasConfig.value("gridEnabled").toBool(false); // 实例化组件并传入参数 QObject *pluginInstance = canvasPluginLoader.instance(); DrawingCanvasInterface *canvas = qobject_cast<DrawingCanvasInterface*>(pluginInstance); if (canvas) { canvas->init(canvasW, canvasH, bgColor, enableGrid); } }
场景2:插件内部自行读取配置
在插件类的构造函数中直接读取静态元数据即可:
#include <QMetaObject> #include <QJsonObject> DrawingCanvasPlugin::DrawingCanvasPlugin(QObject *parent) : QObject(parent), CanvasInterface(parent) { QJsonObject fullMeta = staticMetaObject.metaData().toObject(); QJsonObject defaultConfig = fullMeta.value("MetaData").toObject().value("defaultConfig").toObject(); // 读取参数初始化内部属性 m_width = defaultConfig.value("canvasWidth").toInt(1280); m_height = defaultConfig.value("canvasHeight").toInt(720); m_backgroundColor = defaultConfig.value("backgroundColor").toString("#F5F5F5"); }
注意事项
- JSON文件必须使用UTF-8编码,避免读取时出现乱码
- 修改JSON内容后需要重新编译插件,moc工具会把最新的JSON内容嵌入到插件二进制中
- 如果需要支持运行时修改配置不需要重新编译,建议将可修改配置单独存储到用户目录下的INI/JSON配置文件,和本文的默认配置做合并使用
- 根节点的
IID、ClassName等字段为Qt保留字段,不要修改或占用,自定义内容都放在自建的子节点下即可
内容的提问来源于stack exchange,提问作者codeKarma
相关产品推荐
相关产品推荐

