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

2023-11-18

创建时间: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}
         SeetaAgePredictor600
         SeetaAuthorize
         SeetaEyeStateDetector200
         SeetaFaceAntiSpoofingX600
         SeetaFaceDetector600
         SeetaFaceLandmarker600
         SeetaFaceRecognizer610
         SeetaFaceTracking600
         SeetaGenderPredictor600
         SeetaPoseEstimation600
         SeetaQualityAssessor300
         tennis_haswell
         tennis_pentium
         tennis_sandy_bridge
         tennis)

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

 ## 项目根目录
$ 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 如何在 C++ 运行时更改 QML 对象的属性?

    我想在运行时更改 QML 对象的文本 我尝试如下 但文本仍然为空 这是后端类 class BackEnd public QObject Q OBJECT Q PROPERTY QString userFieldText READ userF
  • 有没有办法在没有 QApplication::exec() 的情况下使用 Qt?

    有没有一种安全的方法可以在不调用 QApplication exec 的情况下使用 Qt 我有许多不同的对象正在对多个资源执行长期进程 至少其中一个正在与 Web 应用程序服务器进行通信 我正在制作一个 GUI 应用程序 提示用户在正确的时
  • 程序意外完成 - QT Creator

    我正在尝试使用 QT Creator 使用 QT 框架开发 GUI 控制台应用程序 我使用的是Windows XP 我安装了QT 4 8 3和mingw 两者均已安装 没有任何错误 然后我安装了QT Creator QT 版本 路径中的 Q
  • QDesktopServices::openUrl 在资源管理器中选择指定文件

    在大多数编码程序中 您可以右键单击该项目 然后单击 在资源管理器中显示 它会在资源管理器中显示选定项目的文件 在 Qt 中使用 QDesktopServices 如何做到这一点 或在 QT 中执行此操作的任何方式 您可以使用此方法在 Win
  • QT/QML Android App,点击通知栏时打开应用程序

    我为 Android 应用程序制作了一个 QT 当我单击平板电脑中上面看到的按钮通知栏时 但是 如果单击通知 我的应用程序将打开 聚焦 不知道 并显示黑色窗口 简单来说怎么做呢 我的代码是 package org ays operation
  • (如何)我可以抑制未找到包配置文件的警告吗?

    我正在尝试创建一个CMakeLists txt尝试查找的文件Qt5 如果失败 则尝试回退到Qt4安装 该脚本到目前为止有效 但如果出现以下情况我总会收到警告Qt5未安装 注意FindQt5 cmake是由提供Qt5并且仅当以下情况时才可用Q
  • Qt:将拖放委托给子级的最佳方式

    我在 QWidget 上使用拖放 我重新实现了 DragEnterEvent dragLeaveEvent dragMoveEvent 和 dropEvent 效果很好 在我的 QWidget 中 我有其他 QWidget 子级 我希望它们
  • 有关 CMake 错误的问题:没有为目标提供源

    我正在尝试使用 cmake 和 eclipse 将 FreeRtos 添加到我的项目中 但出现错误 我运行的是 debian 10 我的 cmake 版本是 3 13 4 cmake 的文件可以在以下位置找到这个 git 仓库 https
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • MinGW Make 抛出“系统找不到指定的路径。”错误

    我正在尝试在 Windows 7 上使用 cmake 生成一个 c 项目 在实际创建项目之前 cmake 会对您的工具链进行快速测试 我正在使用 MinGW 这就是我的问题所在 Cmake 触发 make 构建 最终失败并返回 系统找不到指
  • PyQt5:如何使QThread返回数据到主线程

    I am a PyQt 5 4 1 1初学者 我的Python是3 4 3 这是我尝试遵循的many https mayaposch wordpress com 2011 11 01 how to really truly use qthr
  • Qml 模块未找到 CPP 类注册与新的 QML_ELEMENT r

    我尝试使用 Qt5 15 0 和新宏 QML ELEMENT 在 QML 中注册我的自定义 CPP 类 但找不到该模块 Qt Creater 帮助文件描述了 QML ELEMENT 的步骤 我也检查了 Qt 手册 但没有幸福的结局 http
  • Qt:在多个布局中使用一个小部件

    我有一个 QTabBar 所有选项卡都应该有相同的小部件 layout1 gt addWidget w layout2 gt addWidget w 然而打电话addWidget第二次导致该小部件在第一个布局中消失 有没有办法使用一个小部件
  • 如何在 C++ 项目的 Cmake 文件上添加 Mac OS 框架

    我正在尝试将外部库 Vulkan 添加到我的项目中 这个库是预编译的并且有一个框架 我的项目树 build source Entry main cpp include ext vulkan macos include lib Framewo
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • 如何检测QTableView中的双击

    我正在使用 PyQt 创建 GUI 应用程序 在继承自 QTableView 的视图中 需要检测用户双击行时选择的行 该表可以排序 但不能编辑 我该怎么做 注意 尝试了 doubleClicked int 信号 它是由鼠标按钮发出的 而不是
  • 如何从 CMake 构建目标仅生成目标文件 (*.o)?

    我正在尝试使用 CMake 构建一个对象文件 但我似乎无法让 CMake 构建除完整可执行文件之外的其他内容 我基本上是在寻找以下编译的结果 结果将加载到 VxWorks 目标上并然后链接 CC CFLAGS INC DIRS c src
  • 如何在 QtQuick 2 中对 QML TableView 进行排序?

    我想使用 Qt 5 1 实现具有自定义角色的可排序 TableView 但我不知道当用户单击标题时该怎么做才能对其进行排序 在我的 Qt pro 文件中 我添加了 android ios blackberry qtHaveModule wi
  • 在高 dpi Windows 平台上自动重新缩放应用程序?

    我正在编写一个需要在高 dpi Windows 192dpi 而不是 96dpi 上运行的 Qt 应用程序 不幸的是 Qt 框架尚不支持高 dpi 至少在 Windows 上 因此我的应用程序及其所有元素看起来只有应有尺寸的一半 有没有办法
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table

随机推荐

  • Android 安全机制(1)uid 、 gid 与 pid

    1 概述 Android 安全机制来源于Linux 并且以Linux权限管理为基础 要了解Android的安全机制 需要从linux中的安全机制了解开始 而用户的权限管理又是linux安全机制的最基本的一个组成 Android的创新之处是在
  • KVM网卡模式(初探KVM)

    最近在看 KVM虚拟化技术实战与原理解析 这本书 略读了前四章后 开始动手创建并安装一个虚拟机 然后发现一个很严重的问题 就是我没有办法通过ssh连接到虚拟机 linux 也没有办法通过mstsc连到到虚拟机 windows 因为我在创建虚
  • oracle索引监控

    oracle索引是加快查询速度 减少i o操作的 但是如果索引无用的话那他就是浪费资源的 尤其是在做DML操作时 这是 就需要我们查看那些索引是无用的 相关视图 user indexesuser ind columnsv object us
  • java学习03-程序执行三大结构

    一 顺序执行语句 程序运行时 按顺序从上往下执行 二 分支语句 分支运算 if else if 条件 if 条件 else 虽然多个语句块 但是只有一个执行 if 条件 else if 条件 else switch case 不能嵌套 sw
  • 报错Attribute "path" is required and must be specified for element type

    Attribute path is required and must be specified for element type 最近搞一个项目总遇到这个或者类似的问题 其实问题很简单 其实就是batis和MyBatis之间有区别 就是在
  • java8 stream findfirst().get()空指针

    java8 stream findfirst get 空指针 List
  • 【STM32CUBE+IAR+IAP升级】

    STM32CUBE IAR IAP升级 案例应用 利用IAR 串口调试助手对STM32F411VET6进行简单的IAP实现 代码分为两部分 BootLoader APP翻转LED 1 工具 IAR STM32CUBEMX 串口调试助手 IA
  • ResultSet的getDate()、getTime()和getTimestamp()比较

    最近在做一个项目 发现个知识点 记录一下 数据库中存储时间格式为2021 8 11 16 09 28 现在要从ResultSet中取出时间 当然是要包含年月日时分秒的 发现 rs getDate 只是返回日期部分 只精确到天 java sq
  • el-image因src路径问题加载失败

    载入图片目录路径如下 起初 我将路径这样写
  • CDH多租户配置过程中遇到的问题

    多租户是CDH里面非常重要的一部分 从一开始配置KDC到集成KDC 服务使用过程中都有可能会遇到各种各样的问题 下面我举例说下我当时遇过的问题 希望能帮助到大家 服务启动错误 KDC服务配置完成安装完成 CDH集成过程中也没问题 CDH启动
  • WebSocket断开原因分析,再也不怕为什么又断开了

    阅读原文 https wdd js org websocket 1 把错误打印出来 WebSocket断开的原因有很多 最好在WebSocket断开时 将错误打印出来 在线demo地址 https wdd js org websocket
  • 【IP协议(一)】——IP数据报格式及其含义,IP数据报的切分

    个人主页 努力学习的少年 版权 本文由 努力学习的少年 原创 在CSDN首发 需要转载请联系博主 如果文章对你有帮助 欢迎关注 点赞 收藏 一键三连 和订阅专栏哦 IP数据报格式 版本 占4位 指ip协议的版本 首部长度 表示IP数据报中报
  • 短视频矩阵源码

    随着短视频平台的快速发展 越来越多的企业开始关注短视频营销 而矩阵号运营逐渐成为了企业进行短视频营销的常规玩法 那么 矩阵账号如何运作 如何进行短视频矩阵号运营 一 矩阵号怎么搭建 1 选择短视频平台 首先 根据自己企业的特点和目标用户群体
  • 【C语言】结构体

    目录 结构体 结构体类型的声明 结构体的自引用 结构体变量的定义和初始化 结构体内存对齐 计算结构体大小 结构体内存对齐的意义 修改默认对齐数 结构体传参 结构体实现位段 什么是位段 位段的内存分配 位段的应用 结构体 结构体类型的声明 1
  • javascript 字符串判断是否为空

    var a document getElementById notValid if a a为null 或者 或者0 alert javascript 字符串为null 或者是0
  • 安卓Android和Java语言的异同、关系和区别

    安卓Android和Java语言的异同 关系和区别 安卓Android是一种以Linux为基础的开放源码操作系统 主要使用于便携设备 2011年第一季度 安卓在全球的市场份额首次超过塞班系统 跃居全球第一 2012年2月数据 安卓占据全球智
  • Linux Ctrl+ 所有的快捷键

    Ctrl a 光标移到行首 Ctrl b 光标向前移一格 Ctrl c 结束命令 Ctrl d 删除光标所在字符 Ctrl e 光标移到行尾 Ctrl f 光标向后移一格 Ctrl g Ctrl h 删除光标前一格 Ctrl i Ctrl
  • SoC性能指标&ARM内核运算能力

    自动驾驶芯片常用的性能评价指标 TOPS DMIPS GFLOPS分别说的是啥 TOPS Tera Operation Per Second 表示每秒钟可以进行的操作数量 用于衡量自动驾驶的算力 众所周知 汽车上最常用的传感器是摄像头 而与
  • URP——后期处理特效

    通用渲染管道 URP 包括一个后处理效果的集成实现 如果使用URP 则不需要为后期处理效果安装额外的包 URP与Post Processing Stack v2包不兼容 URP使用体积框架进行后期处理效果 下面的图片显示了一个URP场景有没
  • 解决qt中cmake单独存放 .ui, .cpp, .h文件

    创建时间 2023 02 18 17 58 04 设想 项目文件较多 全部放在一个目录下就像依托答辩 希望能将头文件放入include ui文件放入ui 源文件放入src 为了将Qt代码和一般非Qt代码分离开 进一步地 将Qt源文件放入qt