Qt5实战002:创建hello world控制台应用程序
运行Qt Creator我们就来到了QT的欢迎界面,这里显示了QT的项目列表(可以创建或打开新项目)、示例程序、入门教程和插件市场(是不是有点懵了,内容竟然全是英文)。Qt Creator提供了欢迎、编辑、设计、调试、项目、帮助6个模式,分别对应了快捷键是Ctrl + 数字1到6。
在菜单栏中选择【文件】->【新建文件或项目】,在左侧的项目模板中选择【Application(Qt )】项目,然后选择【Qt Console Application】应用来创建一个控制台应用程序。
选择好之后我们就进入了Qt Console Application应用设置,Location选项页用来设置程序名及程序保存路径。这里名称可以设置为helloworld,注意名称和路径上都不要有中文。
Build System选项页用来选择默认的构建系统,QT提供了qmake、CMake和Qbs几个选择。编译时会根据你选择的方式将源文件生成生成 Makefile及各种不同类型的工程并自动解决依赖关系,还可以生成Microsoft Visual Studio使用的项目文件。
如果你计划给项目提QT语言家的翻译接口,可以在这里选择你需要支持的语言。相应的翻译文件就会在项目中生成,这里我创建的时控制台程序没必要直接选择None吧。
Kits选项页提供的是我们安装时候选择的QT工具,这里安装的是C++的编译器用来编译C++编写的代码使用的。
摘要主要是告诉我们接下来将要创建哪些文件到我们的项目中,如果你使用了版本控制系统也可以在这里选择将版本控制系统添加到项目中来。我平时都用Git版本控制系统所以选择了Git,这是在项目目录中就会生成.gitignore、helloworld.pro、helloworld.pro.user和main.cpp几个文件。
项目创建完后会进入编辑模式,左侧是项目文件的列表可以看到项目中包含哪些文件及文件类型,文件显示方式还可以通过下拉菜单来选择项目、书签、文件系统、类视图、大纲等显示方式。在右侧就是代码编辑区域,这里可以对项目文件进行查看和编辑。会对关键字进行高亮显示,鼠标放上面也会有相应的提示信息显示。这里我在main.cpp中添加头文件#include <iostream>和using namespace std,利用cout在Main函数中输出一个“Hello World !”语句。
单击Qt Creator左侧下方的绿色三角形图标来编译运行程序,第一次会会弹出保存修改对话框。保存之后程序开始编译运行,在下方的应用程序输出窗口我们就可以看到运行结果。
QT既然是一个跨平台的C++应用程序开发框架,那么当然有属于QT的项目结构。用QT创建的项目显然和Visual studio有点区别的,我们简单的创建一个“Hello World”可以更好的来了解QT。以上内容是小编给大家分享的【Qt5实战002:创建hello world控制台应用程序】,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。
.NET 控制台应用程序的各种交互玩法
【作者】科技、互联网行业优质创作者
【专注领域】.Net技术、软件架构、人工智能、数字化转型、DeveloperSharp、微服务、工业互联网、智能制造
点击右上方“关注”,里面有很多高价值技术文章,是你刻苦努力也积累不到的经验,能助你快速成长。升职+涨薪!!
前言
老周是一个不喜欢做界面的码农,所以很多时候能用控制台交互就用控制台交互,既方便又占资源少。有大伙伴可能会说,控制台全靠打字,不好交互。那不一定的,像一些选项类的交互,可以用键盘按键(如方向键),可比用鼠标快得多。当然了,要是要触控的话,是不太好用,只能做UI了。
关于控制台交互,大伙伴们也许见得最多的是进度条,就是输出一行但末尾不加 \\n,而是用 \\r 回到行首,然后输出新的内容,这样就做出进度条了。不过这种方法永远只能修改最后一行文本。
于是,有人想出了第二种方案——把要输出的文本存起来(用二维数组,啥的都行),每次更新输出时把屏幕内容清空重新输出。这就类似于窗口的刷新功能。缺点是文本多的时候会闪屏。
综合来说,局部覆盖是最优方案。就是我要修改某处的文本,我先把光标移到那里,覆盖掉这部分内容即可。这么一来,咱们得了解,在控制台程序中,光标是用行、列定位的。其移动的单位不是像素,是字符。比如 0 是第一行文本,1 是第二行文本……对于列也是这样。所以,(2, 4) 表示第三行的第五个字符处。这个方案是核心原理。
当然了,上述方案只是程序展示给用户看的,若配合用户的键盘输入,交互过程就完整了。
正文
下面给大伙伴们做个演示,以便了解其原理。
SetCursorPosition 方法的签名如下:
left 参数是指光标距离控制台窗口左边沿的位移,top 参数指定的是光标距离窗口上边沿的位移。因此,left 表示的是列,top 表示的是行。都是从 0 开始的。
你得注意的是,在覆盖旧内容的时候,要用 Write 方法,不要调用 WriteLine 方法。你懂的,WriteLine 方法会在末尾产生换行符,那样会破坏原有文本的布局的,覆写后会出现N多空白行。
咱们看看效果。
这时候会发现一个问题:输出“Boom!!”后,后面还有上一次的内容未完全清除,那是因为,新的内容文本比较短,没有完全覆写前一次的内容。咱们可以把字符串填充一下。
BufferWidth 是缓冲区宽度,即一整行文本的宽度。Buffer 指的是窗口中输出文本的一整块区域,它的面积会大于/等于窗口大小。不过,咱们好像也没必要填充那么多空格,比竟文本不长,要不,咱们就填充一部分空格好了。
30 是总长度,即字符加上填充后总长度为 30。好了,这下子就完美了。
存在的问题:直接运行控制台应用程序是一切正常的,但如果先启动 CMD,再运行程序就不行了。原因未知。
咱们也不总是让用户输入命令来交互的,也可以列一组选项,让用户去选一个。
下面咱们举一例:运行后输出五个选项,用户可以按上、下箭头键来选一项,按 ESC/回车 可以退出循环。
首先,CursorVisible 属性设置为 false,隐藏光标,这样用户在操作过程看不见光标闪动,会友好一些。毕竟我们这里不需要用户输入内容。
选项内容是通过字符串数组来定义的,先在屏幕上输出,然后在 while 循环中分析用户按的是不是上、下方向键。向上就让索引 -1,向下就让索引 +1。
为什么要定义一个 prevSel 变量呢?因为这是单选项,同一时刻只能选一个,被选中的项前面会显示“* ”。当选中的项切换后,前一个被选的项需要把“* ”符号清除掉,然后再设置新选中的项前面的“* ”。
所以,咱们需要一个变量来暂时记录上一个被选中的索引。
如果你的程序逻辑复杂,这些功能可以封装一下,比如用某结构体记录选择状态,或者干脆加上事件处理,当按上、下键后调用相关的委托触发事件。
这里我为了让大伙伴们看得舒服一些,就不封装那么复杂了。
运作过程是这样的:
1、初始时,一个没选上;
2、按【向下】键,此时当前被选项变成0(即第一项),上一个被选项仍然是 -1;
3、前一个被选项是-1,无需清除前导字符;
4、设置第0行(0就是刚被选中的)的前导符,即在行首覆写上“* ”;
5、继续按【向下】键,此时被选项为 1,上一个被选项为 0;
6、清除上一个被选项0的前导符,设置当前项1的前导符;
7、如果按【向上】键,当前选中项变回0,上一个被选项是1;
8、清除1处的前导符,设置0处的前导符。
其他选项依此类推。
来,看看效果。
怎么样,还行吧。可是,你又想了:要是在被选中时改变一下背景色,岂不美哉。好,改一下代码。
ResetColor 方法是重置颜色为默认值,BackgroundColor 属性设置文本背景色。颜色一旦修改,会应用到后面所输出的文本。
所以当你要输出不同样式的文本前,要先改颜色。
效果很不错的。
咱们扩展一下思路,还可以实现能动态更新的表格。请看以下示例:
这个例子在 while 循环内生成随机数,然后逐行更新最后一个字段的值。
运行效果如下:
下面咱们来做来好玩的进度条。
效果如下:
说说原理:
1、进度字符串的格式:[ 100% ],百分比显示部分固定为五个字符(格式控制符 {0,5:P0});
2、头尾的中括号是不用改变的,但[、]之间的内容需要每次刷新;
3、根据百分比算出,代表进度的字符个数。方法是 HL = 字符串总长(除去两边的中括号)× xxx%;
4、将要覆盖的字符串内容分割为两段输出。
a、第一段字符串输出前把背景色改为深黄色,前景色改为黑色。然后输出从 0 索引处起,输出 HL 个字符;
b、第二段字符串输出前重置颜色,接着从索引 HL 起输出直到末尾。
随着百分比的增长,第一段字符的长度越来越长——即背景为DarkYellow 的字符所占比例更多。
现在,获取控制台窗口句柄来绘图的方式已经不能用了。不过,咱们通过字符也是可以拼接图形的。咱们看例子。
控制台应用程序项目要添加以下 Nuget 包:
这是为了使用 Drawing 相关的类。我说说上面示例的原理:
1、先创建内存在的位图对象(Bitmap类);
2、用 Graphics 对象,以黑色钢笔画一个圆。注意,笔是黑色的,后面有用;
3、逐像素获取位图的颜色,映射到控制台窗口的行、列中。如果像素是黑色,就输出“**”,否则输出“ ”(两个空格)。
为什么要用两个字符呢?用一个字符它的宽度太窄,图像会变形,只好用两个字符了。汉字就不需要,一个字符即可。
看看效果
生成位图时,尺寸不要太大,不然很占屏幕。毕竟控制台是以字符来计量的,不是像素。
- 关注【数字智慧化基地】,里面有很多大佬的技术文章,助你快速成长。还可免费领取如下15个视频教程!(微信扫描下方二维码)
回复\’面试\’,获取C#/.NET/.NET Core面试宝典
回复\’C#\’,领取零基础学习C#编程
回复\’NET\’,领取.NET零基础入门到实战
回复\’Linux\’,领取Linux从入门到精通
回复\’WPF\’,领取高薪热门【WPF上位机+工业互联网】从零手写实战
回复\’Modbus\’,领取初识C#+上位机Modbus通信
回复\’PLC\’,领取C#语言与西门子PLC的通信实操
回复\’blazor\’,领取blazor从入门到实战
回复\’TypeScript\’,领取前端热门TypeScript系统教程
回复\’vue\’,领取vue前端从入门到精通
回复\’23P\’,领取C#实现23种常见设计模式
回复\’MongoDB\’,领取MongoDB实战
回复\’Trans\’,领取分布式事务
回复\’Lock\’,领取分布式锁实践
回复\’Docker\’,领取微服务+Docker综合实战
回复\’K8s\’,领取K8s部署微服务
回复\’加群\’,进.NET技术社区交流群
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。