QT C++(QT对象树与内存泄漏管理,QT中文乱码问题)

文章探讨了QT中的内存泄漏问题,尤其是在对象树结构中,以及如何通过TestLabel和QString处理中文乱码,指出了解决方案是使用QString并利用qDebug进行统一的日志管理和编码转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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中文乱码

在计算机中不同字符集,每个汉字的大小不同。

目前表示汉字的方式有两种:

  1. GBK:使用2字节表示汉字(Windows)
  2. UTF-8:边长编码,表示一个符号使用的字节数有变化。一般一个汉字是三个字节(Linux)

如果字符串本质是utf-8的编码,但是控制台是按照gbk的方式解析显示的,就会出现乱码

在QT上,字符串的编码格式是和文件的编码格式决定的

解决方式:

  1. 使用QString数据结构代替string字符串,自动处理编码格式

  2. QT中提供了qDebug来打印信息,自动处理编码格式qDebug()<<"DEBUG:中文";

    QDebug是QT中的类,qDebug是宏,内部封装了QDebug

在这里插入图片描述

使用qDebug打印的调试日志,是可以统一关闭的,在发布时可以通过编译开关统一关闭打印日志。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NUC_Dodamce

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值