插件式框架学习(1)

lianpeiliang/LearnFramework: 基于 C++ / Qt 5 的轻量级桌面插件框架学习项目,包含应用启动、命令与消息分发、插件加载及服务注册。

它是一个基于 C++ / Qt 5 的桌面插件框架学习版,目前运行后主要显示一个空窗口,还没有具体业务功能。 核心价值是演示应用启动、命令分发、插件加载和共享对象管理。

软件是怎样运行的

启动流程比较清晰:

cpp 复制代码
main 创建 QApplication
  → 创建 ApplicationHost
  → CommandBindings 注册命令 1000,对应 PluginLoader
  → ApplicationHost::show() 发送命令 1000
  → CommandBus 找到 PluginLoader
  → 扫描程序旁的 plugins 文件夹
  → 加载插件并调用 initialize()
  → 显示主窗口,进入 Qt 事件循环

现在调用这行,是不是没有效果?

对,当前没有插件时,这行不会产生可见效果,但它确实执行了。

它会走完这条调用链:

cpp 复制代码
发送命令 1000
  → 找到已注册的 PluginLoader
  → 调用 PluginLoader::dispatchCommand()
  → 扫描程序旁的 plugins 文件夹

如果文件夹不存在或里面没有动态库,就没有插件需要初始化,函数直接返回 true;这里也没有使用返回值。

所以:

  • 现在没有插件:注释掉这行,显示出来的空窗口效果相同。
  • 以后有符合接口的插件 :这行会加载插件并调用 initialize(),就有实际作用了。

那你帮我写一下1000这个插件吧,功能简单点即可

写好了,插件功能很简单:

  • 加载后显示"示例插件"窗口。
  • 点击"点我计数",显示累计点击次数。
  • 退出主程序时自动释放窗口。

Release v1.0.1 · lianpeiliang/LearnFramework

这是v1.0.1,载入了一个插件。


提问:1000代表什么?

1000 是这个项目自行约定的**"加载插件"命令编号**,不是 Qt 规定的,也不是某个插件的编号。

它在两处配合使用:

注册命令时:

cpp 复制代码
registerHandler(1000, new PluginLoader);

意思是:收到命令 1000,就交给 PluginLoader 处理。

发送命令时:

cpp 复制代码
dispatchCommand(1000, path.data(), path.size());

意思是:让 PluginLoader 扫描 path 指定的目录,加载里面符合接口的插件。

所以,DemoPlugin 能被加载,是因为它位于 plugins 目录并实现了**Plugin 接口**。以后这个目录里有多个插件,命令 1000 也会一起尝试加载它们。

你可以把 1000 改成其他未占用的编号,只要注册、发送以及加载器内部的编号判断保持一致即可。


所以1000实际上是一个命令,用来加载plugins目录下的所有动态库

对,更准确地说,1000 是"加载插件"命令的编号。

当前代码收到它后,会扫描 plugins 目录第一层的所有动态库文件,尝试加载。

只有符合 Qt 插件格式、实现了约定的 Plugin 接口,并且 **initialize()**成功的插件,才会被保留。

所以普通 DLL 即使放进去,也不一定能作为插件加载。

相关推荐
普通人66 小时前
WebGL与WebGPU入门指南
开发语言·webgl·1024程序员节
猫猫不是喵喵.1 天前
从0到1创建一个微服务项目
java·数据库·微服务·1024程序员节
fish_zzzz4 天前
笔记-论数据结构2
1024程序员节
普通人65 天前
PHP文件读写完全指南
开发语言·php·1024程序员节
Martina_03215 天前
AI生成3D场景从白模换成精模后镜头全偏了?用6步检查单位、枢轴与层级替换
图像处理·人工智能·3d·ai·自然语言处理·材质·1024程序员节
星云_byto6 天前
CSS布局
人工智能·机器学习·目标跟踪·1024程序员节
张小姐的猫9 天前
【MySQL】访问 & 数据流动原理
android·数据库·mysql·adb·1024程序员节
工业HMI实战笔记10 天前
印刷电路板HMI:SMT贴装的元件定位界面
制造·设计规范·设计语言·1024程序员节
Martina_032110 天前
AI生成3D模型一合并网格,材质就串色?用6步检查材质槽、UV与图集重映射
图像处理·人工智能·3d·材质·uv·游戏策划·1024程序员节
橙光成长10 天前
android-ad-cleaner:android免 Root 批量关闭系统开屏与营销推送
android·1024程序员节