CMake中添加Qt模块的合理方法

CMake+QT使用教程 05 QT+CMake使用教程 阅读详情
AI摘要

本文详细介绍如何在CMake工程中集成Qt,包括设置库路径、查找模块、配置自动选项及链接库。同时,提供了完整的CMake示例,并概述了Qt各模块功能。

用CMake来组织的工程中要用Qt首先要设置、找到Qt相关模块。主要是通过find_package这个CMake命令。但网上很多教程都过时了,或者不够清晰灵活。因为这部分很常用,所以特别用一篇文章把我们目前在生产环境中使用的方法给大家介绍下。

设置Qt库路径

Qt版本很多,我们的开发机上一般也装有多个不同版本的Qt。个人尝试性的项目一般用最新版的Qt,而真正发布的产品一般用的是LTS版本Qt(LTS:Long Term Support,长期支持版本,目前最新的LTS是5.9)。

我们的方法是在系统中添加多个环境变量。例如我电脑上装有4个版本:Qt 5.9.4和Qt5.10.1的32位和64位库。所以有4个环境变量:

  

环境变量名值
QTDIR594C:\Qt\Qt5.9.4\5.9.4\msvc2015
QTDIR594_64C:\Qt\Qt5.9.4\5.9.4\msvc2015_64
QTDIR5101C:\Qt\Qt5.10.1\5.10.1\msvc2015
QTDIR5101_64C:\Qt\Qt5.10.1\5.10.1\msvc2015_64

然后在CMakeLists中添加:

set(CMAKE_PREFIX_PATH $ENV{QTDIR594})

通过在$ENV{}里选择不同的环境变量就可以切换不同的Qt版本。

查找Qt模块

网上很多CMake查找Qt方法都是过时的Qt4的方法。现在正确的、最新的方法是:

find_package(Qt5 COMPONENTS Core Gui Qml Quick REQUIRED)

Components后面加的就是这个工程中会用到的Qt模块,例如上面就用到了Core、Gui、Qml、Quick这几个模块,也是一般一个Qt Quick程序必须用到的几个模块。

打开相关自动选项

Qt Quick程序中的QRC资源文件需要用rcc来进行预处理,生成相应.h和.cpp文件。QObject派生的C++类也需要通过moc进行处理。这些都是编译系统中所谓的Rules。CMake中通过打开下面两个选项可以自动对这些后缀的文件进行相应处理:

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

由于生成的C++文件都是放在编译目录里的(在Shadow Building中有别于源码目录),所以还需要将编译目录包含到Include目录,否则编译器会找不到这些头文件:

set(CMAKE_INCLUDE_CURRENT_DIR ON)

链接时设置相应模块

最后一步是在链接的时候把用到的Qt库写上去:

target_link_libraries(${PROJECT_NAME}  Qt5::Core Qt5::Gui Qt5::Qml Qt5::Quick)

这样就能链接上用到的Qt库了。

完整的CMake例子

上面只是着重说明了CMake关于添加Qt模块的代码,一个完整的CMake例子肯定不止上面这些。下面就贴出一个完整的例子:

 

cmake_policy(VERSION 3.9)
project(Demo VERSION 0.1)
cmake_minimum_required(VERSION 3.9)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_PREFIX_PATH $ENV{QTDIR594})
find_package(Qt5 COMPONENTS Core Gui Qml Quick REQUIRED)

set(HEADERS 
    appglobal.h
)

set(SOURCES 
    main.cpp
    appglobal.cpp
)

set(RESOURCES 
    qml.qrc
)

set(QMLS
    main.qml
)

add_executable(${PROJECT_NAME} ${HEADERS} ${SOURCES} ${RESOURCES} ${QMLS})
target_link_libraries(${PROJECT_NAME}  Qt5::Core Qt5::Gui Qt5::Qml Qt5::Quick)

 

 

当需求复杂之后CMake中还会有很多命令,这个以后我们介绍具体技术的时候再讲。

 

自己写的例子:
cmake_minimum_required(VERSION 2.8)
project(Demo)
set(CMAKE_PREFIX_PATH /home/qilin64/Qt5.6.0/5.6/)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
file(GLOB_RECURSE SOURCES "*.cpp")
file(GLOB_RECURSE HEADERS "*.h")
file(GLOB_RECURSE FORMS "*.ui")
file(GLOB_RECURSE RESOURCES "*.qrc")
find_package(Qt5 COMPONENTS Core Gui Qml Quick Widgets REQUIRED)
add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS} ${FORMS} ${RESOURCES})
target_link_libraries(${PROJECT_NAME}  Qt5::Core Qt5::Gui Qt5::Qml Qt5::Quick Qt5::Widgets)

 

qt的模块介绍

Qt 基础模块分为以下几个:

Qt Core,提供核心的非 GUI 功能,所有模块都需要这个模块。这个模块的类包括了动画框架、定时器、各个容器类、时间日期类、事件、IO、JSON、插件机制、智能指针、图形(矩形、路径等)、线程、XML 等。所有这些类都可以通过  头文件引入。

Qt Gui,提供 GUI 程序的基本功能,包括与窗口系统的集成、事件处理、OpenGL 和 OpenGL ES 集成、2D 图像、字体、拖放等。这些类一般由 Qt 用户界面类内部使用,当然也可以用于访问底层的 OpenGL ES 图像 API。Qt Gui 模块提供的是所有图形用户界面程序都需要的通用功能。

Qt Multimedia,提供视频、音频、收音机以及摄像头等功能。这些类可以通过  引入,而且需要在 pro 文件中添加 QT += multimedia。

Qt Network,提供跨平台的网络功能。这些类可以通过  引入,而且需要在 pro 文件中添加 QT += network。

Qt Qml,提供供 QML(一种脚本语言,也提供 JavaScript 的交互机制) 使用的 C++ API。这些类可以通过  引入,而且需要在 pro 文件中添加 QT += qml。

Qt Quick,允许在 Qt/C++ 程序中嵌入 Qt Quick(一种基于 Qt 的高度动画的用户界面,适合于移动平台开发)。这些类可以通过  引入,而且需要在 pro 文件中添加 QT += quick。

Qt SQL,允许使用 SQL 访问数据库。这些类可以通过  引入,而且需要在 pro 文件中添加 QT += sql。

Qt Test,提供 Qt 程序的单元测试功能。这些类可以通过  引入,而且需要在 pro 文件中添加 QT += testlib。

Qt Webkit,基于 WebKit2 的实现以及一套全新的 QML API(顺便说一下,Qt 4.8 附带的是 QtWebkit 2.2)。

 

Qt 扩展模块则有更多的选择:

Qt 3D,提供声明式语法,在 Qt 程序中可以简单地嵌入 3D 图像。Qt 3D 为 Qt Quick 添加了 3D 内容渲染。Qt 3D 提供了 QML 和 C++ 两套 API,用于开发 3D 程序。

Qt Bluetooth,提供用于访问蓝牙无线设备的 C++ 和 QML API。

Qt Contacts,用于访问地址簿或者联系人数据库的 C++ 和 QML API。

Qt Concurrent,封装了底层线程技术的类库,方便开发多线程程序。

Qt D-Bus,这是一个仅供 Unix 平台使用的类库,用于利用 D-Bus 协议进行进程间交互。

Qt Graphical Effects,提供一系列用于实现图像特效的类,比如模糊、锐化等。

Qt Image Formats,支持图片格式的一系列插件,包括 TIFF、MNG、TGA 和 WBMP。

Qt JS Backend,该模块没有公开的 API,是 V8 JavaScript 引擎的一个移植。这个模块仅供 QtQml 模块内部使用。

Qt Location,提供定位机制、地图和导航技术、位置搜索等功能的 QML 和 C++ API。

Qt OpenGL,方便在 Qt 应用程序中使用 OpenGL。该模块仅仅为了程序从 Qt 4 移植到 Qt 5 的方便才保留下来,如果你需要在新的 Qt 5 程序中使用 OpenGL 相关技术,需要使用的是 QtGui 模块中的 QOpenGL。

Qt Organizer,使用 QML 和 C++ API 访问组织事件(organizer event)。organizer API 是 Personal Information Management API 的一部分,用于访问 Calendar 信息。通过 Organizer API 可以实现:从日历数据库访问日历时间、导入 iCalendar 事件或者将自己的事件导出到 iCalendar。

Qt Print Support,提供对打印功能的支持。

Qt Publish and Subscribe,为应用程序提供对项目值的读取、导航、订阅等的功能。

Qt Quick 1,从 Qt 4 移植过来的 QtDeclarative 模块,用于提供与 Qt 4 的兼容。如果你需要开发新的程序,需要使用 QtQuick 模块。

Qt Script,提供脚本化机制。这也是为提供与 Qt 4 的兼容性,如果要使用脚本化支持,请使用 QtQml 模块的 QJS* 类。

Qt Script Tools,为使用了 Qt Script 模块的应用程序提供的额外的组件。

Qt Sensors,提供访问各类传感器的 QML 和 C++ 接口。

Qt Service Framework,提供客户端发现其他设备的服务。Qt Service Framework 为在不同平台上发现、实现和访问服务定义了一套统一的机制。

Qt SVG,提供渲染和创建 SVG 文件的功能。

Qt System Info,提供一套 API,用于发现系统相关的信息,比如电池使用量、锁屏、硬件特性等。

Qt Tools,提供了 Qt 开发的方便工具,包括 Qt CLucene、Qt Designer、Qt Help 以及 Qt UI Tools 。

Qt Versit,提供了对 Versit API 的支持。Versit API 是 Personal Information Management API 的一部分,用于 QContacts 和 vCard 以及 QOrganizerItems 和 iCalendar 之间的相互转换。

Qt Wayland,仅用于 Linux 平台,用于替代 QWS,包括 Qt Compositor API(server)和 Wayland 平台插件(clients)。

Qt WebKit,从 Qt 4 移植来的基于 WebKit1 和 QWidget 的 API。

Qt Widgets,使用 C++ 扩展的 Qt Gui 模块,提供了一些界面组件,比如按钮、单选框等。

Qt XML,SAX 和 DOM 的 C++ 实现。该模块已经废除,请使用 QXmlStreamReader/Writer。

Qt XML Patterns,提供对 XPath、XQuery、XSLT 和 XML Schema 验证的支持

 

【Qt QML】用CMake管理Qt工程 CMake是一个开源、跨平台的工具系列,用于构建、测试和打包软件。CMake使用简单的独立配置文件来控制软件编译过程。与许多跨平台系统不同,CMake被设计为与本地构建环境结合使用。下面我们在CMake项目中使用Qt的最基本方法。首先,创建一个基本的控制台应用程序。然后,将该项目扩展为使用Qt Widgets的GUI应用程序。 阅读详情

相关推荐

Qt5 CMake环境配置

Qt5 CMake环境配置

izwmain的博客 7616

CMake教程——QT项目使用CMake

Qt & Cmake

一个老菜鸟的学习分享 1万+

VS Code上,QT基于cmake,qmake的构建方法(非常详细)

最近,由于认证了github的学生用户,想在VS Code上,将各类语言开发环境统一起来。而在VS Code上进行QT开发,在找了一圈优快云上的博客后,感觉并不全面,跟着尝试还是会出各种各样的问题,因此,在走通cmake/qmake的QT环境配置后,这里予以记录,便于自己日后查询,也给大家一些参考,能够尽量减小消耗这种配置环境的无用功时间。

qq_38606680的博客 8306

Qt扫盲-CMake 使用概述

CMake是一个简化跨不同平台开发项目的构建过程的工具。对C++来说其实就是生成一个文件,文件里面描述了,怎么组织这个工程,用编译器怎么编译这个项目之类的,这个CMake 本身不是一个编译器,其实就是生成一个让编译器能读懂编译流程的文件工具。让CMake自动生成构建系统,例如Makefiles和Visual Studio项目文件。CMake是一个第三方工具,有自己的文档。这里就是介绍一下在Qt 5中使用CMake 3.5 系列,反正是 CMake 3系列。

洪源兄 7429

CMake 中合理添加 Qt 模块:find_package 与 imported target 实践

在 C++ 跨平台开发中,CMake 作为构建系统,通过 find_package 发现依赖库,并利用 imported target 管理编译定义、包含路径和链接依赖。Qt 模块(如 Core、Widgets、Network)的引入需要遵循现代 CMake 的配置文件模式,以确保依赖传递和跨版本兼容。合理使用 find_package 和 imported target 能显著提升工程的可维护性,避免手动拼路径导致的链接错误和部署问题。典型应用场景包括 Qt5/Qt6 共存、静态链接、多目标工程以及跨平台

weixin_28834765的博客 183

[Qt] QT5 CMake进行开发

首先使用进行QT工程的配置,无论是那个工程都叫。所以一定要会写这个词。一个字母也不能写错。版本要求,通常一个 CMakeLists.txt 开头都是这一行代码。因为 CMake一直在发展,旧的 CMake肯定没有一些新特性,比起到执行到那个新特性来报错,不如第一行就检查版本信息。首先这个和生成的可执行程序名称没有什么关系。Cmake命令之project介绍#uic用于将UI文件转换为 .cpp/.h文件#moc编译器用于展开源文件中的Q_OBJECT宏,会生成额外的源文件,信号函数的实现等等。

qq_47500842的博客 1568

cmake qt 添加路径 项目_CMake中添加Qt模块的合理方法

https://www.jianshu.com/p/7eeb6f79a275 转载自这里用CMake来组织的工程中要用Qt首先要设置、找到Qt相关模块。主要是通过find_package这个CMake命令。但网上很多教程都过时了,或者不够清晰灵活。因为这部分很常用,所以特别用一篇文章把我们目前在生产环境中使用的方法给大家介绍下。设置Qt库路径Qt版本很多,我们的开发机上一般也装有多个不同版本的Qt...

weixin_42458021的博客 1104

OpenCV使用CMake和MinGW的编译安装及其在Qt配置运行_qtopencv mingw编译的release

使用 MSVC 的话,直接在里面就有了,配置好路径就可以使用。

2401_87555719的博客 1451

CMake中加入Qt模块的合理方法

用CMake来组织的工程中要用Qt首先要设置、找到Qt相关模块。 主要是通过`find_package`这个CMake命令。 我在配置cmakelists的时候遇到了很坑,网上有很多教程讲的很不详细,这里我将我的方法分享给大家。

Albert_weiku的博客 2569

SAP 销售订单及发票 利润中心替代 Userexit出口 配置及程序

在跨公司销售业务中,跨公司销售订单的发票时无法从销售订单中将利润中心带到发票中,所以在跨公司的发票创建过程中需要配置出口来获取对应销售订单行项目的利润中心。 事务代码: 0KEM 配置步骤: 1、创建一个新的替代 2、创建一个步骤 3、维护一个先决条件,比如针对于特定工厂 PCASUB-VKBUR = '0001' 4、选择替代程序FORM,FORM必须为指定程序中存在的FORM名 5、编辑替代程序FORM 实现效果: 在程序FORM中打上断点 ...

李威威wiwi的博客 5068

别让PEX和后仿真拖后腿:Calibre与Virtuoso ADE联调的那些‘坑’与最佳实践

本文深入探讨了Calibre与Virtuoso ADE在PEX寄生参数提取和后仿真联调中的常见问题与解决方案。针对DRC/LVS验证通过后出现的网表导入错误和仿真波形异常,提供了七大典型场景的实战经验,包括PEX提取模式选择、CalibreView生成细节、环境变量配置等关键环节的最佳实践,助力工程师高效完成芯片设计验证。

weixin_33695450的博客 390

qt为什么转向用cmake放弃qmake

Qt从qmake转向CMake是其构建系统的重大转型,Qt6全面采用CMake。CMake优势包括:强大的跨平台支持、无缝集成第三方库、符合现代C++标准、完整的开发生命周期支持以及更好的模块化管理。Qt放弃qmake因其局限性,自研的qbs也因生态问题失败。CMake已成为C++构建的事实标准,被主流IDE广泛支持。开发者应优先选择CMake构建新项目,旧项目可逐步迁移。Qt这一转型降低维护成本,拥抱开源生态,为开发者提供更强大、标准的构建体验。

m0_73482095的博客 1004

手把手教你用CCS v7.3调试TI DSP28377:从连接仿真器到看懂Flash里的秘密

本文详细介绍了使用CCS v7.3调试TI DSP28377的全过程,从连接仿真器到解析Flash启动机制。通过实战演示和关键配置要点,帮助工程师快速掌握DSP调试技巧,并深入探讨bootloader设计与在线升级的实现方法,提升开发效率。

weixin_29158413的博客 407

QT项目使用CMake

1.00++17。

极地星辰 3457

Microsoft Bitlocker企业级管理部署方案

BitLocker是Windows 10以及更高版本中内置的磁盘加密工具,是一种可靠的数据保护机制,可以保护计算机上的敏感数据不被未经授权的人访问。BitLocker的工作原理是将整个系统卷或其他数据卷加密的同时,向某个可信软件或硬件模块请求密钥解密数据。BitLocker最大的好处在于其内置于Windows系统,所以用户无需安装其他软件或购买额外的许可证或硬件设备。本文将介绍Microsoft BitLocker企业级管理部署方案,包括:BitLocker部署前的准备工作。

xueyunshengling的博客 2073

基于STM32的智能鞋柜系统设计与实现

摘要:本文设计并实现了一种基于STM32F103C8T6单片机的智能鞋柜系统。该系统通过DHT11温湿度传感器、PM2.5粉尘传感器和MQ-135空气质量传感器构建多维度环境监测网络,结合光电红外传感器和光敏传感器实现柜门状态识别与智能照明。系统采用分层控制策略,当温度低于15℃或湿度高于65%时自动启动加热和通风,PM2.5超标时启动通风,污染物浓度升高时激活紫外线杀菌。创新性地实现了柜门状态与紫外线消毒的双保险互锁机制,确保使用安全。测试结果表明,系统温湿度控制精度达±0.4℃/±2.0%RH,PM2.

3254968421的博客 252

CMake指令:find_package在Qt中的应用

本文介绍了在CMake中使用find_package集成Qt库的最佳实践。主要内容包括:1)基本语法与版本选择,通过find_package(Qt5/Qt6)指定版本和组件;2)Qt核心组件功能说明,如Core、Widgets、Gui等模块;3)配置模式工作流程,包括路径查找、版本验证和导入目标生成;4)完整示例展示如何构建Qt GUI应用,包括自动处理MOC/UIC/RCC;5)常见问题解决方案,如路径设置、组件缺失等。文章强调通过正确配置可提升构建效率和跨平台兼容性。

红军不怕远征难,万水千山只等闲 2871

9、硬件工程师笔试面试知识器件篇——三极管(2025版本)

本文全面介绍了三极管的基础知识与应用,包括其结构、类型、工作原理、工作状态、功能、应用场景及特性参数。详细探讨了三极管在信号放大、无线通信、音频设备及医疗设备中的具体应用,并深入分析了设计放大电路时如何平衡增益与噪声、优化偏置电路以提高稳定性、使用负反馈改善性能等关键问题。此外,文章还涵盖了高频电路设计、温度补偿策略、电磁干扰防护等实用内容,为硬件工程师提供了全面的技术参考和设计指导。

XU157303764的博客 7310
上一篇: kylin(ubuntu like) 桥接模式连接网络
下一篇: ubuntu or ubuntu like to solve error: QtQml/QQmlApplicationEngine: No such file or directory
mtOS1573
博客等级 码龄15年 305粉丝 188原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值