2023-12-13 VsCode + CMake + Qt环境搭建


点击 <C 语言编程核心突破> 快速C语言入门


VsCode + CMake + Qt环境搭建

  • 前言
  • 一、前期准备
  • 二、具体设置
  • 总结


前言

要解决问题: 最近研究 Qt, 使用 qtcreator, 发现在搭建 UI 界面时候很方便, 但到编码和调试就比较有问题了.

想到的思路: 用 VSCode 进行编码及调试.

其它的补充: 需要装CMake


一、前期准备

安装vscode, Qt, qtcreator, 不再赘述, vscode需要安装clangd, lldb, CMake插件:
在这里插入图片描述
对于vscode, clangd, lldb配置C++环境有疑问的可以看VsCode中使用clangd插件的各种设置

二、具体设置

首先, 通过qtcreator建立cmake项目, 并且设置UI, 设置信号和槽函数等.

注意, 所有项目都放在一个专用文件夹下, 比如E:\clangC++\learnQT\, 在此文件夹下, 专门为Qt建立项目文件.

然后, 用vscode设置工作目录, 将E:\clangC++\learnQT\设置为工作目录, 配置.vscode文件夹内容, 包括settings.json, launch.json.

settings.json 文件下, 增加CMake配置:

sourceDirectory的内容是Qt项目文件, 如果不设置, 目前cmake插件无法找到, 为了方便, 我就建立了30个, 省的一个一个弄了.

buildDirectory是构建的文件夹, 为了项目不混淆, 直接用了源文件地址, 这样直接在项目文件中进行构建. 还有一个好处, clangd在构建后, 可以直接识别UI产生的.h文件, 而不用自己动手拷贝了.

    "cmake.sourceDirectory": ["E:/clangC++/learnQT/learn_1","E:/clangC++/learnQT/Learn_2","E:/clangC++/learnQT/Learn_3","E:/clangC++/learnQT/Learn_4","E:/clangC++/learnQT/Learn_5","E:/clangC++/learnQT/Learn_6","E:/clangC++/learnQT/Learn_7","E:/clangC++/learnQT/Learn_8","E:/clangC++/learnQT/Learn_9","E:/clangC++/learnQT/Learn_10","E:/clangC++/learnQT/Learn_11","E:/clangC++/learnQT/Learn_12","E:/clangC++/learnQT/Learn_13","E:/clangC++/learnQT/Learn_14","E:/clangC++/learnQT/Learn_15","E:/clangC++/learnQT/Learn_16","E:/clangC++/learnQT/Learn_17","E:/clangC++/learnQT/Learn_18","E:/clangC++/learnQT/Learn_19","E:/clangC++/learnQT/Learn_20","E:/clangC++/learnQT/Learn_21","E:/clangC++/learnQT/Learn_22","E:/clangC++/learnQT/Learn_23","E:/clangC++/learnQT/Learn_24","E:/clangC++/learnQT/Learn_25","E:/clangC++/learnQT/Learn_26","E:/clangC++/learnQT/Learn_27","E:/clangC++/learnQT/Learn_28","E:/clangC++/learnQT/Learn_29","E:/clangC++/learnQT/Learn_30",],"cmake.buildDirectory": "${sourceDirectory}/","cmake.autoSelectActiveFolder": true,

launch.json 增加以下调用, 注意, 和普通c++构建不同, 这里没有调用tasks.json文件

{"type": "lldb","request": "launch","name": "QtDebug","program": "${fileDirname}/${fileBasenameNoExtension}.exe","args": [],"cwd": "${workspaceFolder}"}

为了clangd可以识别Qt的文件, 需要在工作目录加一个E:\clangC++\learnQT\compile_flags.txt文件, 文件内容是:

-xc++
-std=c++17
-Wall
-IE:\msys64\clang64\include\qt6\ActiveQt
-IE:\msys64\clang64\include\qt6\Qt3DAnimation
-IE:\msys64\clang64\include\qt6\Qt3DCore
-IE:\msys64\clang64\include\qt6\Qt3DExtras
-IE:\msys64\clang64\include\qt6\Qt3DInput
-IE:\msys64\clang64\include\qt6\Qt3DLogic
-IE:\msys64\clang64\include\qt6\Qt3DQuick
-IE:\msys64\clang64\include\qt6\Qt3DQuickAnimation
-IE:\msys64\clang64\include\qt6\Qt3DQuickExtras
-IE:\msys64\clang64\include\qt6\Qt3DQuickInput
-IE:\msys64\clang64\include\qt6\Qt3DQuickRender
-IE:\msys64\clang64\include\qt6\Qt3DQuickScene2D
-IE:\msys64\clang64\include\qt6\Qt3DRender
-IE:\msys64\clang64\include\qt6\QtAxBase
-IE:\msys64\clang64\include\qt6\QtAxContainer
-IE:\msys64\clang64\include\qt6\QtAxServer
-IE:\msys64\clang64\include\qt6\QtBluetooth
-IE:\msys64\clang64\include\qt6\QtBodymovin
-IE:\msys64\clang64\include\qt6\QtCharts
-IE:\msys64\clang64\include\qt6\QtChartsQml
-IE:\msys64\clang64\include\qt6\QtConcurrent
-IE:\msys64\clang64\include\qt6\QtCore
-IE:\msys64\clang64\include\qt6\QtCore5Compat
-IE:\msys64\clang64\include\qt6\QtDataVisualization
-IE:\msys64\clang64\include\qt6\QtDataVisualizationQml
-IE:\msys64\clang64\include\qt6\QtDBus
-IE:\msys64\clang64\include\qt6\QtDesigner
-IE:\msys64\clang64\include\qt6\QtDesignerComponents
-IE:\msys64\clang64\include\qt6\QtDeviceDiscoverySupport
-IE:\msys64\clang64\include\qt6\QtExampleIcons
-IE:\msys64\clang64\include\qt6\QtFbSupport
-IE:\msys64\clang64\include\qt6\QtGrpc
-IE:\msys64\clang64\include\qt6\QtGui
-IE:\msys64\clang64\include\qt6\QtHelp
-IE:\msys64\clang64\include\qt6\QtHttpServer
-IE:\msys64\clang64\include\qt6\QtJsonRpc
-IE:\msys64\clang64\include\qt6\QtLabsAnimation
-IE:\msys64\clang64\include\qt6\QtLabsFolderListModel
-IE:\msys64\clang64\include\qt6\QtLabsQmlModels
-IE:\msys64\clang64\include\qt6\QtLabsSettings
-IE:\msys64\clang64\include\qt6\QtLabsSharedImage
-IE:\msys64\clang64\include\qt6\QtLabsWavefrontMesh
-IE:\msys64\clang64\include\qt6\QtLanguageServer
-IE:\msys64\clang64\include\qt6\QtLocation
-IE:\msys64\clang64\include\qt6\QtMultimedia
-IE:\msys64\clang64\include\qt6\QtMultimediaQuick
-IE:\msys64\clang64\include\qt6\QtMultimediaWidgets
-IE:\msys64\clang64\include\qt6\QtNetwork
-IE:\msys64\clang64\include\qt6\QtNetworkAuth
-IE:\msys64\clang64\include\qt6\QtNfc
-IE:\msys64\clang64\include\qt6\QtOpenGL
-IE:\msys64\clang64\include\qt6\QtOpenGLWidgets
-IE:\msys64\clang64\include\qt6\QtPacketProtocol
-IE:\msys64\clang64\include\qt6\QtPositioning
-IE:\msys64\clang64\include\qt6\QtPositioningQuick
-IE:\msys64\clang64\include\qt6\QtPrintSupport
-IE:\msys64\clang64\include\qt6\QtProtobuf
-IE:\msys64\clang64\include\qt6\QtQml
-IE:\msys64\clang64\include\qt6\QtQmlCompiler
-IE:\msys64\clang64\include\qt6\QtQmlCore
-IE:\msys64\clang64\include\qt6\QtQmlDebug
-IE:\msys64\clang64\include\qt6\QtQmlDom
-IE:\msys64\clang64\include\qt6\QtQmlIntegration
-IE:\msys64\clang64\include\qt6\QtQmlLocalStorage
-IE:\msys64\clang64\include\qt6\QtQmlModels
-IE:\msys64\clang64\include\qt6\QtQmlTypeRegistrar
-IE:\msys64\clang64\include\qt6\QtQmlWorkerScript
-IE:\msys64\clang64\include\qt6\QtQmlXmlListModel
-IE:\msys64\clang64\include\qt6\QtQuick
-IE:\msys64\clang64\include\qt6\QtQuick3D
-IE:\msys64\clang64\include\qt6\QtQuick3DAssetImport
-IE:\msys64\clang64\include\qt6\QtQuick3DAssetUtils
-IE:\msys64\clang64\include\qt6\QtQuick3DGlslParser
-IE:\msys64\clang64\include\qt6\QtQuick3DHelpers
-IE:\msys64\clang64\include\qt6\QtQuick3DHelpersImpl
-IE:\msys64\clang64\include\qt6\QtQuick3DIblBaker
-IE:\msys64\clang64\include\qt6\QtQuick3DParticles
-IE:\msys64\clang64\include\qt6\QtQuick3DPhysics
-IE:\msys64\clang64\include\qt6\QtQuick3DPhysicsHelpers
-IE:\msys64\clang64\include\qt6\QtQuick3DRuntimeRender
-IE:\msys64\clang64\include\qt6\QtQuick3DSpatialAudio
-IE:\msys64\clang64\include\qt6\QtQuick3DUtils
-IE:\msys64\clang64\include\qt6\QtQuickControls2
-IE:\msys64\clang64\include\qt6\QtQuickControls2Impl
-IE:\msys64\clang64\include\qt6\QtQuickControlsTestUtils
-IE:\msys64\clang64\include\qt6\QtQuickDialogs2
-IE:\msys64\clang64\include\qt6\QtQuickDialogs2QuickImpl
-IE:\msys64\clang64\include\qt6\QtQuickDialogs2Utils
-IE:\msys64\clang64\include\qt6\QtQuickEffects
-IE:\msys64\clang64\include\qt6\QtQuickLayouts
-IE:\msys64\clang64\include\qt6\QtQuickParticles
-IE:\msys64\clang64\include\qt6\QtQuickShapes
-IE:\msys64\clang64\include\qt6\QtQuickTemplates2
-IE:\msys64\clang64\include\qt6\QtQuickTest
-IE:\msys64\clang64\include\qt6\QtQuickTestUtils
-IE:\msys64\clang64\include\qt6\QtQuickTimeline
-IE:\msys64\clang64\include\qt6\QtQuickWidgets
-IE:\msys64\clang64\include\qt6\QtRemoteObjects
-IE:\msys64\clang64\include\qt6\QtRemoteObjectsQml
-IE:\msys64\clang64\include\qt6\QtRepParser
-IE:\msys64\clang64\include\qt6\QtScxml
-IE:\msys64\clang64\include\qt6\QtScxmlQml
-IE:\msys64\clang64\include\qt6\QtSensors
-IE:\msys64\clang64\include\qt6\QtSensorsQuick
-IE:\msys64\clang64\include\qt6\QtSerialBus
-IE:\msys64\clang64\include\qt6\QtSerialPort
-IE:\msys64\clang64\include\qt6\QtShaderTools
-IE:\msys64\clang64\include\qt6\QtSpatialAudio
-IE:\msys64\clang64\include\qt6\QtSql
-IE:\msys64\clang64\include\qt6\QtStateMachine
-IE:\msys64\clang64\include\qt6\QtStateMachineQml
-IE:\msys64\clang64\include\qt6\QtSvg
-IE:\msys64\clang64\include\qt6\QtSvgWidgets
-IE:\msys64\clang64\include\qt6\QtTest
-IE:\msys64\clang64\include\qt6\QtTextToSpeech
-IE:\msys64\clang64\include\qt6\QtTools
-IE:\msys64\clang64\include\qt6\QtUiPlugin
-IE:\msys64\clang64\include\qt6\QtUiTools
-IE:\msys64\clang64\include\qt6\QtVirtualKeyboard
-IE:\msys64\clang64\include\qt6\QtWebChannel
-IE:\msys64\clang64\include\qt6\QtWebSockets
-IE:\msys64\clang64\include\qt6\QtWebView
-IE:\msys64\clang64\include\qt6\QtWebViewQuick
-IE:\msys64\clang64\include\qt6\QtWidgets
-IE:\msys64\clang64\include\qt6\QtXml
-IE:\msys64\clang64\include\qt6\

这是为了让 clangd 找到Qt的头文件目录, 方便代码补全.

进入vscode cmake插件, 选择要编译的项目文件夹, 配置编译工具链, 我的是clang, 它会自己从系统找, 你选一个合适的就可以了, 前提是必须配合你下载的Qt的编译链, 我的版本是clang64环境编译版本, 那对应的编译工具链必须是这个版本.

接着设置生成版本, 我主要用Debug版本, 用于调试.

如果要进行测试, 可以进一步配置, 我这里没有用到, 所以也没有配置.

在这里插入图片描述
所有设置完成后, 就可以点击生成, 然后会自动生成项目的可执行程序, 以及通过UI建立的.h文件和 moc文件.
在这里插入图片描述

最后更改可执行文件, 因为通常生成的是项目文件名.exe比如Learn_17.exe, 要改为main.exe, 也就是主程序名.exe.

之后就可以打断点, 愉快的debug了, 调试界面选择QtDebug, 按F5进行调试.

在这里插入图片描述


总结

其实对于Qt的工程工具链, 争议还是有的, 我所知道, 极少人使用本文的这套方案, 毕竟太繁琐, 同时没有脱离qtcreator, 当然, 有些纯编码的案例也是有的, 看个人的选择了.


点击 <C 语言编程核心突破> 快速C语言入门


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

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

相关文章

python 安装对应版本的lxml

安装对应版本的lxml 先把对应版本的lxml文件下载下来&#xff0c;接着在文件夹路径输入cmd回车&#xff0c;用下面命令安装。

JAVA实体类集合该如何去重?

JAVA实体类集合该如何去重&#xff1f; 最近在工作中经常遇到需要去重的需求&#xff0c;所以特意系统的来梳理一下 有目录&#xff0c;不迷路 JAVA实体类集合该如何去重&#xff1f;单元素去重方法一&#xff1a;利用Set去重方法二&#xff1a;利用java 8的stream写法&#xf…

MySQL主从复制与读写分离实验

实验一、MySQL主从服务器搭建 实验前准备 Master服务器&#xff1a;192.168.188.14 mysql5.7 Slave服务器1&#xff1a;192.168.188.15 mysql5.7 Slave服务器2&#xff1a;192.168.188.16 mysql5.7 关闭虚拟机防火墙 systemctl stop firewalld setenforce 0 主服务器准…

Selenium自动化(上)

Selenium 安装 环境准备 第一种方式 Python 自带的 pip 工具安装。 pip install selenium4.12.0安装完成后&#xff0c;查看安装的 Selenium 版本号。 pip show selenium第二种方式 安装 Selenium 的前提是拥有 Python 开发环境&#xff08;推荐使用 PyCharm&#xff09;。…

[LCTF 2018]bestphp‘s revenge

文章目录 前置知识call_user_func()函数session反序列化PHP原生类SoapClient 解题步骤 前置知识 call_user_func()函数 把第一个参数作为回调函数调用 eg:通过函数的方式回调 <?php function barber($type){echo "you wanted a $type haircut, no problem\n";}c…

Android开发经验记录_对多个Path形成的图形进行填充踩坑与怕坑记录

需求&#xff1a; 通过其他同事对二值化后的图像生成的图形轨迹&#xff0c;形成Path&#xff0c;并绘制到Canvas中。 初步实现测试&#xff1a; 1、paint先使用stroke对获取的扫描点连成一个个path看看效果先 canvas.save();Paint paint new Paint();paint.setStrokeWidth(…

git 实用命令杂记

使用解决冲突的方式合并&#xff0c;将避免简单的自动合并 git merge origin/dev --strategyresolve清理本地已经合并到 dev 的分支 git branch --merged | grep -v dev | xargs -n 1 git branch -d分支清理 Git 之删除本地无用分支_dearfulan 的博客 - CSDN 博客_git 删除本…

白日门引擎传奇手游架设教程-GM的成长之路

准备工具 服务器一台&#xff08;Windows系统&#xff09;白日门引擎服务端版本一个 前言&#xff1a; 此次教程使用的是版本是一个决战斗罗的一个版本、服务器使用的是驰网科技的游戏高频系列服务器。 教程开始 在我们拿到版本之后、我们需要先把版本解压到服务器D盘的根目录…

四六级高频词组7

目录 词组 其他文章链接&#xff1a; 词组 251. &#xff08;be&#xff09; equivalent to&#xff08;equal in value&#xff0c; amount&#xff0c; meaning&#xff09; 相等于&#xff0c; 相当于 252. in essence &#xff08;in itsones nature&#xff09; 本质上…

处理获取当前日期---------------年月日//时分秒

当前时间&#xff0c;先分组匹配&#xff0c;以数组下标索引匹配定义的汉字进行替换 处理日期方法 /* 日期格式化 */ const formatTime function formatTime(time, template) {if (typeof time ! "string") {time new Date().toLocaleString(zh-CN, { hour12: fal…

Java基础语法之继承

为什么要继承 会发现&#xff0c;狗和猫只有叫声不同&#xff0c;因为它们都是动物&#xff0c;会有相同的属性和行为&#xff0c;所以它们可以继承animla类 如何继承 用到extends关键字 这样就会简化好多 注意 1.Animal称为父类/超类/基类&#xff1b;dog&#xff0c;cat称…

249:vue+openlayers 经纬度坐标转化为地址信息,点击后在弹窗显示

第249个 点击查看专栏目录 本示例是演示如何在vue+openlayers项目中点击某点,转化经纬度坐标为地址信息,弹窗显示。 通过点击地图,获取到经纬度坐标,然后通过调取mapbox的地址转换API,将经纬度坐标转化为地址信息,通过overlay的方式,在弹窗中展示出来。 直接复制下面的…

sylar高性能服务器-配置(P12-p14)内容记录

文章目录 p12&#xff1a;复杂类型解析一、方法函数二、结果展示 p13&#xff1a;复杂类型解析完善一、方法函数二、结果展示 p14&#xff1a;自定义类型解析一、方法函数二、小结 p12&#xff1a;复杂类型解析 ​ 本节内容主要针对完了配置类中对于复杂类型的转换。之前只实现…

中伟视界:水位识别、智能化巡检、远程监控,提升智慧河道管理效率

随着现代科技的发展&#xff0c;人工智能&#xff08;AI&#xff09;算法在各行各业中的应用越来越广泛。特别是在水利行业中&#xff0c;智慧河道的运营管理已成为了一个重要的课题。本文将探讨如何利用AI算法优化智慧河道的运营效率&#xff0c;以及如何通过水位识别视频分析…

CentOS7 OpenSSL升级到OpenSSH9.5p1

原文链接&#xff1a; CentOS7 OpenSSL升级1.1.1w&#xff1b;OpenSSH 升级 9.5p1 保姆级教程 openssl从3.1.0升级到3.1.1遇到的问题 注意操作时需要联网请参考如下链接 内网服务器联网安装依赖参见我的另一篇文章 一、 前言 OpenSSH 的加密功能需要用到OpenSSL&#xff0c;所…

C语言指针基础题(二)

目录 例题一题目解析及答案 例题二题目解析及答案 例题三题目解析及答案 例题四题目解析及答案 例题五题目解析及答案 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &#x1f978;&#x1f978;&#x1f…

Unity | 渡鸦避难所-2 | 搭建场景并添加碰撞器

1 规范项目结构 上期中在导入一系列的商店资源包后&#xff0c;Assets 目录已经变的混乱不堪 开发过程中&#xff0c;随着资源不断更新&#xff0c;遵循一定的项目结构和设计规范是非常必要的。这可以增加项目的可读性、维护性、扩展性以及提高团队协作效率 这里先做下简单的…

智能优化算法应用:基于斑点鬣狗算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于斑点鬣狗算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于斑点鬣狗算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.斑点鬣狗算法4.实验参数设定5.算法结果6.…

攻防世界-web-upload

1. 题目描述 打开链接&#xff0c;是这样的一个注册界面 先试着注册一个账号看看&#xff0c;这里简单操作&#xff0c;注册test/test&#xff0c;注册完后进行登录 登录成功后进入到这样一个文件上传界面。当前从界面上得到的信息暂时就是这些了。 2. 思路分析 既然存在上传…

【ret2hbp】一道板子测试题 和 SCTF2023 - sycrpg

前言 ret2hbp 主要是利用在内核版本 v6.2.0 之前&#xff0c;cpu_entry_area mapping 区域没有参与随机化的利用。其主要针对的场景如下&#xff1a; 1&#xff09;存在任意地址读&#xff0c;泄漏内核地址 2&#xff09;存在无数次任意地址写&#xff0c;泄漏内核地址并提权…