Qt项目CMake配置报错:forms目录下.ui文件无法被识别
解决Qt CMake项目中UI文件路径识别问题
问题根源
你启用了CMAKE_AUTOUIC,这个机制会自动扫描源文件里的#include "ui_*.h"语句,然后去源文件所在的目录找对应的.ui文件。你的mainwindow.cpp在src目录,但mainwindow.ui放在forms目录里,AUTOUIC自然找不到。另外你手动调用qt6_wrap_ui的操作和AUTOUIC的自动处理逻辑冲突,进一步导致路径识别混乱。
两种解决方案
方案1:配置AUTOUIC的搜索路径(推荐)
保留CMAKE_AUTOUIC的便捷性,只需要告诉它去forms目录找UI文件即可:
- 在CMakeLists.txt里,创建目标之后添加以下配置:
# 让项目能找到include目录下的头文件 target_include_directories(MyProject PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include) # 指定AUTOUIC去forms目录搜索UI文件 set_target_properties(MyProject PROPERTIES AUTOUIC_SEARCH_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/forms )
- 删除你手动写的
qt6_wrap_ui代码块——AUTOUIC会自动处理UI文件,不需要手动包裹。
方案2:禁用AUTOUIC,手动处理UI文件
如果非要保留手动调用qt6_wrap_ui的写法,需要禁用AUTOUIC,并确保生成的UI头文件能被源文件找到:
- 注释或删除
set(CMAKE_AUTOUIC ON)这一行; - 给目标添加临时生成目录的包含路径,让源文件能找到
ui_mainwindow.h:
qt6_wrap_ui(UI_FILES ${CMAKE_CURRENT_SOURCE_DIR}/forms/mainwindow.ui ) # 让项目包含UI头文件的生成目录 target_include_directories(MyProject PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
优化后的完整CMakeLists.txt(方案1版本)
cmake_minimum_required(VERSION 3.5) project(MyProject VERSION 0.1 LANGUAGES CXX) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) # 保留自动UI处理 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets) set(PROJECT_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/mainwindow.cpp ) if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) qt_add_executable(MyProject MANUAL_FINALIZATION ${PROJECT_SOURCES} ) else() if(ANDROID) add_library(MyProject SHARED ${PROJECT_SOURCES} ) else() add_executable(MyProject ${PROJECT_SOURCES} ) endif() endif() # 配置头文件包含路径和UI文件搜索路径 target_include_directories(MyProject PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include) set_target_properties(MyProject PROPERTIES AUTOUIC_SEARCH_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/forms ) target_link_libraries(MyProject PRIVATE Qt${QT_VERSION_MAJOR}::Widgets) if(${QT_VERSION} VERSION_LESS 6.1.0) set(BUNDLE_ID_OPTION MACOSX_BUNDLE_GUI_IDENTIFIER com.example.MyProject) endif() set_target_properties(MyProject PROPERTIES ${BUNDLE_ID_OPTION} MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} MACOSX_BUNDLE TRUE WIN32_EXECUTABLE TRUE ) include(GNUInstallDirs) install(TARGETS MyProject BUNDLE DESTINATION . LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) if(QT_VERSION_MAJOR EQUAL 6) qt_finalize_executable(MyProject) endif()
内容的提问来源于stack exchange,提问作者Thomas A Mathew
相关产品推荐
相关产品推荐

