03.【Qt开发】Qt新建初始代码介绍、实现界面打印helloworld

目录

一. 初始代码介绍

1.1 main.cpp

1.2 widget.h

1.3 widget.cpp

1.4 widget.ui

1.5 .pro文件

1.6 编译运行 Qt 项目生成的中间文件

1.6.1 项目目录

1.6.2 build目录

1.6.3 编译生成的 .exe 文件 

二. hello world文本打印

2.1 图形化方式创建helloworld

2.1.1 操作

2.1.2 相关解释

2.2 代码方式创建helloworld

2.2.1 操作

2.2.2 扩展

三. 内存泄漏

3.1 widget.cpp 的 new 没有delete,有没有内存泄漏呢?


一. 初始代码介绍

1.1 main.cpp

详细解释:

        1. Qt 系统提供的标准类名声明头文件没有 .h 后缀;(#include<QApplication>)

        2. Qt 一个类对应一个头文件,类名就是头文件名;

        3. QApplication 为应用程序类;QApplication a;(a为应用程序对象,有且仅有一个。)

        • QApplication 管理图形用户界面应用程序的控制流和主要设置。

        • QApplication 是 Qt 的整个后台管理的命脉。它包含主事件循环,在其中来自窗口系统和其它资源的所有事件处理和调度。它也处理应用程序的初始化和结束,并且提供对话管理。

        • 对于任何一个使用 Qt 的图形用户界面应用程序,都正好存在一个 QApplication 对象,而不论这个应用程序在同一时间内是不是有 0、1、2 或更多个窗口。

        4. Widget w;   //实例化窗口对象

        5. w.show();  //调用show函数显示窗口

        6. a.exec() :程序进入消息循环,等待对用户输入进行响应。这里 main()把控制权转交给Qt,Qt 完成事件处理工作,当应用程序退出的时候 exec() 的值就会返回。在 exec() 中,Qt 接受并处理用户和系统的事件并且把它们传递给适当的窗口部件。

1.2 widget.h

1.3 widget.cpp

1.4 widget.ui

1.5 .pro文件

        工程新建好之后,在工程目录列表中有一个后缀为 ".pro" 的文件, ".pro" 文件就是工程文件 (project),它是 qmake 自动生成的用于生产 makefile 的配置文件。

".pro" 文件的写法如下:

        1. 注释:从 "#" 开始,到这一行结束。

        2. QT += core gui // Qt 包含的模块 Qt5 包含的模块如下图所示:

        3. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 这条语句的含义是,如果QT_MAJOR_VERSION 大于 4 也就是当前使用的 Qt5 及更高版本) 需要增加 widgets 模块。如果项目仅需支持 Qt5,也可以直接添加 "QT += widgets" 一句。不过为了保持代码兼容 ,最好还是按照 QtCreator 生成的语句编写。

        4. 指定生成的应用程序名:TARGET = QtDemo

        5. TEMPLATE = app //模板。告诉 qmake 为这个应用程序生成哪种 makefile。下面是可供选择的模板:

        • app:建立一个应用程序的 makefile。这是默认值,所以如果模板没有被指定,这个将被使用。

        • lib :建立一个库的 makefile。

        • vcapp:建立一个应用程序的 VisualStudio 项目文件。

        • vclib: 建立一个库的 VisualStudio 项目文件。

        • subdirs:这是一个特殊的模板,它可以创建一个能够进入特定目录的 makefile 并且为它调用make 的 makefile。

        6. 工程中包含的源文件:SOURCES += main.cpp/widget.cpp

        7. 工程中包含的头文件:HEADERS += widget.h

        8. 工程中包含的资源文件:RESOURCES += painter.qrc

        9. 工程中包含的 "ui" 设计文件:FORMS += widget.ui

       10. 配置信息:CONFIG += c++11 (使用 c++11 的特性) CONFIG 用来告诉 qmake 关于应用程序的配置信息。

1.6 编译运行 Qt 项目生成的中间文件

1.6.1 项目目录

        点击 Qt Creator 左下角的编译按钮进行编译之后,执行以下操作。

        上述操作打开的目录如下: 

       在运行一次程序之后,就会在项目目录里生成一个“build”目录,这个目录里面就是该项目运行过程中,生成的一些临时文件。(也可能是在你项目的同级目录,即上图界面往上一级)

1.6.2 build目录

        将 ui_widget.h 文件拖到 Qt Creator 的代码框中展示出来。

1.6.3 编译生成的 .exe 文件 

二. hello world文本打印

        两种方式,实现helloworld

        1. 通过图形化的方式,在界面上创建出一个控件,显示 hello world

        2. 通过纯代码的方式,通过编写代码,在界面上创建控件,显示 hello world

        新建一个名为“01helloworld”的项目

2.1 图形化方式创建helloworld

2.1.1 操作

        图中数字为操作小写字母为相关解释。

2.1.2 相关解释

        点击编辑即可进到 widget.ui 的代码界面

        右键“01helloworld.pro”-->在Explorer中显示,再打开的文件夹中进入build目录

        将 ui_widget.h 拖动到 Qt Creator 的界面中显示

2.2 代码方式创建helloworld

2.2.1 操作

        点击左上角“文件”中的“关闭所有项目和编辑器”。(为避免混乱,在每次新建项目之前最好先关闭之前的项目)

        新建项目,项目名称写为“01helloworld_2”,其余操作和之前一样。

        打开 widget.cpp 进行编辑,蓝色框内为新增的代码

        点击左下角运行按钮

2.2.2 扩展

        Qt 诞生于 1991 年,C++还没有形成标准。当时,如何表示一个字符串,可以使用 C 风格字符串 (\0 结尾) 也可以使用 C++ 的 string(当年的C++啥都不太好用)

        Qt为了让自己的开发能变的顺畅,就自己发明了一套轮子,搞了一系列的基础类,来支持Qt的开发,包括不限于:

        字符串 Qstring

        动态数组 QVector

        链表 Qlist

        字典 Qmap

        ……

        很多年之后,C++的上述这些容器等内容, 已经打磨的很好了,形成了 C++ 标准

        很显然,这些已经引入的 Qt 自己包装好的 Q 开头的这些容器类,也不可能删了就只能和现有的标准库中的容器类共存了。因此,咱们开发 Qt 代码的时候,如果需要用到上述容器类可以使用标准库的容器, 也可以使用 Qt 自己搞的这一套,但是 Qt 原生的 api 中, 涉及到的接口,用的都是 Qt 自己的这一套容器后续的代码中,还会经常见到 QString 这样的一些东西,而很少见到 std:stringQString 和 std::string 之间也能很方便的相互转换。

        QString 用起来要比 std::string 香亿点点。QString 内部已经对于字符编码做了处理了。而不像 std::string,就啥都没干。

三. 内存泄漏

        关注内存泄露 是要融入到 DNA 中的事情.内存泄露是一个非常害怕,非常严重的事情!!(不仅仅是内存泄露, 包括文件描述符泄露 等 同类问题,都是非常严重的)

        这种问题,不容易第一时间发现,

        我的老师讲的一个故事:我在搜狗的时候~~ 我要上线一个程序.

        (上线:把程序部署到生产环境上:此时这个程序就可以被外面的用户访问到,(如果生产环境挂了,用户就访问不了了,非常严重的事故!!))

        对面的兄弟,想让我给他带一个版本到生产环境上去

        上线是一个挺麻烦的事情~~ 让测试进行测试,测试通过,预约运维同学排期~~,还需要提电子流,让领导层层审批.

        具体的上线操作也是非常繁琐的,当时我们有几十台服务器,就是要把程序部署到这几十台服务器上-般来说都是"灰度上线”,先上线一台机器,观察一下,验证一下,看看这个机器更新版本之后,有没有问题如果没问题,再上线后续的机器,如果有问题, 那就赶紧调査问题,后续的机器上线就暂停,

        只上线一台机器,哪怕出现严重bug,影响面积不大,造成的后果/损失比较有限~~

        上午,我上线了一台机器~~ 中午吃饭了,午休~~ 下午的时候,已经观察几个小时了~~我检査了一下这个上线的机器,发现没啥问题,各个功能,各个指标都正常。我就给运维同学说,可以上线后续机器了。突然,第一台机器,狂报警!!! =>出事了!!赶紧上到机器上,发现这个机器上的程序,出现了"文件资源泄露” 问题~~(打开了文件,没有 close)

问题:

        每个进程 =>pcb =>文件描述符表

        每次打开一个文件,都需要在文件描述符表中 申请一个表项

        文件描述符表长度是有上限的!!

        要花多长时间才能达到上限??不知道.看你的代码泄露速度快不快了~~

        找到这个兄弟一起排查,他发现自己的代码中,打开了文件,没关闭~~

        如果泄露速度, 再慢点~~ 一直到凌晨,夜深人静,我们都在睡觉觉的时候,突然搞出这么一手~~ 所有的机器都可能会瘫痪,整个业务线就嘎了!!!

        如果真的如此,年终奖必然不保!!

3.1 widget.cpp 的 new 没有delete,有没有内存泄漏呢?

        关于是否由内存泄漏,请看下一节博客~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

..过云雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值