初识QT-对象树

发布于:2025-07-02 ⋅ 阅读:(18) ⋅ 点赞:(0)

初识QT-对象树

在这里插入图片描述

引入

QLabel* label=new QLabel(this);

这样开辟空间不会造成内存泄漏

label对象会被析构释放掉,原因在于把对象挂到对象树上

什么是对象树?

本质上是树形结构(N叉树),通过树形结构把界面上各种元素组织起来

为什么我要更推荐在堆上开辟空间,如果在栈上开辟可能会出现以下情况:
在这里插入图片描述

对象树的应用:
在这里插入图片描述

如在QWidget的界面

在这里插入图片描述

创建对象树

MyLabel::MyLabel(QWidget*parent):QLabel(parent)//调用父类的构造函数才能把对象加到对象树上
{

}

创建自定义对象的作用就是自定义析构函数,在析构函数中完成打印,看到对象被销毁的全过程

注意我们在写下一个函数的声明的时候可以利用快捷键Alt+Enter可以在对应的.cpp文件中添加对应的函数的定义

有关于乱码的问题及解决方案

我们在C++中学过可以用cout来输出,但是在QT中可能会变成乱码,

在这里插入图片描述

如何查看是哪种字符集呢?
在这里插入图片描述

右击并选择在Explorer中显示

此时会弹出窗口,再选择用记事本编辑,选择另存为,这时候可以看到编码格式了

在这里插入图片描述

如果显示的是ASNI,那么就是GDK

那么该如何解决呢

QT中提供了一个叫QDebug()的工具,借助这个,可以完成日志的打印

需要添加头文件

#include <QDebug>

使用方式:

QDebug()<<"MyLabel";

QDebug()对比cout来说还有个好处:打印的调试日志是可以统一关闭的

小结

1.QLabel类的功能:能够在界面上显示字符串。是通过SetText来设置的,参数是QString(QT里面会将容器封装到QString里面)

2.内存泄漏/文件资源泄漏是很严重的问题

3.QT通过对象树来统一释放界面的控件对象,在QT中更推荐用new的方式,在堆上创建,但是需要指名父类对象是谁。

​ 如果没有挂到对象树上,需要记得手动释放

4.面向对象中的继承,实际上本质上就是对现有代码的扩展,如我们在对象树中想要查看对象的销毁过程,QT自带的QLabel不能查看,所以我们需要自己创建MyLabel这个类继承QLabel,来看到析构的过程。当然不仅可以看析构,也可以实现任何功能

5.为什么要通过打印日志的方式来调试?

bel不能查看,所以我们需要自己创建MyLabel这个类继承QLabel,来看到析构的过程。当然不仅可以看析构,也可以实现任何功能

5.为什么要通过打印日志的方式来调试?

因为如果一个bug出现的概率特别小,那么很有可能通过编译器看不出来,所以需要借助日志