创建时间:2023-02-18 17:58:04

设想

项目文件较多,全部放在一个目录下就像依托答辩。

希望能将头文件放入include,ui文件放入ui,源文件放入src

为了将Qt代码和一般非Qt代码分离开,进一步地:

  • 将Qt源文件放入qt_src,普通源文件放入src
  • 将Qt头文件放入qt_include,普通头文件放入include
  • 将Qt ui文件放入ui

并且使用set(CMAKE_AUTOUIC ON)set(CMAKE_AUTOMOC ON)来让它自己处理。

过程中还是遇到一些问题,通过看官方文档和其他人的提问得以解决,在这里分享一下。

目录结构 && CMakeLists.txt

简化问题,就暂时只搞了顶层一个CMakeLists.txt

(这里只添加了必须的,如果你使用Qt Creator,最好将头文件、ui文件什么的都加进去,不然它里面看不到)

cmake_minimum_required(VERSION 3.1)set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_INCLUDE_CURRENT_DIR ON)set(CMAKE_PREFIX_PATH /opt/Qt/6.3.2/gcc_64 /opt/paddlepaddle)
set(EXE main)
project(${EXE})aux_source_directory(qt_src SRC)
aux_source_directory(src SRC)
aux_source_directory(qt_src SRC)FILE(GLOB QT_INC "qt_include/*.h")
list(APPEND CMAKE_AUTOUIC_SEARCH_PATHS "ui")
add_executable(${EXE} ${SRC} ${QT_INC})find_package(Qt6 REQUIRED COMPONENTS Widgets)
find_package(OpenCV 4 REQUIRED)
find_package(FastDeploy REQUIRED)target_include_directories(${EXE} PUBLIC${FASTDEPLOY_INCS} include qt_include)target_link_directories(${EXE} PUBLIC /usr/lib/seetaface6)
target_link_libraries(${EXE}PUBLIC Qt6::Widgets${OpenCV_LIBS}${FASTDEPLOY_LIBS}SeetaAgePredictor600SeetaAuthorizeSeetaEyeStateDetector200SeetaFaceAntiSpoofingX600SeetaFaceDetector600SeetaFaceLandmarker600SeetaFaceRecognizer610SeetaFaceTracking600SeetaGenderPredictor600SeetaPoseEstimation600SeetaQualityAssessor300tennis_haswelltennis_pentiumtennis_sandy_bridgetennis)

主要看一下根目录,设想里面已经说了我的放置策略。

 ## 项目根目录
$ ls
build  CMakeLists.txt  include  qt_include  qt_src  src  ui

下面是目录详细内容,不过不是我们的重点。

 ## 普通源文件目录
$ ls src
app.cpp         FaceAction_demo.cpp  PPMatting_StaticLib_cpu.cpp  video.cpp
emotion.cpp     handler.cpp          step.cpp
FaceAction.cpp  model.cpp            to.cpp
 ## 普通头文件目录$ ls include
app.h      FaceAction.h  model.h                    step.h  video.h
emotion.h  handler.h     PPMatting_StaticLib_cpu.h  to.h
 ## Qt代码源文件目录$ ls qt_src
cv2seetaimage.cpp  main.cpp           register_widget.cpp  user_info.cpp
faceinfo.cpp       mainfunction.cpp   seetafacetools.cpp
facelogin.cpp      mainwindow.cpp     settingmodel.cpp
login_widget.cpp   register_info.cpp  trans.cpp
 ## Qt头文件目录
$ ls qt_include
cv2seetaimage.h  login_widget.h  register_info.h    settingmodel.h
faceinfo.h       mainfunction.h  register_widget.h  trans.h
facelogin.h      mainwindow.h    seetafacetools.h   user_info.h
 ## ui文件目录$ ls ui
facelogin.ui     mainfunction.ui  register_info.ui    user_info.ui
login_widget.ui  mainwindow.ui    register_widget.ui

问题 && 解决

1. 批量添加ui文件和.h文件

笨方法是手动,把文件一个一个加进去,这样不够方便。
对于源文件,我们都知道可以用aux_source_directory()来添加,但是它只会添加源文件,不会添加目录下的.h文件和.ui文件。

解决方法:

FILE(GLOB UI "ui/*.ui")
FILE(GLOB INC "include/*.h")

提一句,有看到说FILE GLOB邪恶的,也许有什么缺点,暂且没有过度关注。

2. AUTOUIC找不到ui文件

由于采用set(CMAKE_AUTOUIC ON)的方式处理ui文件,编译时会报错找不到ui文件。

需要将ui文件夹加入AUTOUIC的搜索目录,这样AUTOUIC处理时才能找到ui文件。
解决方法:

list(APPEND CMAKE_AUTOUIC_SEARCH_PATHS "ui")

注意:是CMAKE_AUTOUIC_SEARCH_PATHS,而不是AUTOUIC_SEARCH_PATHS。这个把我坑惨了。

接下来可能会继续报错找不到生成的对应的ui_XXX.h头文件,可以尝试以下选项之一:

set(CMAKE_INCLUDE_CURRENT_DIR ON)# 其实只要这一条就够了,后面两条似乎也可以。
include_directories(${CMAKE_BINARY_PATH})
include_directories(${CMAKE_CURRENT_BINRAY_PATH})

因为自动生成的ui_XXX.h头文件是在构建目录下的,添加它即可。

3. AUTOMOC找不到定义(undefined to 'vtable for XXX'

这个是最让我头疼的,cmake官网也没有说怎么解决。(这部分还专门翻译了一下,见我的另一篇博客:cmake-qt AUTOMOC)

看到网上的解释,意思是如果你不在add_executable()中添加使用了Qt元系统的头文件,那么AUTOMOC就不会处理这些头文件。

所以我们把Qt的头文件加入到add_executable()即可,这也是我为什么将普通头文件和Qt头文件分离开的原因之一(因为普通头文件不需要,虽然加上也没错)。

add_executable(${EXE} ${SRC} ${INC})

4. 资源文件

  • 待办

我想后面如果要添加资源文件,那么可能会有类似的问题,遇到了再回来补充。


2023.5.7更新:
资源文件,也就是CMAKE_AUTORCC的篇幅较多,不宜在这里展开,见另一篇博客:
探索qrc,rcc和CMAKE_AUTORCC

解决qt中cmake单独存放 .ui, .cpp, .h文件相关推荐

  1. QT总结第3篇:如何在QT中添加.lib,.dll还有.h文件

    因为我在工作的过程中,使用的是第三方提供的库,但是如何将这些库添加到QT的工程中,是个问题,让我恼火了很久,怎么弄都是错的. 下面,我会对这个问题,进行叙述,希望其他人第一次遇到这种问题的时候,可以轻 ...

  2. QT学习之解决QT中QIcon图标不显示的问题

    QT学习之解决QT中QIcon图标不显示的问题 参考文章: (1)QT学习之解决QT中QIcon图标不显示的问题 (2)https://www.cnblogs.com/yang12318/p/1069 ...

  3. 解决QT中使用不了搜狗中文输入法的问题

    环境:ubuntu15.04/QT5.6.0 背景:最近开发用到QT5.6.0,在ubuntu中输入汉字使用的搜狗输入法,但是在QT中无法切换到搜狗输入法,手动能切换,但是切换后仍然无法打出汉字,在其 ...

  4. 成功解决Qt中ui_xxx.h: no such file or directory”

    写了一个登录(单独一个项目),然后我想把它移到主项目中,头文件.执行文件及ui都是复制过来的,所以运行的时候就报错"ui_xxx.h: no such file or directory&q ...

  5. linux中安装百度输入法-----解决QT中使用百度输入法问题

    下载百度输入法Ubuntu链接 1.解压下载后的压缩包 2.按照里面的.docx文件操作设置 3.重启系统 sudo reboot 安装成功如图所示 如果想在QT中使用百度输入法,我们会发现并不可以, ...

  6. Windows下Qt+minGW+CMake+opencv配置--方法总结、文件分享与排错分享

    文章目录 1. 配置环境与概述 2.参考方法 3. minGW32-make遇到的错误 3.1. 解决策略 3.2. 解决步骤 3.3 源文件分享 4. Qt配置 4.1 将bin文件加入环境变量 4 ...

  7. qt中显示文件夹下的目录及文件的过滤

    第一种方法:QDirModel + QSortFilterProxyModel的子类 写一个类,继承QSortFilterProxyModel,重写filterAcceptsRow方法 mysortf ...

  8. 在QT中调用google earth并打开KML文件

    最近由于项目需求,需要在自己做的软件中调用卫星地球,笔者先后尝试了高德.百度和谷歌地球,最后选择了谷歌地球.原因在于高德地图的卫星地球模式清晰度完全不能满足使用要求:百度地图的清晰度虽然可以满足使用要 ...

  9. Qt中使用qrc管理和使用资源文件

    qrc资源文件一直有点搞不清楚,特别是前缀,到底加什么,讲的不太清楚,我的项目也因此搞的很乱.现在总结一下. 1. 比如qss资源文件,我在Resources文件夹下新增一个qss.qrc文件,这个文 ...

最新文章

  1. h5 getUserMedia error PermissionDeniedError
  2. linux常见协议对应端口(后期补充)
  3. setBackgroundDrawable和setBackgroundColor的用法(转)
  4. Apache防DDOS模块mod_evasive的安装配置和使用
  5. SAP Fiori refreshSecurityToken
  6. rest_framework06:自动生成路由\action使用\认证
  7. Fragment生命周期与宿主Activity生命周期
  8. Spring(6)---自动装配Beans
  9. python中string.digits_Python string.hexdigits方法代码示例
  10. 如何购买 iFace
  11. 解决svn报错 : The pristine text with checksum 'e006b124faa4ddf60d8773d1855e6bfa56145874' was not fou
  12. 实例总结C#反射基础知识[原创]
  13. 【操作系统】30天自制操作系统--(26)LDT与库
  14. html中的表格和表单设计总结
  15. 用python做股市数据分析一_用python做股票数据分析(兴趣篇)
  16. matlab 将图片转为视频
  17. 仿电池电量充电、上下左右剪切动画
  18. Qt+百度API实现人脸对比寻找明星脸
  19. 结构体的内存对齐规则
  20. 《马云如是说》:马云经典语录大全

热门文章

  1. non-saturating neurons非饱和神经元、saturating neurons饱和神经元 的含义和区别
  2. GitKraken安装与使用详解
  3. 浅析低延迟Camera架构
  4. 干货 | 浅谈携程大住宿研发效能提升实践
  5. 西门子PLC如何设NTP网络时间同步(全解)
  6. 视频【解码】原理(播放器原理),音视频同步等
  7. Intellj IDEA 配置Git/码云插件,团队协同开发
  8. Typora页内跳转
  9. 让机器人学会社交技能
  10. Newton型的Hermite差值(数值计算方法)