windows下使用VS2019 + CMake 进行Qt开发记录

news2024/12/25 23:49:54

windows下使用VS2019 + CMake 进行Qt开发

  • 前言
  • 一、准备工作
  • 二、VS2019 + cmake3.20 + Qt
    • 1.VS2019新建一个cmake工程
    • 2.修改CMakelist.txt
    • 3.运行测试
  • 总结


前言

注意:本文讲的是vs2019 + cmake的方式开发Qt程序。

常言道:工欲善其事必先利其器。工具利用的好,事半功倍。
熟悉Qt的人都知道开发Qt程序ide可以使用qtcreator, 在windows下我们还可以选择vs studio进行Qt开发,vs的调试能力确实非同一般,vs+qt方式开发的时候可以安装Qt VS Tool插件,然后就能以.sln工程进行Qt开发。本文不探讨常用的Qt VS Tool插件方式,而是vs + cmake方式。从vs2017 RC开始直接支持cmake工程的开发,这将大大有利于我们去编写跨平台工程。


当然本身qtcreator就支持了cmake工程开发,但是能qtcreator的debug能力很弱,所以才会借助vs开发

一、准备工作

1.安装vs2019以上版本
2.安装cmake(最好3.5以上版本,也可vs勾选安装cmake工具)

二、VS2019 + cmake3.20 + Qt

1.VS2019新建一个cmake工程

选择创建新项目,然后选择CMake项目
在这里插入图片描述


工程结构:
在这里插入图片描述
这里有CMakePresets.json和CMakeUserPresets.json俩个文件, 不用去管它,这个是vs自动生成用来记录平台和设置信息的。

2.修改CMakelist.txt

cmake_minimum_required(VERSION 3.8)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

if(MSVC)
    #set(CMAKE_WIN32_EXECUTABLE ON)
    set(QT_VERSION_MAJOR 5)
endif()

set(QT_PREFIX_PATH "D:/Qt/Qt5.12.12/5.12.12/msvc2017_64")
set(CMAKE_PREFIX_PATH ${QT_PREFIX_PATH})
# set(Qt${QT_VERSION_MAJOR}_DIR "${QT_PREFIX_PATH}/lib/cmake/Qt5")

include_directories(
    ${QT_PREFIX_PATH}/include
    ${CMAKE_CURRENT_SOURCE_DIR}/include
)

find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets REQUIRED)

file(GLOB QT_FORMS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} form/*.ui)
file(GLOB QT_RESOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} resources/*.qrc)
file(GLOB_RECURSE QT_MOC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} include/*.h)
file(GLOB_RECURSE PROJECT_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} src/*.cpp)

if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    QT6_ADD_RESOURCES(QT_RESOURCES_FILES ${QT_RESOURCES})
    QT6_WRAP_UI(QT_FORMS_FILES ${QT_FORMS})
    QT6_WRAP_CPP(QT_MOC_FILES ${QT_MOC})
    qt_add_executable(robokit
        MANUAL_FINALIZATION
        ${QT_RESOURCES_FILES}
        ${QT_MOC_FILES}
        ${QT_FORMS_FILES}
        ${PROJECT_SOURCES}
    )
else()
    QT5_ADD_RESOURCES(QT_RESOURCES_FILES ${QT_RESOURCES})
    QT5_WRAP_UI(QT_FORMS_FILES ${QT_FORMS})
    QT5_WRAP_CPP(QT_MOC_FILES ${QT_MOC})
    add_executable(robokit
        WIN32
        ${QT_RESOURCES_FILES}
        ${QT_MOC_FILES}
        ${QT_FORMS_FILES}
        ${PROJECT_SOURCES}
    )
endif()

target_link_libraries(robokit PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)

if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(robokit)
endif()

3.运行测试

效果如下(示例):

在这里插入图片描述
到这里以后就可以像普通vs工程那样进行打断点调试。

总结

这里还有几个小细节需要注意:
1.点击vs的三角标运行的时候会提示Qt的库找不到,这个时候可以把相关缺少的dll拷贝到执行目录,如:
在这里插入图片描述
2. 运行程序后发现会有一个控制台显示,如果是进行GUI相关程序开发,往往不需要控制台显示,这个时候可以修改CMakeLists.txt加入如下:

 set(CMAKE_WIN32_EXECUTABLE ON)

或者这样

add_executable(robokit
        WIN32
        ${QT_RESOURCES_FILES}
        ${QT_MOC_FILES}
        ${QT_FORMS_FILES}
        ${PROJECT_SOURCES}
    )

作者:费码程序猿
欢迎技术交流:QQ:255895056
转载请注明出处,如有不当欢迎指正

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1050128.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字货币的一些隐私保护问题

常见的数字货币基本模型 代表数字货币的不同架构和交易验证方式。 Account Based 基于账户的数字货币模型。主要特点 账户地址:每个用户都有一个唯一的账户地址,类似于银行账户号码。这个地址用来标识用户的身份,并用于接收、存储和发送…

多线程学习(C/C++)

1.进程 运行着的程序就是进程 进程的特性:1.独立性 2.动态性 3.并发性 (1)进程的状态 进程一共有五种状态分别为:创建态,就绪态,运行态,阻塞态(挂起态),退出态(终止态)其中创建态和退出态维持的时间是非常短的,稍纵即逝。我们主要是需要将就绪态, 运行态, 挂起态,三者…

7.网络原理之TCP_IP(上)

文章目录 1.网络基础1.1认识IP地址1.2子网掩码1.3认识MAC地址1.4一跳一跳的网络数据传输1.5总结IP地址和MAC地址1.6网络设备及相关技术1.6.1集线器:转发所有端口1.6.2交换机:MAC地址转换表转发对应端口1.6.3主机:网络分层从上到下封装1.6.4主…

文件的编译与链接

目录 翻译环境与链接环境: 翻译环境: 编译器部分: 预处理: 编译: 词法分析: 语法分析: 语义分析: 汇编: 小总结: 链接器部分: 运行环境…

LLMS: 将模型与人类价值观对齐Aligning models with human values

欢迎回来。让我们回到 生成式 AI 项目的生命周期。 上周,你 仔细研究了一种叫做微调的技术。 使用 指令(包括路径方法)进行微调的目标是 进一步训练 模型,以便它们更好地理解 类似人类的提示并 生成更多类似人类的响应。 与基…

2023版 STM32实战5 基本定时器中断

基本定时器简介与特性 -1-时钟可分频 -2-计数模式只可以选择累加 -3-只可以用来定时(含中断) 查看时钟源 如图定时器7的时钟最大为72MHZ 定时时间的计算 通用定时器的时间计算公式为 Tout ((arr1)(psc1&…

[Framework] Android Binder 工作原理

Binder 是 Android 系统中主要的 IPC 通信方式,其性能非常优异。但是包括我在内的很多开发者都对它望而却步,确实比较难,每次都是看了忘,忘了看,但是随着工作的时间约来越长,每次看也都对 Binder 有新的认识…

【图像处理】SIFT角点特征提取原理

一、说明 提起在OpenCV中的特征点提取,可以列出Harris,可以使用SIFT算法或SURF算法来检测图像中的角特征点。本篇围绕sift的特征点提取,只是管中窥豹,而更多的特征点算法有: Harris & Stephens / Shi–Tomasi 角点…

一种节约存储空间的技术——数据压缩

数据压缩是指:通过特定的算法,将计算的中的文件大小得到降低的一种机制。 目前生活中最常见的应用例子,比如:你通过聊天软件将一张图片发送给好友,再选择发送图片的时候,有一个选项为是否发送原图&#xf…

FL Studio21.1电脑试用体验版音乐制作软件

我一直以来对音乐艺术都很感兴趣。最近我接触到了一款名为 FL Studio 的电脑版音乐制作软件,深感其强大功能和广泛适用性。通过使用这款软件,我不仅深入了解了音乐制作的过程与技巧,也加深了对音乐创作的理解。 FL Studio 最初是一款针对 MI…

Flutter笔记 - ListTile组件及其用法

Flutter笔记 ListTile组件及其用法 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article/details/133411883 目 录 1. …

leetCode 213. 打家劫舍 II 动态规划 房间连成环怎么偷呢?

213. 打家劫舍 II - 力扣(LeetCode) 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装…

【Java 进阶篇】深入理解 SQL 聚合函数

在 SQL 数据库中,聚合函数是一组强大的工具,用于处理和分析数据。它们可以帮助您对数据进行统计、计算总和、平均值、最大值、最小值等操作。无论您是数据库开发者、数据分析师还是希望更好地了解 SQL 数据库的用户,了解聚合函数都是非常重要…

三个要点,掌握Spring Boot单元测试

单元测试是软件开发中不可或缺的重要环节,它用于验证软件中最小可测试单元的准确性。结合运用Spring Boot、JUnit、Mockito和分层架构,开发人员可以更便捷地编写可靠、可测试且高质量的单元测试代码,确保软件的正确性和质量。 一、介绍 本文…

(SAR)Sentinel-1影像自动下载

基于ASF网站提供的python代码,实现Sentinel-1影像的自动下载; 1、登录ASF网站 登录Sentinel-1影像ASF网站:https://search.asf.alaska.edu/; 点击网站最右侧Sign in图标,进行用户注册; 注册完用户之后&…

基于Vue+ELement实现增删改查案例与表单验证(附源码)

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《ELement》。🎯🎯 &#x1…

I2C外设

I2C的总结 I2C优点: 接口线少只有两根线,控制方式简单,通信速率较高; I2C 是飞利浦公司开发的两线式串行总线; I2C缺点: 硬件比较复杂,稳定性不太好,程序移植有点麻烦&#xff…

自定义v-resize指令并发布到NPM

自定义Vite库并发布到NPM 封装useResize 用于监听绑定元素的宽高变化,当元素宽高发生变化时触发回调并获取最新的宽高 新建项目 结合上面学到的 Hook 和 自定义指令封装一个监听元素宽高变化的指令,并发布到 npm 项目结构 useResize ├…

jQuery核心卷

目录 一.jQuery引用 二.jQuery语法 三.元素的属性 1.attr()方法 2.使用removeAttr()方法删除HTML元素的属性 3.使用text()方法设置HTML元素的文本内容 四.CSS元素控制 1.使用css()方法获取和设置css属性 2.与CSS类别有关的方法 3.获取和设置HTML元素的尺寸 4.获取和…

html 边缘融合加载

html 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>边缘融合加载</title><style>* {margin: 0;padding: 0;box-sizing: border-box;}body {height: 100vh;padding-bottom: 80px;b…