1. 对象树
在堆上开辟空间 并管理
![](https://i-blog.csdnimg.cn/direct/ef8a34cde61745cd985e4fb6bcf8830f.png)
该代码只进行new(在堆上开辟空间) 而没有delete 正常来说是会造成 内存泄露的问题
但是在Qt中 将 new后创建对象的生命周期 交给 对象树统一管理
![](https://i-blog.csdnimg.cn/direct/8fd69986fe73460a9e2ee8c1e658b022.png)
假设存在这样的界面 窗口为 QWiget 对象
在界面中 包含其他的元素
通过对象树来进行表示
![](https://i-blog.csdnimg.cn/direct/51b38b02db924b6e9a8f0af57f8c68f2.png)
Qwidget 作为 根节点
其中包含几个子节点 分别为 QLabel QPushButton QListWidget 三个 对象
在 QListWidget中 包含 若干个 QListltem
通过这个树形结构 就把界面上要显示的控件 都组织起来了
使用对象树 把这些内容组织起来 目的是为了能够在合适的时机(窗口关闭/销毁) 把这些对象统一进行释放
栈上开辟 与 堆上开辟 的区别
![](https://i-blog.csdnimg.cn/direct/a8a5c51a4e2042c2adb0c46726473e23.png)
当把对象改成在栈上创建 此时就可以看到 运行起来的程序 无法显示出 hello world
此时的 label 对象 随着 构造函数的结束 就销毁了
所以更推荐在堆上创建的方式
2. 乱码问题的解释
编码方式的区分
在计算机中 一个汉字 占有几个字节?
需要先判断当前 中文编码使用的是那种字符集
日常的常用字为 4k 左右
加上各种生僻字 总数为 6w 左右
使用一个大表格 给每个汉字 分配一个整数即可
表示汉字的字符集 主要分为 两种方式:
1. GBK (中国大陆)
使用两个字节表示一个汉字 windows简体中文版 默认的字符集是 GBK
2. UTF-8 /utf8
变长编码 表示一个符号 使用的字节数有变化
在utf8中 一个汉字 一般表示 3个 字节
Linux 中 默认 就是 utf8
出现乱码的原因
出现乱码的原因 : 编码方式不匹配
若字符串本身 是 utf8编码的 但是终端是按照 GBK的方来进行解析 显示 此时就会出现乱码
( utf8的数值 查询 GBK的码表 )
查看当前文件的编码方式
![](https://i-blog.csdnimg.cn/direct/fec830336ce74152bd1a303487dbc35d.png)
点击.cpp文件 并在 Explorer中显示
![](https://i-blog.csdnimg.cn/direct/c0a94afb62b7494d800c968ef6a1a826.png)
点击.cpp文件 选择编辑
![](https://i-blog.csdnimg.cn/direct/b70b0a48318045e7b5dd1851f5ed44f2.png)
点击文件 选择另存为
![](https://i-blog.csdnimg.cn/direct/f37723a74b574ccd926d16658d9cb93b.png)
若显示 UTF-8 则说明这个文件 为 UTF-8 编码
若显示 ANSI 则说明这个文件 为 GBK 编码
如何处理 文件与 终端 编码方式 不统一
Qt中 存在 QString 可以帮助我们自动处理编码方式
同时 Qt中提供了 专门用来 提供打印日志的工具 —— qDebug() 也能自动处理编码方式
![](https://i-blog.csdnimg.cn/direct/2294f6a9835a4f27a68857bdec69ae20.png)
当使用 C++的 std去打印时 发现结果会出现乱码 即编码方式 不统一
(文件为 UTF-8编码方式 而终端不为 UTF-8编码方式)
![](https://i-blog.csdnimg.cn/direct/557b5120763042b1922cc58255b79f10.png)
QDebug 是 Qt中的一个类 但是又不会直接使用这个类
qDebug() 是一个 宏 封装了 QDebug 对象
qDebug() 可以当作 cout 来使用
![](https://i-blog.csdnimg.cn/direct/c5a95e787cdf497fb6aa392a8bed39e1.png)
qDebug() 能自动处理编码方式 所以此时编码方式一致 就能输出正常的汉字了
若在Qt中 想通过打印日志的方式 输出一些调试信息 优先使用 qDebug()
同时 qDebug() 还可以对 打印的调试日志 统一进行关闭