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

news2024/12/23 9:57:06

点击 <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.coloradmin.cn/o/1307492.html

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

相关文章

003 FeedForward前馈层

一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17torch 1.13.1cu117torchvision 0.14.1cu117 二、前馈层原理 Transformer模型中的前馈层&#xff08;Feed Forward Layer&#xff09;是其关键组件之一&#xff0c;对于模型的性能起着重要作用。下面将用900字对…

postman接口测试系列: 时间戳和加密

在使用postman进行接口测试的时候&#xff0c;对于有些接口字段需要时间戳加密&#xff0c;这个时候我们就遇到2个问题&#xff0c;其一是接口中的时间戳如何得到&#xff1f;其二就是对于现在常用的md5加密操作如何在postman中使用代码实现呢&#xff1f; 下面我们以一个具体的…

【EXCEL】数据透视实例

相关链接&#xff1a;Excel数据透视表全攻略 数据样例&#xff1a; 透视结果&#xff1a;

分析某款go端口扫描器之三

一、概述 前两篇主要分析些工具集&#xff0c;已经针对web服务的指纹和端口指纹信息进行识别&#xff0c;并没有真正开始扫描。本篇主要分析如何进行IP存活探测以及tcp扫描实现。 项目来源&#xff1a;https://github.com/XinRoom/go-portScan/blob/main/util/file.go 二、/…

云架构俭约之道七法则(The Frugal Architect)

文章目录 一、前言关于 Law 与 Rule 的区别 二、云架构俭约之道七法则Design&#xff08;设计方面&#xff09;Law 1&#xff1a;把成本作为非功能性需求Law 2&#xff1a;可持续性系统需要将成本与业务相匹配Law 3&#xff1a;架构设计是一系列权衡的取舍 Measure&#xff08;…

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

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

vivado约束方法2

排序约束条件 因为XDC约束是按顺序应用的&#xff0c;并且是基于明确的优先级排列的规则&#xff0c;您必须仔细检查约束的顺序。 Vivado IDE为您的设计提供了全面的可视性。要逐步验证约束&#xff0c;请执行以下操作&#xff1a; 1.运行相应的报告命令。 2.查看Tcl控制台…

微信小程序自定义提示框组件并使用插槽 tooltip

创建tooltip组件引用 创建一个自定义组件&#xff0c;例如命名为 tooltip tooltip.wxml&#xff1a;用于定义组件的结构&#xff1b; <!--components/tooltip/tooltip.wxml--> <view class"tooltip-wrapper" hidden"{{hidden}}" style"lef…

spingboot项目实战之若依框架创建新模块

前言 目前的脚手架系统很多&#xff0c;比较早接触诺依框架&#xff0c;以若依框架为参考如何创建新模块 步骤 1. 下载诺依框架&#xff0c;依照参考说明一步步&#xff0c;能做到系统运行起来。 2. 准备好mysql文件&#xff0c;创建新数据库表 3. 数据库管理工具navicat…

如何退回chrome旧版ui界面?关闭Chrome浏览器新 UI 界面

之前启用新UI的方式 Chrome 已经很久没有进行过大的样式修改&#xff0c;但近期在稳定分支中添加了新的 flags 实验性标志&#xff0c;带来了全新的设计与外观&#xff0c;启用方式如下&#xff1a; 在 Chrome 浏览器的搜索栏中输入并访问 chrome://flags 搜索“refresh 2023…

Leetcode 46 全排列

题意理解&#xff1a; 首先明确全排列是什么&#xff1f; 使用集合里所有的元素&#xff0c;使用不同的顺序进行排列&#xff0c;所有的排列集合即为全排列。 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 这里的元素不会…

《YOLOv8改进系列》专栏目录介绍

YOLOv8改进系列 &#x1f680; 专栏目录介绍 本专栏内容是紧跟最新、最前沿的改进方法&#xff0c;不仅适用检测任务&#xff0c;分类任务&#xff0c;分割任务&#xff0c;关键点任务同样适用。文章适用于多种场景&#xff0c;包括但不限于小目标、工业缺陷、轻量化等领域。 …

猫粮哪个牌子质量好性价比高?口碑比较好的主食冻干猫粮牌子推荐

猫咪生骨肉主食冻干猫粮喂养方式是越来越火了&#xff0c;作为一个离职的十年经验宠物护理师&#xff0c;对宠物健康营养方面的知识一直在研究&#xff0c;不光是为了我自己养的猫咪身体健康&#xff0c;也要为客户的猫咪健康负责&#xff01;现在很多养猫人士对主食冻干猫粮喂…

AE (3)_主观亮度和对比度调试

#灵感# 画面的亮度、对比度是最直接&#xff0c;观看者最先获得的感受。所以有必要花时间认真调整。 ------哈哈&#xff0c;虽然调试的时间其实不如磨清晰度多。 目录 举个图例&#xff1a; 三个参数AE、gamma、LTM&#xff1a; 调试顺序&#xff1a; 举个图例&#xff1…

beebox靶场A2 low级别身份验证通关教程

1. 断开的身份验证 - 验证码绕过 Broken Auth. - CAPTCHA Bypassing 打开burp抓包在页面上输入账号为bee 密码随便输&#xff0c;输入验证码开始抓包拦截&#xff0c; 发到重放器进行重放&#xff0c;发现只是一直提示密码错误&#xff0c;那证明只要不刷新页面验证码应该就不…

2023年第三届产业数字化【金铲奖】重磅来袭!

做具备产业数字化价值的企业、案例标杆、资本机构的见证者、发现者、陪伴者。 出品|产业家 一年一度的金铲奖来了&#xff01; 在过去的一年时间里&#xff0c;我们清晰地看到&#xff0c;产业数字化的潮水更加汹涌澎湃且势不可挡&#xff0c;越来越多的企业开始寻求数字化…

照片如何抠图换背景?分享三个一键抠图的方法

照片如何抠图换背景&#xff1f;通过使用一键抠图工具&#xff0c;您可以将图片中的主体从原始背景中分离出来&#xff0c;并将其放置在新的背景中。这种技术可以用于各种情况&#xff0c;例如在照片编辑中增加创意效果、改变照片的氛围或者为产品展示添加专业外观。通过抠图并…

LeetCode刷题--- 验证二叉搜索树

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 http://t.csdnimg.cn/ZxuNL个人专栏&#xff1a;力扣递归算法题 http://t.csdnimg.cn/ZxuNL 【C】 http://t.csdnimg.cn/c9twt 前言&#xff1a;这个专栏主要讲述递归递归、搜索与回溯算法&#x…

redis:一、面试题常见分类+缓存穿透的定义、解决方案、布隆过滤器的原理和误判现象、面试回答模板

redis面试题常见分类 缓存穿透 定义 缓存穿透是一种现象&#xff0c;引发这种现象的原因大概率是遭到了恶意攻击。具体就是查询一个一定不存在的数据&#xff0c;mysql查询不到数据也不会直接写入缓存&#xff0c;就会导致这个数据的每次请求都需要查DB&#xff0c;数据库压力…

ChatGLM3:打造更智能、更安全的代码解释器和工具使用体验

ChatGLM3 是由智谱AI训练的第三代大型语言模型&#xff0c;它不仅能理解和生成人类语言&#xff0c;还能执行代码、调用工具&#xff0c;并以 markdown 格式进行响应。为了提高用户体验&#xff0c;同时避免用户输入的注入攻击&#xff0c;ChatGLM3 采用了全新的对话格式。下载…