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语言入门


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SSM实现的精品课程网站

一、系统架构 前端&#xff1a;jsp | js | css | jquery | bootstrap 后端&#xff1a;spring | springmvc | mybatis 环境&#xff1a;jdk1.7 | mysql | maven | tomcat 二、代码及数据库 三、功能介绍 01. 登录页 02. web端-首页 03. web端-视频教程 04. web端-资料…

Flutter在Android Studio上创建项目与构建模式

一、安装插件 1、前提条件&#xff0c;安装配置好Android Studio环境 2、安装Flutter和Dart插件 Linux或者Windows平台&#xff1a; 1&#xff09;、打开File > Settings。 2&#xff09;、在左侧列表中&#xff0c;选择"Plugins"右侧上方面板选中 "Market…

Redis - 做缓存时高并发问题:缓存穿透、击穿、雪崩,数据库缓存双写不一致

缓存穿透 当用户访问的数据既不在缓存也不在数据库中时&#xff0c;就会导致每个用户查询都会“穿透” 缓存“直抵”数据库。这种情况就称为缓存穿透。当高度发的访问请求到达时&#xff0c;缓存穿透不 仅增加了响应时间&#xff0c;而且还会引发对 DBMS 的高并发查询&…

Python + Appium 自动化操作微信入门看这一篇就够了!

简介 Appium 是一个开源的自动化测试工具&#xff0c;支持 Android、iOS 平台上的原生应用&#xff0c;支持 Java、Python、PHP 等多种语言。 Appium 封装了 Selenium&#xff0c;能够为用户提供所有常见的 JSON 格式的 Selenium 命令以及额外的移动设备相关的控制命令&#x…

K8S(五)—命名空间与资源配额

目录 命名空间(Namespace)命令计算资源配额创建命名空间绑定一个ResourceQuota资源将命名空间和资源限制对象进行绑定尝试创建第二个 Pod查看ResourceQuota 绑定第二个ResourceQuota为命名空间配置默认的 CPU 、memory请求和限制&#xff08;1&#xff09;Pod 中所有容器都没有…

【C++进阶篇】二叉搜索数

目录 前言&#xff1a; 以后我们要学map&#xff0c;set&#xff0c;AVL&#xff0c;红黑数所以必须要有二叉搜索数做铺垫 1、二叉搜索树概念 2.二叉搜索树操作 1.二叉搜索树的查找 a、从根开始比较&#xff0c;查找&#xff0c;比根大则往右边走查找&#xff0c;比根小则…

感知机(perceptron)

一、感知机 1、相关概念介绍 感知机&#xff08;perceptron&#xff09;是二分类的线性分类模型&#xff0c;属于监督学习算法。输入为实例的特征向量&#xff0c;输出为实例的类别&#xff08;取1和-1&#xff09;。 2、&#xff08;单层&#xff09;感知机存在的问题 感知机…

上课犯困怎么办

我们小时候都有过这样的经历&#xff1a;在课堂上&#xff0c;突然感到困倦&#xff0c;无法集中精力听讲。这不仅影响了学习效果&#xff0c;还可能错过重要的知识点。那么&#xff0c;上课犯困怎么办呢&#xff1f;下面就给大家提供几点建议。 保证充足的睡眠 保证充足的睡眠…

节流防抖:提升前端性能的秘密武器(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

【音视频 | H.264】H.264编码详解

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

VMware安装ContOS 7 提示“客户机操作系统已禁用 CPU。请关闭或重置虚拟机。”

目录 实验环境报错截图报错原因猜测&#xff08;根据实验现象&#xff09;解决办法如下 实验环境 Vmware Workstation 17.5 CentOS7 镜像版本&#xff1a;2207-02版本 注意&#xff1a;2009版本并无该错误 报错截图 报错原因猜测&#xff08;根据实验现象&#xff09; CentO…

MIT6.824-Raft笔记6:不一致log处理、日志快照

本部分主要是关于不一致的日志是怎么决策和取舍的。同时对于日志的恢复&#xff0c;通过快照的方式提高恢复的效率。 1. 不一致log的处理 在我们分析之前&#xff0c;我们需要明白这个场景是否真的存在&#xff0c;因为有些场景不可能存在我们也就没必要考虑它。即需要思考这种…

使用PM2,在生产环境稳定运行你的node项目

PM2 一个 node&#xff0c;本身就用几行代码&#xff0c;就可以启动个 server 进程&#xff0c;监听个端口&#xff0c;为大家提供 Web 服务 一、依赖安装 npm install pm2 -g 二、命令行启动 普通执行启动 pm2 start <js 文件路径 >.js 携带参数启动 pm2 start < 某种…

k8s debug 浅谈

一 k8s debug 浅谈 说明&#xff1a; 本文只是基于对kubectl debug浅显认识总结的知识点,后续实际使用再补充案例 Kubernetes 官方出品调试工具上手指南(无需安装&#xff0c;开箱即用) debug-application 简化 Pod 故障诊断: kubectl-debug 介绍 1.18 版本之前需要自己…

什么是主动学习(Active Learning)?定义,原理,以及主要方法

数据是训练任何机器学习模型的关键。但是&#xff0c;对于研究人工智能的企业和团队而言&#xff0c;数据仍是实现成功的最大障碍之一。首先&#xff0c;您需要大量数据来创建高性能模型。更重要的是&#xff0c;您需要标注准确的数据。虽然许多团队一开始都是手动标注数据集&a…

使用 Taro 开发鸿蒙原生应用 —— 当 Taro 遇到纯血鸿蒙 | 京东云技术团队

纯血鸿蒙即将到来 在今年 8 月的「2023年华为开发者大会&#xff08;HDC.Together&#xff09;」上&#xff0c;华为正式官宣「鸿蒙Next」&#xff0c;这个更新的版本将移除所有的 AOSP 代码&#xff0c;彻底与 Android 切割&#xff0c;使其成为一个完全自主研发的操作系统&a…

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

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

预测性维护对制造企业设备管理的作用

制造企业设备管理和维护对于生产效率和成本控制至关重要。然而&#xff0c;传统的维护方法往往无法准确预测设备故障&#xff0c;导致生产中断和高额维修费用。为了应对这一挑战&#xff0c;越来越多的制造企业开始采用预测性维护技术。 预测性维护是通过传感器数据、机器学习和…

【教3妹学编程-算法题】消除相邻近似相等字符

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 3妹&#xff1a;好冷啊&#xff0c; 冻得瑟瑟发抖啦 2…

Python Paramiko库:SSH远程连接与文件传输实战指南

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在网络管理和系统运维中&#xff0c;SSH&#xff08;Secure Shell&#xff09;是一种广泛用于远程登录和文件传输的协议。Python中的Paramiko库为开发者提供了灵活、强大的SSH客户端和服务器功能。本文将深入探讨…