Qt — 对象树

目录

查看自动释放的过程

小结


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

使用对象树,把这些内容组织起来,最主要的目的,就是为了能够在合适的时机(窗口关闭/销毁的时候),把这些对象统一进行释放。

如果某个对象提前销毁,此时就会导致对应的控件在界面和三个不存在了。

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

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

当把对象改在栈上创建,此时可以看见,运行起来的程序五恶法显示出 hello world,此时 label 对象随着构造函数的结束,就销毁了。

查看自动释放的过程

  1. 创建一个类,选择C++
  1. 填写类名
  1. 一路next,多出来了一个 mylabel.h 的头文件 和 mylabel.cpp的文件
  1. 添加头文件:#include <QLabel>
  1. F4 切换,头文件和对应的 .cpp 文件

调用这个才能让我们自己类的对象加入到 Qt 对象树中,创建自定义的类,最主要的目的,是自定义一个析构函数,在析构函数中,完成打印,方便我们看到最终的自动销毁对象的效果!!!

  1. 添加析构函数,将光标放在析构函数上,按 ALT + ENTER,会弹出选项
  1. 选择第一个,再敲一下回车就行了,就可以自动的在cpp文件中添加函数的定义了:
  1. 析构函数
  • 先将对象创建出来
  • 填写析构函数
  1. 运行起来,点击下方的应用程序输出,点击关掉窗口

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

  1. 解决乱码,乱码的原因只有一个:编码方式不匹配!!!

计算机中,在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 来使用。

  1. 再次运行

乱码问题被解决了!

使用 qDebug 的好处,在开发阶段,调试程序的时候使用的,如果后续将这个程序发布给用户,不希望用户看到这些日志的!!!qDebug 可以通过编译开关,来实现一键式关闭!!

小结

  1. 认识 QLabel 类,能够在界面上显示字符串。通过 setText 来设置的,参数 QString
  2. 内存泄漏 / 文件资源泄漏
  3. 对象树。Qt 中通过对象树,来统一的释放界面的控件对象。Qt 还是推荐 new 的方式在堆上创建对象,通过对象树,统一释放对象,创建对象的时候,在构造函数中,指定父对象(此时才会挂到对象数上),如果你的对象没有挂到对象数上,就必须手动释放!!!
  4. 通过继承自 Qt 内置的类,就可以打到对现有控件进行功能扩展效果,Qt 内置的 QLabel,没法看到销毁过程的,为了看到,就创建 MyLabel,继承自 QLabel,重写析构函数,在析构函数中,加上日志,只管的观察到对象释放的过程(也可以重写控件中的任何功能,不仅仅是析构函数,达到功能扩展目的)
  5. 乱码问题和字符集
  6. 如何在 Qt 中打印日志,作为调试信息,使用 cout 固然可以,但是并不是上策(字符编码处理的不好,也不方便统一进行关闭)Qt 中推荐使用 qDebug() 完成日志的打印
相关推荐
Quz14 小时前
QML Repeater 数据模型:ListModel 与 C++ QAbstractListModel
qt
Quz14 小时前
QML Repeater 基础用法:整数、JS 数组、字符串数组三种模型
qt
江湖人称菠萝包21 小时前
【Qt】《Qt 5.9 C++开发指南》笔记-Chapter3-Qt类库概述
笔记·qt·qt5
qq_344920561 天前
Qt事件过滤器
开发语言·c++·qt
sunriver20001 天前
【Qt】由于找不到 Qt6Core5Compatd.dll
qt·qt6core5compatd
qq_344920561 天前
Qt 鼠标双击QLabel全屏显示图像
c++·qt
江湖人称菠萝包1 天前
【Qt】《Qt 5.9 C++开发指南》笔记-Chapter4-常用界面设计组件
笔记·qt·qt5
实心儿儿1 天前
Qt — QtCreator 创建项目
qt
Quz2 天前
QML 常见的四种导航布局
qt