当前位置: 首页 > news >正文

企业级C++项目那些事(1):VSQt相关设置

写在前面:

刚入职接收一个项目,mentor就把项目源码发给我们几个菜鸟,所分配的任务是做个Qt界面,这对之前从事深度学习算法研究的我着实有点棘手。至于为什么校招不招算法类的岗位,而专门找了个C++开发的岗位,这个有机会后面细聊。
今天先讲讲关于VS设置的相关东西,很多小伙伴可能会想,这VS设置有啥好讲的,有手就会。这还真不一定,且听我慢慢道来。

一、VS的安装

1.VS的安装文件路径没啥好说的
参看下图,一般包含Visual Studio IDE、下载缓存路径、共享组件、工具和SDK 这三项的工作路径,需要注意的是,这里要注意的是,想要代码能正常运行,第三项 共享组件、工具和SDK 的路径千万千万千万不能修改,至于为什么,后面再说。
在这里插入图片描述
2. 安装必要的组件
首先要根据自身项目特点,选取合适的组件,本次需要安装的全部组件如下十图所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

当然要是觉得自己电脑内存够大,性能够好,也可全选。

3. VS安装后的相关设置

一般VS安装可以用免费的社区版,

二、Qt的安装

Qt安装较为简单,Qt默认全选安装也行,不过为了获取计算机更好的性能,可以选择部门组件,参看下图:

三、VS链接Qt的插件安装

双击插件文件即可安装,按提示安装即可,注意一定要关闭VS才能安装哟,重要的事情这里只讲一遍。

四、Qt扩展项设置

先在VS中找到扩展选项,在其菜单列表找到Qt VS Tools选项,最后找到Qt Options按钮,如下界面所示:
如果选择安装全部Qt组件,找到对应Qt版本的组件,再将其名称和地址路径填入下表,我这里的地址路径是
D:\QT\5.12.9\msvc2017_64,名称是msvc2017_64,填上点击OK即可。注意如果路径设置不对,系统会自动提示。
在这里插入图片描述

经过上述步骤,基本的软件安装配置就完成了,这里就可以将整个代码跑一遍了,这里提一嘴,自己新建文件夹的时候,需要注意不要使用中文字符,这里有两个血的教训,第一是Qt,用户文件夹不能使用中文名和特殊符号(例如%¥#@&……),建议只是用英文名加阿拉伯数字;第二是C++项目文件夹不能使用中文字符和特殊符号(例如%¥#@&……),也建议只是用英文名加阿拉伯数字。

五、相关术语解读

下面对相关术语进行解读:

a. relase 和 debug

Debug 即调试,Release 即发行。代码编写之后,生成的目标程序或库文件通常不会绝对正确,或多或少有些毛病(bug), 因此需要进行纠错调试(Debug)。调试过程中需要源代码和二进制目标程序之间一一对应的关系, 这样才能定位到错误代码,所以 Debug 版本的程序是臃肿而不进行优化的。

与之相对的是 Release 发行版,在纠正了发觉到的错误后,需要发布程序用于实际用途,实际应用时强调运行效率高,减少冗余代码,因此会对二进制程序进行大量优化,提升性能。这样发布的二进制目标程序就是 Release 版。

Debug 版本和 Release 版本使用的库文件不一样
Debug 版本程序通常链接的也是 Debug 版本的库文件,比如 libQt5Guid.a/Qt5Guid.dll,库文件的简短名(不含扩展名)都是以 d 结尾的,Debug 库通常都比较大 。
Release 版本程序链接的通常就是 Release 版本的库文件,Release 版本库文件名字比 Debug 版本库文件少一个字母 d ,如 libQt5Gui.a/Qt5Gui.dll,而且 Release 版本库一般都比 Debug 版本小很多,运行效率也高很多。

b.设置启动项

c.GNU工具集
GNU 工具集在上个世纪八十年代,计算机都是奢侈品,操作系统里最著名的是 Unix 家族, 当时还没有 Windows、Linux 之类的,Unix 系统都是商业软件,里面的应用软件也是商业软件, 全是封闭的环境。

系统程序员 Richard M. Stallman (RMS) 在此环境下创立了与众不同的 GNU 项目 (GNU’s Not Unix) , 以及推进自由软件发展的 Free Software Foundation (FSF) 自由软件基金会。

GNU 项目是为了创建自由的类 Unix 系统,也因此开发出来很多开源的系统工具,其中非常著名的就是 GCC (GNU Compiler Collection,GNU编译器套件)。

现在我们知道,GUN 开发类 Unix 系统的项目失败了,但是它开发的一系列工具集却用到了后来的 Linux 内核上,两者结合形成了今天的各种 Linux 发行版。
在 GNU 工具集里面,开发时常见到的几个罗列如下(这些工具通常位于 Linux 或 Unix 系统里的 /usr/bin/ 目录):

目录说明
gccGNU C语言编译器
g++GNU C++语言编译器
ldGNU 链接器,将目标文件和库文件链接起来,创建可执行程序和动态链接库。
ar生成静态库 .a ,可以编辑和管理静态链接库。
make生成器,可以根据 makefile 文件自动编译链接生成可执行程序或库文件。
gdb调试器,用于调试可执行程序。
ldd查看可执行文件依赖的共享库(扩展名 .so,也叫动态链接库)。

d.MinGW
原本 GNU 工具只在 Linux/Unix 系统里才有,随着 Windows 系统的广泛使用, 为了在 Windows 系统里可以使用 GNU 工具,诞生了 MinGW(Minimalist GNU for Windows) 项目,利用 MinGW 就可以生成 Windows 里面的 exe 程序和 dll 链接库。

需要注意的是,MinGW 与 Linux/Unix 系统里 GNU 工具集的有些区别:

  • MinGW 里面工具带有扩展名 .exe, Linux/Unix 系统里工具通常都是没有扩展名的。
  • MinGW 里面的生成器文件名为 mingw32-make.exe,Linux/Unix 系统里就叫 make。
  • MinGW 在链接时是链接到 *.a 库引用文件,生成的可执行程序运行时依赖 *.dll,而 Linux/Unix 系统里链接时和运行时都是使用 *.so 。

另外 MinGW 里也没有 ldd 工具,因为 Windows 不使用 .so 共享库文件。如果要查看 Windows 里可执行文件的依赖库,需要使用微软自家的 Dependency Walker 工具。Windows 里面动态库扩展名为 .dll,MinGW 可以通过 dlltool 来生成用于创建和使用动态链接库需要的文件,如 .def 和 .lib。

MinGW 原本是用于生成 32 位程序的,随着 64 位系统流行起来, 从 MinGW 分离出来了 MinGW-w64 项目,该项目同时支持生成 64 位和 32 位程序。Qt 的 MinGW 版本库就是使用 MinGW-w64 项目里面的工具集生成的。
MSYS(Minimal SYStem)
另外提一下,由于 MinGW 本身主要就是编译链接等工具和头文件、库文件,并不包含系统管理、文件操作之类的 Shell 环境, 这对希望用类 Unix 命令的开发者来说还是不够用的。 所以 MinGW 官方又推出了 MSYS(Minimal SYStem),相当于是一个部署在 Windows 系统里面的小型 Unix 系统环境, 移植了很多 Unix/Linux 命令行工具和配置文件等等,是对 MinGW 的扩展。

MSYS 对于熟悉 Unix/Linux 系统环境或者要尝试学习 Unix/Linux 系统的人都是一种便利。MSYS 和 MinGW 的安装升级都是通过其官方的 mingw-get 工具实现,二者是统一下载安装管理的。

对于 MinGW-w64 项目,它对应的小型系统环境叫 MSYS2(Minimal SYStem 2),MSYS2 是 MSYS 的衍生版,不仅支持 64 位系统和 32 位系统,还有自己的独特的软件包管理工具,它从 Arch Linux 系统里移植了 pacman 软件管理工具,所以装了 MSYS2 之后,可以直接通过 pacman 来下载安装软件,而且可以自动解决依赖关系、方便系统升级等。装了 MSYS2 之后,不需要自己去下载 MinGW-w64,可以直接用 pacman 命令安装编译链接工具和 git 工具等。

  • MinGW 项目主页(含 MSYS): http://www.mingw.org/
  • MinGW-w64 项目主页: https://sourceforge.net/projects/mingw-w64/
  • MSYS2 项目主页: https://sourceforge.net/projects/msys2/

e.CMake

CMake(Cross platform Make)是一个开源的跨平台自动化构建工具, 可以跨平台地生成各式各样的 makefile 或者 project 文件, 支持利用各种编译工具生成可执行程序或链接库。

CMake 自己不编译程序, 它相当于用自己的构建脚本 CMakeLists.txt,叫各种编译工具集去生成可执行程序或链接库。

一般用于编译程序的 makefile 文件比较复杂,自己去编写比较麻烦, 而利用 CMake ,就可以编写相对简单的 CMakeLists.txt ,由 CMake 根据 CMakeLists.txt 自动生成 makefile,然后就可以用 make 生成可执行程序或链接库。

本教程里面是使用 Qt 官方的 qmake 工具生成 makefile 文件,没有用 CMake。这里之所以提 CMake,是因为整个 KDE 桌面环境的茫茫多程序都是用 CMake 脚本构建的,另外跨平台的程序/库如 Boost C++ Libraries、OpenCV、LLVM、Clang 等也都是用 CMake 脚本构建的。以后如果接触到这些东西,是需要了解 CMake 的。

  • CMake 项目主页:https://cmake.org/
  • KDE 项目主页:https://www.kde.org/

f.Qt工具集

Qt 官方的开发环境安装包里有自己专门的开发工具,之前用过 qmake 命令。qmake 是 Qt 开发最核心的工具,既可以生成 Qt 项目文件 .pro ,也可以自动生成项目的 Makefile 文件。

这里将常用的 Qt 开发工具列表如下:

工具说明
qmake核心的项目构建工具,可以生成跨平台的 .pro 项目文件,并能依据不同操作系统和编译工具生成相应的 Makefile,用于构建可执行程序或链接库。
uicUser Interface Compiler,用户界面编译器,Qt 使用 XML 语法格式的 .ui 文件定义用户界面,uic 根据 .ui 文件生成用于创建用户界面的 C++ 代码头文件,比如 ui_*****.h 。
mocMeta-Object Compiler,元对象编译器,moc 处理 C++ 头文件的类定义里面的 Q_OBJECT 宏,它会生成源代码文件,比如 moc_*****.cpp ,其中包含相应类的元对象代码,元对象代码主要用于实现 Qt 信号/槽机制、运行时类型定义、动态属性系统。
rccResource Compiler,资源文件编译器,负责在项目构建过程中编译 .qrc 资源文件,将资源嵌入到最终的 Qt 程序里。
Qtcreater集成开发环境,包含项目生成管理、代码编辑、图形界面可视化编辑、 编译生成、程序调试、上下文帮助、版本控制系统集成等众多功能, 还支持手机和嵌入式设备的程序生成部署。
assistantQt 助手,帮助文档浏览查询工具,Qt 库所有模块和开发工具的帮助文档、示例代码等都可以检索到,是 Qt 开发必备神器,也可用于自学 Qt。
designerQt 设计师,专门用于可视化编辑图形用户界面(所见即所得),生成 .ui 文件用于 Qt 项目。
linguistQt 语言家,代码里用 tr() 宏包裹的就是可翻译的字符串,开发人员可用 lupdate 命令生成项目的待翻译字符串文件 .ts,用 linguist 翻译多国语言 .ts ,翻译完成后用 lrelease 命令生成 .qm 文件,然后就可用于多国语言界面显示。
qmlsence在 Qt 4.x 里是用 qmlviewer 进行 QML 程序的原型设计和测试,Qt 5 用 qmlscene 取代了旧的 qmlviewer。新的 qmlscene 另外还支持 Qt 5 中的新特性 scenegraph 。

g.学习QML还是C++?

Qt4 时代的主流就是传统部件(或叫控件)编程,所用的语言一般是 C++。 Qt5 诞生之时,正是手机移动设备蓬勃发展的时候,而传统的 C++ 部件编写的界面对手机应用程序非常方便,比如手机屏幕显示随意翻转, 这在传统桌面程序里基本遇不到,谁会将 22 寸显示器翻过来转过去呢。

为了适应手机移动应用开发, Qt5 将 QML 脚本编程提到与传统 C++ 部件编程相同的高度,力推 QML 界面编程,当然 QML 主要用于手机移动应用程序。 QML 包含大量使用手机移动设备的功能模块,比如基本部件(QtQuick 模块)、GPS 定位、渲染特效、蓝牙、NFC、WebkKit 等等。

QML 类似于网页设计的 HTML,是一种标记语言,我们可以借助 CSS 对它进行美化,也可以借助 JavaScript 进行交互。有 Web 开发经验的读者学习 QML 将非常轻松。

使用 QML 开发界面主要有以下几个优点:

  • QML 非常灵活,可以做出非常炫酷的效果,例如 QQ、360、迅雷等都不在话下。
  • QML 是标记语言,见名知意,非常容易编写和阅读,大大提高了开发和维护效率。
  • QML 界面简洁大气,有很多动画,适合移动端。
  • 不同平台下的 QML 使用相同的渲染机制,界面效果一致,不会随操作系统的不同而变化。

既然 QML 有这么多优点,我们是不是可以不学 C++,直接学习 QML 呢?

非也!QML 只能用来进行界面设计和人机交互,也就是只能胜任 UI 部分,在底层仍然需要调用 C++ 编写的组件来完善功能,比如访问数据库、网络通信、多线程多进程、文件读写、图像处理、音频视频处理等都离不开 C++

另外,现阶段新生的 QML 还不如传统的 C++ 部件编程那样拥有丰富的开发组件,尤其缺乏复杂的企业级应用程序所必须的树等控件。这就决定了至少现阶段,真正大型的桌面程序仍然只能选择以 C++ 为主、QML 为辅的开发模式。

相信大部分读者都没有 Web 开发经验,学习 QML 成本还是比较高的,不但要习惯 QML 这种标记性语言,还要学习 CSS 和 JavaScript。

总的来说,C++ 对于 Qt 是不可或缺的,而 QML 只是一个加分项。
本教程只讲解 C++ 部件编程
C++依旧是 Qt 的主要编程语言,Qt 5 也并没有忽略它,Qt 5 添加了很多新的 C++ API,而且会持续更新。引入 QML 只是 Qt 5 提供的另外一种选择,并不是让它成为唯一的选择。

C++ 是 Qt 的基础,无论如何都要掌握
h.Qt和其它GUI库的对比
世界上的 GUI 库多如牛毛,有的跨平台,有的专属于某个操作系统;有的只有 UI 功能,有的还融合了网络通信、多媒体处理、数据库访问等底层功能。

Windows 下的 GUI 库

Windows 下的 GUI 解决方案比较多:

  • 基于 C++ 的有 Qt、MFC、WTL、wxWidgets、DirectUI、Htmlayout;
  • 基于 C# 的有 WinForm、WPF;
  • 基于 Java 的有 AWT、Swing;
  • 基于 Pascal 的 有Delphi;
  • 基于Go语言的有 walk 和 electron;
  • 还有国内初露头角的 aardio;
  • Visual Basic 曾经很流行,现在逐渐失去了色彩;
  • 如果你有 Web 开发经验,也可以基于 Webkit 或 Chromium 将网页转换为桌面程序。

没有哪一种方案能够独霸 Windows,使用比较多的编程语言是 C++、C#、Java。

用 Qt 来开发 Windows 桌面程序有以下优点:

  • 简单易学:Qt 封装的很好,几行代码就可以开发出一个简单的客户端,不需要了解 Windows API。
  • 资料丰富:资料丰富能够成倍降低学习成本,否则你只能去看源码,关于 DirectUI、Htmlayout、aardio 的资料就很少。
  • 漂亮的界面:Qt 很容易做出漂亮的界面和炫酷的动画,而 MFC、WTL、wxWidgets 比较麻烦。
  • 独立安装:Qt 程序最终会编译为本地代码,不需要其他库的支撑,而 Java 要安装虚拟机,C# 要安装 .NET Framework。
  • 跨平台:如果你的程序需要运行在多个平台下,同时又希望降低开发成本,Qt 几乎是必备的。

Qt 和 MFC

MFC:

微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。

读者经常将 MFC 和 Qt 进行对比,MFC 只能应用在 Windows 平台,而 Qt 是跨平台的,一次编写,到处运行。

另外,Qt 已经封装了底层细节,学习 Qt 将会非常简单;而 MFC 只是给 Windows API 加了一层包装,不了解 Windows API 也学不好 MFC,大家普遍反映 MFC 难学。

我们不能简单地说 Qt 好还是 MFC 好,两者都有用武之地;但是初学者学习 Qt 会比较简单,不用应付那些烦人的 Windows API,很快就能开发出带有漂亮界面的应用程序。

Linux 下的 GUI 库

Linux 下常用的 GUI 库有基于 C++ 的 Qt、GTK+、wxWidgets,以及基于 Java 的 AWT 和 Swing。其中最著名的就是 Qt 和 GTK+:KDE 桌面系统已经将 Qt 作为默认的 GUI 库,Gnome 桌面系统也将 GTK+ 作为默认的 GUI 库。相比 GTK+,Qt 的功能更加强大,更新也很快,比较受人们追捧。

相关文章:

  • 基于51单片机温湿度控制器proteus仿真设计
  • adb常用命令总结[持续更新]
  • 二分查找练习
  • 【Unity面试】 Lua语言基础核心 | 面试真题 | 全面总结 | 建议收藏
  • 结构化编程(SP,structured programming)
  • Python 博客园快速备份脚本
  • Vue - 列表拖曳排序 / 鼠标拖动改变顺序排列高效简洁组件(支持PC端与移动端触屏拖动,也可在滚动条内排序自动滚动,流畅丝滑无 BUG)
  • JavaWeb三大组件之Servlet------Servlet详细讲解
  • 解决nacos集群搭建,服务注册失败
  • 瑞吉外卖Linux
  • 准备去「技术出海峰会」看看
  • Java毕设项目-OA办公系统
  • C# Post请求上传文件_C#Post请求带文件
  • Flutter:文本组件
  • ANSYS2021安装过程问题总结
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 30秒的PHP代码片段(1)数组 - Array
  • 30天自制操作系统-2
  • co模块的前端实现
  • DOM的那些事
  • Hibernate最全面试题
  • MySQL QA
  • vue 个人积累(使用工具,组件)
  • 浮动相关
  • 力扣(LeetCode)22
  • 前言-如何学习区块链
  • 学习Vue.js的五个小例子
  • 一个完整Java Web项目背后的密码
  • hi-nginx-1.3.4编译安装
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (windows2012共享文件夹和防火墙设置
  • (编译到47%失败)to be deleted
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (六)Hibernate的二级缓存
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (转)linux 命令大全
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • **PHP分步表单提交思路(分页表单提交)
  • *p++,*(p++),*++p,(*p)++区别?
  • .net Application的目录
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • .Net中wcf服务生成及调用
  • [ solr入门 ] - 利用solrJ进行检索
  • [Android] 240204批量生成联系人,短信,通话记录的APK
  • [Android]Android开发入门之HelloWorld
  • [AutoSar]BSW_OS 01 priority ceiling protocol(PCP)
  • [Avalon] Avalon中的Conditional Formatting.