目录
前端开发(网页开发)中也是有涉及到类似的 对象树(DOM),本质上也是一个树形结构(N叉树),通过树形结构把界面上的各种元素组织起来,Qt 也是类似,也是搞了一个对象树,也是 N 叉树,把界面上的各种元素组织起来了。

使用对象树,把这些内容组织起来,最主要的目的,就是为了能够在合适的时机(窗口关闭/销毁的时候),把这些对象统一进行释放。
如果某个对象提前销毁,此时就会导致对应的控件在界面和三个不存在了。

所以此处的通过 new 的方式创建对象,也就是为了把这个对象的生命周期,交给 Qt 的对象树来统一管理。

如果这个对象是按照 栈上 的变量创建的,就可能会存在一些 提前释放 的问题:

当把对象改在栈上创建,此时可以看见,运行起来的程序五恶法显示出 hello world,此时 label 对象随着构造函数的结束,就销毁了。
查看自动释放的过程
- 创建一个类,选择C++

- 填写类名

- 一路next,多出来了一个 mylabel.h 的头文件 和 mylabel.cpp的文件

- 添加头文件:#include <QLabel>

- F4 切换,头文件和对应的 .cpp 文件

调用这个才能让我们自己类的对象加入到 Qt 对象树中,创建自定义的类,最主要的目的,是自定义一个析构函数,在析构函数中,完成打印,方便我们看到最终的自动销毁对象的效果!!!
- 添加析构函数,将光标放在析构函数上,按 ALT + ENTER,会弹出选项

- 选择第一个,再敲一下回车就行了,就可以自动的在cpp文件中添加函数的定义了:

- 析构函数
- 先将对象创建出来

- 填写析构函数

- 运行起来,点击下方的应用程序输出,点击关掉窗口

10 说明析构函数执行了,虽然没有手动的 delete,但是将 MyLabel 挂到了对象树上,此时窗口被销毁的时候,就会自动销毁对象树中的所有对象,MyLabel 的析构是执行到了

- 解决乱码,乱码的原因只有一个:编码方式不匹配!!!
计算机中,在GBK中:一个汉字占2个字节;在UTF-8,变长编码中:一个汉字一般占3个字节,Linux默认是UTF-8
- UTF-8:

- GBK:

出现乱码对应的字符串使用哪种方式编码的?和当前的 mylabel.cpp 文件中的编码方式是一致的

- 用记事本打开

- 点击文件,选择另存为:

- 下方便有编码格式的格式,这里说明该文件就是UTF-8的编码格式:

如果显示的是 ANSI,就是 GBK 编码。这里出现乱码,说明Qt Creator 中的编码不是UTF-8,Qt 中的QString,是可以帮助我们自动的处理编码方式的,同时,Qt 也提供了专门用来打印日志的工具,也能自动处理编码的方式:qDebug() 工具,借助这个,就可以完成打印日志的过程,很好的处理字符编码:

QDebug 是 Qt 中的类,又不会直接使用这个类,qDebug 这个宏,封装了 QDebug 对象,直接使用qDebug() 这个东西就可以当作 cout 来使用。
- 再次运行

乱码问题被解决了!
使用 qDebug 的好处,在开发阶段,调试程序的时候使用的,如果后续将这个程序发布给用户,不希望用户看到这些日志的!!!qDebug 可以通过编译开关,来实现一键式关闭!!
小结
- 认识 QLabel 类,能够在界面上显示字符串。通过 setText 来设置的,参数 QString
- 内存泄漏 / 文件资源泄漏
- 对象树。Qt 中通过对象树,来统一的释放界面的控件对象。Qt 还是推荐 new 的方式在堆上创建对象,通过对象树,统一释放对象,创建对象的时候,在构造函数中,指定父对象(此时才会挂到对象数上),如果你的对象没有挂到对象数上,就必须手动释放!!!
- 通过继承自 Qt 内置的类,就可以打到对现有控件进行功能扩展效果,Qt 内置的 QLabel,没法看到销毁过程的,为了看到,就创建 MyLabel,继承自 QLabel,重写析构函数,在析构函数中,加上日志,只管的观察到对象释放的过程(也可以重写控件中的任何功能,不仅仅是析构函数,达到功能扩展目的)
- 乱码问题和字符集
- 如何在 Qt 中打印日志,作为调试信息,使用 cout 固然可以,但是并不是上策(字符编码处理的不好,也不方便统一进行关闭)Qt 中推荐使用 qDebug() 完成日志的打印