Skip to main content

Qt 代码审查技能重磅上线,用于智能体式开发

评论

审查、审计或核查代码,通常意味着要分别运行代码检查工具(linter)、逐条查阅检查清单,并在数十个文件中手动验证 Qt 特有的代码模式。作为 Qt AI 驱动的开发工具 的重要补充,Qt 代码审查技能可以帮助开发者自动完成审查环节的部分工作。借助 AI 智能体先运行确定性 linter、再并行调度六个深度分析智能体,开发者不必再逐个文件手动排查,几分钟内即可获得附带修复建议的真实问题清单。

AI 驱动的代码审查,结果可靠

这些审查技能背后的原则很简单:linter 具有权威性,智能体不会对其结论提出质疑;只有置信度超过 80/100 的发现才会作为确认问题上报;且这些技能均为只读操作,不会修改代码。

视频:Qt C++ 代码审查技能在 Claude Code CLI 中的实际运行演示(部分片段经过剪辑与加速处理)

Qt C++ 审查技能针对 Qt6 C++ 源文件与头文件;QML 审查技能针对 Qt6 QML 文件,并可选择性调用系统的 qmllint 进行类型级检查。两项技能均可作用于单次提交(commit)、单个目录或整个项目,且共享一套三阶段分析架构。

两项审查技能,同一套架构

两项审查技能均针对 Qt6 源代码:C++ 审查技能作用于 .cpp、.h 与 .hpp 文件;QML 审查技能作用于 .qml 文件,并可选择性调用系统 qmllint 进行类型级检查。两者都可审查单次提交、单个目录或整个项目,且共享同一套三阶段处理流程。

代码审查技能何时被触发?

只要开发者要求审查、检查、审计或核查代码——或是在提交(commit)前被提醒需要这样做——AI 智能体就会调用 Qt 代码审查技能。诸如 "review my changes"(审查我的改动)、"audit the module"(审计这个模块)、"check this before I push"(推送前检查一下),或者简单一句 "code review"(代码审查),都足以触发该技能。这些技能还会判断用户意图范围是狭窄的(仅审查 diff 或特定提交)还是宽泛的(审查整个目录或完整代码库),并据此调整审查范围。

Qt 代码审查技能详解

一旦被触发,这些技能便会接管原本需要开发者分别运行 linter、查阅检查清单、并在数十个文件中手动推敲 Qt 特有细微模式的整套工作流程。以下是各步骤的具体运作方式。

第一步——范围识别

该技能首先确定审查范围。如果开发者说 "this commit"(这次提交),它会执行 git diff HEAD~1..HEAD;如果说 "my changes"(我的改动),则会合并未暂存与已暂存的 diff。无论哪种情况,它都会审查改动行以及前后各 ±50 行的上下文,并且只报告落在改动行范围内的问题。如果开发者指定了某个文件、目录或整个项目,它会在该范围内匹配所有 .cpp、.h 和 .hpp 文件(C++ 技能)或所有 .qml 文件(QML 技能)。

CodeReviewStart

第二步——确定性代码检查(Deterministic Linting)

Python linter 采用单次遍历(single-pass)方式,对范围内的全部文件进行检查。C++ linter 内置了 60 余项可机械检测的规则,涵盖 include 顺序、废弃类使用、反模式(anti-pattern)、QAbstractItemModel 契约违规、错误处理、生命周期、API 命名、头文件、超时处理、条件语句、值类型(value-class)规范以及三元运算符风格等类别。

QML linter 内置了 47 余项检查,涵盖 import 顺序、属性顺序、属性绑定(property binding)、布局与锚定(anchoring)、Loader 模式、delegate 安全性、States、图片加载、性能反模式、代码风格规范、信号处理函数(signal handler)语法、错误与安全模式(如硬编码 http://、不可移植路径)以及 JavaScript 风格。两个 linter 均具确定性与权威性——其输出结果将直接进入下一步骤,智能体不会再对其提出异议。

CodeReviewPhase1

第二步 b——系统 qmllint(仅限 QML 技能)

在 Python linter 运行完成后,若系统 PATH 中可找到 qmllint,QML 技能会选择性地以 JSON 输出格式运行系统 qmllint。qmllint 在类型级检查方面具有权威性——包括未解析类型、不兼容的属性赋值以及别名(alias)循环;而 Python linter 则覆盖 qmllint 无法检测的风格、顺序与性能模式。两者的输出结果会被合并并去重。

CodeReviewPhase1b

第三步——六个并行的深度分析智能体

以 linter 输出结果作为上下文,六个专项智能体会并行启动。每个智能体都有明确的职责范围与特定的检查清单,不会重复 linter 已经标记过的问题。

Qt C++ 技能中的六个智能体分工如下:

  • 模型契约(Model Contracts)——QAbstractItemModel 信号协议、角色(role)系统、索引有效性以及代理模型(proxy model)正确性。

  • 所有权与生命周期(Ownership & Lifecycle)——内存所有权、父子对象关系、资源清理、五法则(Rule of Five)以及 RAII 正确性。

  • 线程安全(Thread Safety)——跨线程 QObject 访问、互斥锁(mutex)一致性以及工作线程中的信号发射。

  • API、命名与 C++ 正确性(API, Naming & C++ Correctness)——Qt 命名规范、const 正确性、移动语义(move semantics)、枚举(enum)规范以及 noexcept 正确性。

  • 错误处理与校验(Error Handling & Validation)——QFile、QJsonDocument、QNetworkReply、SSL 以及用户输入中缺失的错误检查。

  • 性能与代码质量(Performance & Code Quality)——算法反模式、不必要的拷贝、写时复制(COW)分离(detach)陷阱、死代码、魔法数字(magic number)、复制粘贴的逻辑、过期缓存,以及不确定的迭代顺序。

CodeReviewPhase2

QML 技能中的六个智能体分工如下:

  • 绑定与属性(Bindings & Properties)——多重循环绑定(binding loop)、别名(alias)链、未限定的属性访问、缺失的 readonly 声明,以及 pragma ComponentBehavior: Bound 的覆盖情况。

  • 布局与锚定(Layout & Anchoring)——锚定到不可见项目、跨分支锚定、模糊的 Layout 尺寸设置,以及缺失的填充策略(fill policy)。

  • 组件加载与生命周期(Component Loading & Lifecycle)——Loader 模式、动态对象创建导致的泄漏、Connections 的生命周期,以及与 C++ 集成的正确性。

  • ListView 与 Delegate 正确性(ListView & Delegate Correctness)——required 属性模式、delegate 复用安全性、滚动性能,以及已知的 Qt delegate 缺陷。

  • 状态、过渡与结构(States, Transitions & Structure)——PropertyChanges 的正确性、过渡(transition)覆盖情况、StateGroup 的使用,以及 Qt 5 → 6 迁移模式(Binding.restoreMode、Connections 处理函数语法、QtGraphicalEffects → MultiEffect)。

  • 性能与代码质量(Performance & Code Quality)——高开销绑定、信号与函数(signal-vs-function)方向选择、以单例(singleton)存储数据的反模式、MouseArea 与指针事件处理器(pointer handler)的取舍、delegate 中父对象的空值检查,以及可复用组件的尺寸设置。

第四步——整合与报告输出

技能会合并全部 linter 与智能体的输出,在文件与行级别对发现结果去重,并进行置信度评分。只有置信度超过 80/100 阈值的发现,才会作为确认问题上报;60–79 区间的发现则会单独归入"待排查项"章节,整份报告中最多列出十项;低于 60 的发现一律不予展示。每一项确认问题都包含文件与行号、规则类别、问题描述,以及以文字形式(而非代码补丁)给出的具体修复建议。

CodeReviewPhase3

代码审查技能的局限性

这些技能并不能替代传统的静态与动态分析工具。架构验证——即检查组件边界、分层结构与依赖关系图是否合理——需要专门的工具与人工判断,这超出了逐文件 linting 与智能体审查所能提供的范畴。同样,针对已知漏洞模式的安全扫描、CVE 匹配的依赖检查以及供应链分析,也应交由专门的安全审查技能或外部扫描工具处理。这些工具是对 Qt 代码审查技能的补充,应与其配合使用,而非取而代之。

分析范围受限于智能体在审查会话中所能读取的内容。跨代码库的依赖、生成代码,以及不在源码树中的第三方头文件,均不会被分析。仅在链接期或运行时才会显现的问题——例如由特定输入序列触发的未定义行为、需要特定线程交错顺序才会出现的竞态条件(race condition),或是在运行时动态连接的 Qt 信号,都超出了静态审查的范围。

置信度阈值会屏蔽不确定的发现,这意味着部分真实存在的问题不会出现在报告中。对于从事安全关键或安全敏感代码工作的审查人员,应将该报告视为审查的最低起点,而非上限,并应结合人工审查使用。

依赖项

Qt C++ 代码审查技能需要 Python 3 来运行其内置的 linter,除标准库外无需额外安装其他软件包。若要进行基于 diff-scope 的审查,Git 必须已配置在 PATH 中。该技能面向 Qt6 C++ 代码库;Qt5 项目大体上也可正常使用,但部分检查项是 Qt6 专属的。

QML 代码审查技能同样需要 Python 3 来运行其 linter。来自 Qt6 安装环境的 qmllint 可选择性启用类型级检查;该技能会自动在 $QT_HOST_PATH/bin/ 或系统 PATH 中检测 qmllint,若未找到则会自动跳过该项检查,不影响其余流程。

已测试环境

这些技能已在 Claude Code CLI、Claude Desktop 以及 VS Code 中的 GitHub Copilot 环境下完成测试。Claude Sonnet 4.6、GPT 5.4 与 Gemini 3.1 Pro 均能取得良好效果。除上述已测试的模型外,针对深度任务,始终建议使用前沿模型(frontier model)。

获取这些技能

可通过我们的 GitHub 代码库获取 Qt 智能体技能:https://github.com/TheQtCompanyRnD/agent-skills

此外,也可直接从 Claude 应用市场(marketplace)以插件形式安装官方 Qt 代码审查技能(搜索 "qt-development" 即可找到)。

评论

Subscribe to our blog

Try Qt 6.11 Now!

Download the latest release here: www.qt.io/download

Qt 6.11 is now available, with new features and improvements for application developers and device creators.

We're Hiring

Check out all our open positions here and follow us on Instagram to see what it's like to be #QtPeople.