如何使用CMake从任意目录的Qt UI文件生成对应ui_源文件
可行的两种可靠解决方案
方案1:AUTOUIC 自动扫描方案(推荐,改动最小)
你之前配置未生效大概率是未满足全部必要配置条件,完整配置逻辑如下:
- 开启AUTOUIC属性:全局设置
set(CMAKE_AUTOUIC ON),或针对单目标设置set_target_properties(你的目标名 PROPERTIES AUTOUIC ON) - 配置UI搜索路径为绝对路径,避免相对路径寻址失败:全局设置
set(CMAKE_AUTOUIC_SEARCH_PATHS ${PROJECT_SOURCE_DIR}/你的UI文件夹相对项目根的路径),或单目标设置set_target_properties(你的目标名 PROPERTIES AUTOUIC_SEARCH_PATHS ${PROJECT_SOURCE_DIR}/你的UI文件夹相对项目根的路径) - 所有包含
ui_xxx.h的C++源文件必须加入目标的源文件列表,AUTOUIC依靠扫描源文件中的include声明匹配对应UI文件 - 将生成的
ui_xxx.h所在目录(默认是当前CMakeLists.txt对应的构建目录${CMAKE_CURRENT_BINARY_DIR})加入目标的头文件搜索路径
完整示例:
cmake_minimum_required(VERSION 3.16) project(OldQtProject LANGUAGES CXX) # 开启Qt自动编译相关配置 set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) # 指定UI文件夹的绝对路径 set(CMAKE_AUTOUIC_SEARCH_PATHS ${PROJECT_SOURCE_DIR}/custom_ui_dir) find_package(Qt5 REQUIRED COMPONENTS Widgets Core Gui) add_executable(your_app src/main.cpp src/mainwindow.cpp include/mainwindow.h # UI文件不需要显式加入列表,AUTOUIC会自动扫描匹配 ) target_include_directories(your_app PRIVATE ${PROJECT_SOURCE_DIR}/include # 必须加入构建目录,才能找到生成的ui_xxx.h ${CMAKE_CURRENT_BINARY_DIR} ) target_link_libraries(your_app PRIVATE Qt5::Widgets Qt5::Core Qt5::Gui)
方案2:显式qt_wrap_ui 方案(兼容性更强,适合复杂目录结构)
之前配置未生效通常是未将生成的头文件加入目标依赖,完整配置逻辑如下:
- 扫描独立UI文件夹下的所有UI文件
- 调用
qt_wrap_ui生成对应ui_xxx.h的文件列表 - 将生成的头文件列表显式加入目标的源文件列表
- 同样将构建目录加入头文件搜索路径
完整示例:
cmake_minimum_required(VERSION 3.10) project(OldQtProject LANGUAGES CXX) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) find_package(Qt5 REQUIRED COMPONENTS Widgets Core Gui) # 扫描UI文件夹下的所有ui文件 file(GLOB UI_FILES ${PROJECT_SOURCE_DIR}/custom_ui_dir/*.ui) # 生成ui_xxx.h的文件列表,Qt6则用qt6_wrap_ui qt5_wrap_ui(UI_GENERATED_HEADERS ${UI_FILES}) add_executable(your_app src/main.cpp src/mainwindow.cpp include/mainwindow.h # 必须把生成的头文件列表加入目标源文件 ${UI_GENERATED_HEADERS} ) target_include_directories(your_app PRIVATE ${PROJECT_SOURCE_DIR}/include ${CMAKE_CURRENT_BINARY_DIR} ) target_link_libraries(your_app PRIVATE Qt5::Widgets Qt5::Core Qt5::Gui)
常见失效排查点
- 所有路径尽量使用带
${PROJECT_SOURCE_DIR}前缀的绝对路径,避免相对路径寻址错误 - 多目录嵌套的CMake结构中,
CMAKE_AUTOUIC_SEARCH_PATHS是当前CMakeLists.txt作用域生效,子目录需要单独配置 - 配置修改后清理整个build目录重新生成缓存,旧缓存可能导致新配置不生效
- 大小写敏感的系统中,要保证UI文件名和代码中
ui_xxx.h的xxx部分大小写完全一致
内容的提问来源于stack exchange,提问作者RAM
相关产品推荐
相关产品推荐

