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 即使放进去,也不一定能作为插件加载。