一、问题现象

一打开vs就报错,没有生成ui_mainwindow.h,经查看没有生成out目录

二、原因分析

ui 文件未添加到可执行文件的源列表,只添加了cpp文件

虽然 AUTOUIC 开启,但 CMake 需要知道哪些 .ui 文件属于当前目标,才会为其调用 uic

三、解决方案

方案1

将 .ui 文件也加入 add_executable

方案2

无需将.ui 文件加入源文件列表,改用全局变量,在顶层 CMakeLists.txt 中,

set(CMAKE_AUTOUIC ON) 必须在 project() 命令之后,且在创建任何目标(add_executable / add_library)之前。

或者使用 Qt6 推荐的:qt_standard_project_setup()Qt版本>=6.3

这样所有目标自动开启,且无需将 .ui 文件加入源列表。

qt_standard_project_setup()必须放在find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets)之后,add_executable(...)之前

qt_standard_project_setup()  这个函数会自动设置 CMAKE_AUTOMOC、CMAKE_AUTOUIC、CMAKE_AUTORCC 为 ON(以及其他标准设置)。因此所有子目录都自动启用了这两个功能。

CMAKE_AUTOUIC 不需要显式添加 .ui 文件到源列表

CMAKE_AUTOUIC 启用时,CMake 会扫描目标的所有源文件(包括 .cpp 和 .h),查找 #include "ui_*.h" 这样的预处理指令。一旦发现,CMake 会自动在源文件所在目录(以及 CMAKE_CURRENT_SOURCE_DIR)中查找对应的 .ui 文件(例如 #include "ui_a.h" 会查找 a.ui),然后调用 uic 工具生成 ui_*.h 头文件。

不需要将 .ui 文件显式添加到 add_library 或 add_executable 的源列表中。

只要 .ui 文件和包含 #include "ui_*.h" 的 .cpp 文件位于同一目录(或子目录,且能被 CMake 找到),CMAKE_AUTOUIC 就会自动处理。

四、AUTOUIC ON 和 CMAKE_AUTOUIC ON 有什么区别?

1、作用范围

设置 作用域 类型 生效时机
CMAKE_AUTOUIC 全局(整个项目) CMake 变量(通常为缓存变量) 在 project() 之后设置,影响所有后续定义的目标
AUTOUIC 局部(单个目标) 目标属性 仅影响调用 set_target_properties 时指定的那个目标

目标属性 AUTOUIC 的优先级高于全局变量 CMAKE_AUTOUIC

2、行为差异

全局 CMAKE_AUTOUIC ON

不需要 .ui 文件显式添加到目标源列表。CMake 会扫描源文件中的 #include "ui_*.h",并在源文件所在目录自动查找对应的 .ui 文件并处理。

仅目标属性 AUTOUIC ON

将 .ui 文件显式添加到目标源列表。CMake 要求将 .ui 文件明确列在 add_executable 或 add_library 的源文件列表中,否则不会生成 ui_*.h

3、示例对比

全局方式(推荐,简洁)

cmake_minimum_required(VERSION 3.12)
project(MyApp)
set(CMAKE_AUTOUIC ON)          # 全局开启
add_executable(myapp main.cpp) # 不需要列出 .ui 文件,CMake 会扫描 #include "ui_*.h" 自动处理

目标属性方式

cmake_minimum_required(VERSION 3.12)
project(MyApp)
add_executable(myapp main.cpp mainwindow.ui)  # 必须显式添加 .ui 文件
set_target_properties(myapp PROPERTIES AUTOUIC ON)

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐