文章目录
- 1. QT对象树与内存泄漏
- 2. QT中文乱码
1. QT对象树与内存泄漏
#include "widget.h"
#include "ui_widget.h"
#include <QLabel>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//通过代码构建界面
//创建label标签
QLabel* label=new QLabel(this);//this表示给当前这个对象指定父对象
label->setText("Hello World 2");//QString 中存在c字符串转化为QString,这里会隐式类型转化
}
Widget::~Widget()
{
delete ui;
}
上述代码label没手动释放指针。但是在QT上并不会导致内存泄漏
其中关键在于在new 这个对象时传入了this指针,这个对象被挂到对象树上
在网页开发中也涉及类似的对象树(DOM),本质上也是一个N叉树。通过树形结构把界面上的各种元素管理起来。
具体的对象树如下图案例:
使用对象树,把这些内容组织起来目的就是在合适的时机将这些对象释放(在窗口关闭)
如果提前释放资源会导致对象树对应节点下的资源被释放
下面代码验证这个步骤:
创建新文件:
使用自定义的TestLabel继承原来的QLabel,保持原有的QLabel功能不变的情况下给TestLabel扩展新析构函数,在自定义对象析构时打印一个自定义日志,方便观察程序运行状况。
#ifndef TESTLABEL_H
#define TESTLABEL_H
#include <QLabel>
class TestLabel : public QLabel
{
public:
//将自定义对象加到对象树上
TestLabel(QWidget*parent);
~TestLabel();
};
#endif // TESTLABEL_H
#include "testlabel.h"
#include <iostream>
TestLabel::TestLabel(QWidget*parent):QLabel(parent){}
TestLabel::~TestLabel()
{
std::cout<<"DEBUG:中文"<<std::endl;
}
#include "widget.h"
#include "ui_widget.h"
#include <QLabel>
#include "testlabel.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//通过代码构建界面
//创建label标签
// QLabel* label=new QLabel(this);//this表示给当前这个对象指定父对象
// label->setText("Hello World 2");//QString 中存在c字符串转化为QString,这里会隐式类型转化
TestLabel* test=new TestLabel(this);
test->setText("Test");
}
Widget::~Widget()
{
delete ui;
}
在窗口销毁时会自动调用自定义类的析构函数,在控制台上打印信息。
由上面可知,项目并没有释放指针,在窗口销毁后自动释放了堆的控件,避免内存泄漏。但是可以看到这里的汉字出现了乱码
2. QT中文乱码
在计算机中不同字符集,每个汉字的大小不同。
目前表示汉字的方式有两种:
- GBK:使用2字节表示汉字(Windows)
- UTF-8:边长编码,表示一个符号使用的字节数有变化。一般一个汉字是三个字节(Linux)
如果字符串本质是utf-8的编码,但是控制台是按照gbk的方式解析显示的,就会出现乱码
在QT上,字符串的编码格式是和文件的编码格式决定的
解决方式:
-
使用QString数据结构代替string字符串,自动处理编码格式
-
QT中提供了qDebug来打印信息,自动处理编码格式
qDebug()<<"DEBUG:中文";
QDebug是QT中的类,qDebug是宏,内部封装了QDebug
使用qDebug打印的调试日志,是可以统一关闭的,在发布时可以通过编译开关统一关闭打印日志。