必须执行清理→执行qmake→重新构建的完整流程,因改ui后uic/moc不会自动重生成ui_.h和moc_.cpp,仅清理或仅重新构建均无效。

清理构建目录后仍报旧信号名错误
这是最典型的“改了 UI 却还调用旧函数名”的现象,比如你把 pushButton_5 改成 btn_search,但编译时仍报 on_pushButton_5_clicked 未定义。根本原因不是代码没改,而是 Qt 的 MOC 机制缓存了旧的元对象信息。
必须执行完整清理链:
- 先在 Qt Creator 菜单栏点击 构建 → 清理所有项目(或右键项目 → 清理)
- 再点击 构建 → 执行 qmake(qmake 项目)或 构建 → 重新配置 CMake(CMake 项目)
- 最后点击 构建 → 重新构建(快捷键
Ctrl+Shift+R)
仅点“构建”或“重新构建”不够——qmake/CMake 不会自动感知 .ui 文件中 objectName 的变更,必须显式触发元对象重生成。
手动删 build 目录比菜单清理更彻底
Qt Creator 的“清理”有时漏删 moc_*.cpp 或 ui_*.h,尤其当项目曾切换过 Kit 或 Debug/Release 模式时。直接删整个 build 目录反而更可靠。
操作步骤:
- 关闭 Qt Creator(避免文件被锁)
- 找到项目同级目录下的
build-xxx-Desktop_Qt_6_x_x_...文件夹(名字含 Qt 版本和 Kit) - 彻底删除该文件夹(回收站也清空)
- 重启 Qt Creator,打开项目,再执行 构建 → 执行 qmake + 构建 → 构建项目
注意:不要只删 build 目录里的 .o 或 .obj 文件——MOC 和 UI 编译产物藏得深,整目录删最省事。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
为什么改完 .ui 的 objectName 还要清理?
Qt Designer 修改 objectName 后,只会更新 mainwindow.ui 文件;但 ui_mainwindow.h 和 moc_mainwindow.cpp 是由 uic/moc 工具在构建时自动生成的。它们不会自动监听 .ui 文件变化,也不会在下次构建时强制重生成——除非你触发 qmake 或 CMake 重配置。
典型错误路径:
- 你在 Designer 里把按钮
objectName改成btn_submit - 保存 .ui,但没清理、没 run qmake
- 编译时,
ui_mainwindow.h里还是旧的pushButton_5成员变量声明 - 于是
connect或槽函数声明全部失效
所以改 UI 后,清理 + qmake 是硬性流程,跳过等于白改。
子项目依赖下清理要特别小心
如果你用的是 subdirs 项目(比如主项目包含 CoreLib + GuiApp),单独清理某个子项目可能引发链接失败——因为库的符号表没更新,但可执行文件还在引用旧版。
正确做法:
- 右键最顶层的 subdirs 项目 → 清理(不是子项目)
- 再右键顶层项目 → 执行 qmake
- 确保
CONFIG += ordered和xxx.depends = yyy在顶层.pro中已设置,否则依赖顺序可能错乱
子项目之间共享头文件或 moc 输出时,局部清理极易导致符号不一致,顶层统一清理是唯一稳妥方式。










