用蓝图生成 Qt 工程:把 AI 代码放进可审查的流水线

从蓝图数据模型、确定性生成到候选代码审核,记录 Qt Blueprint Generator 的架构取舍与当前边界。

本文目录

Qt Blueprint Generator 是一个用蓝图描述 Qt 6 Widgets 应用的桌面工具。它的目标不是做完整的 IDE,而是把“设计意图”变成可审查、可构建、可导出的工程。

为什么用蓝图作主数据源

如果让 AI 直接改代码,最大的问题是:改动不可比较,也难以判断哪些部分是契约、哪些部分是实现。这个项目把蓝图作为主数据源,节点、端口、连线和属性先落成结构化数据,再由确定性生成器维护公共契约与工程骨架。

一个蓝图工程包含两个文件:blueprint.json 保存语义,layout.json 保存画布位置。移动节点只改变布局,不会改变生成的中间表示;这样评审时可以只关注语义差异。

生成流程

蓝图设计 → 校验 → 生成 Candidate → 人工 Review
        → Accept / Reject → Build → Export
  • Candidate:AI 生成的代码先进入候选区,不会直接覆盖正式工程。
  • Review:逐文件对照当前实现与候选代码,可以选择接受、编辑后接受或拒绝。
  • Build:构建需要显式触发,使用真实的 CMake 工具链。
  • Export:导出可以独立重新构建的工程,而不是只保留当前工作区。

这条流程的核心约束是:AI 不拥有最终写入权。公共契约、程序入口、构建配置等受保护内容由确定性系统维护;生成失败也不会自动清空旧工程。

确定性与 AI 的边界

项目把职责拆成几层:

层职责
Qt 编辑器画布、属性、文档生命周期、候选审核
生成服务校验、写候选、接受授权、脚手架与构建
目标插件把蓝图语义 lowering 成具体目标工程
协议工具Blueprint v2 与插件声明的离线校验

外部代码的导入也是同样的思路:C/C++ 文件以只读黑盒模块接入,绑定接口契约并校验 SHA-256;编辑器不假设自己可以安全地重写这些文件。

当前能力与限制

Phase 1 的运行时只接受一条线性链:

Start → 零个或多个 Logic Module → 可选的唯一末端 UI Page → End

Decision、External Code、多 End 等节点仍然可以编辑,但不属于这一阶段的运行时生成范围。节点编辑能力不等于运行时能力,这是 README 里反复强调的边界。

插件平台仍是 Draft:当前只实现了 TypeScript/Node 的声明校验与最小内存 Registry,不执行插件代码,也没有接入 Qt GUI。长期方向是“编辑器和目标插件分离”,但在协议冻结前,不把提案当成已交付能力。

构建与测试

项目使用 C++17、Qt 6 Widgets / Network、CMake 和 Ninja。Windows 下建议把构建目录放在纯 ASCII 路径,避免 MinGW 与 AutoMOC 在中文路径上出问题。

cmake -S . -B $buildRoot -G Ninja `
  -DBUILD_TESTING=ON `
  -DCMAKE_PREFIX_PATH="$qtRoot"
cmake --build $buildRoot
ctest --test-dir $buildRoot -C Debug --output-on-failure
& (Join-Path $buildRoot 'BlueprintEditor.exe')

CTest 使用 Fake AI 或离线网络替身,不读取真实密钥,也不产生模型费用;需要调用真实模型的集成程序不会注册进自动测试。

复盘

这个项目最有价值的部分不是“让 AI 写代码”,而是把 AI 放进一条有边界、可回滚的流水线:

  1. 结构化输入优先于自然语言提示。
  2. 生成结果先成为候选,再经过人工确认。
  3. 契约、入口和构建配置由确定性系统维护。
  4. 明确写出“当前不支持什么”,比模糊地承诺“未来都可以”更重要。

代码与文档采用 MIT License;Qt 和其他第三方依赖仍遵循各自许可证。

讨论

评论由 GitHub Discussions 提供,点击后加载。未加载前不会产生第三方请求。