【Qt】对象树(生命周期管理)和字符集(cout打印乱码问题)

1.对象树

++对象树统一管理窗口内部控件的生命周期,++本质是一颗多叉树。

new对象会加入到对象树中,窗口关闭/释放时统一销毁,不需要手动delete。

如果在栈上定义label对象,生命周期随构造函数,无法正常显示控件。

1.1演示回收过程

1.创建项目,选择继承QWidget。

2.新建一个类Mylabel,继承Qlabel。

创建mylabel的目的,继承QLabel类,自定义析构函数,打印日志,展示释放过程。

关键在于mylabel的 构造函数 参数一定要是Qwidget对象指针。

这样才能借助指针,在mylabel的构造函数,初始化列表调用父类QLabel的构造,传入QWidegt*,这样才能让mylabel对象挂到QWidget对象树上。

使用技巧:通过F4切换对应的头文件和源文件。

Mylabel类声明

mylabel.h

Mylabel类定义

mylabel.cpp

技巧:

光标放在函数声明上,alt+enter,选项中选择添加定义,自动在对应的cpp文件中添加相同的函数定义。

在Widget类的构造函数中创建Mylabel对象

期望运行效果:在关闭窗口的时候应该打印日志。

出现问题:使用cout打印乱码

原因:字符集不匹配

解决方法:使用Qt自带的打印日志工具------qDebug()

2.qDebug()

Qt内置日志打印工具,处理字符集不匹配问题问题。

头文件:QDebug

使用宏:qDebug() << "";

优点:调试阶段打印,发布时可以统一关闭,取消打印。

3.字符集

计算机保存字符的方式:二进制。

ASC码,一个数字代表一个字符,范围为0-127,英文字符种类有限,使用一个字节的空间保存即可。

中文字符的种类,日常4k多,加上生僻总共6w多。用数字一一对应,就可以表示所有汉字字符。

不同字符集就是 采用不同的数字 来表示一个字符。

常用的字符集 1.GBK 2.UTF8。

GBK,使用2字节数字表示一个汉字。windows系统中文版本,默认字符集为GBK。

utf8,变长编码,使用的字节数有变化。一个字符1-4个字节,能省点空间就省点。一般常用的汉字字符是3字节,还支持各种语言的字符。Linux默认字符符集是utf8。

问题:一个汉字字符占多少字节?

1.明确使用的字符集

2.gbk 2字节。utf8,常用的汉字用3个字节表示。

4.使用技巧

1.通过F4切换对应的头文件和源文件。

2.自动在cpp中添加定义

光标放在函数声明上,alt+enter,选项中选择添加定义,自动在对应的cpp文件中添加相同的函数定义。

2.查看mylabel.cpp文件的编码方式

  • 右键,在ex中显示
  • 用记事本打开文件,另存为,看到用utf8编码

5.简单小结

1.new对象,挂到对象树上管理生命周期,防止内存泄漏

2.QLabel.setText设置控件显示文本

3.编码问题:打印时推荐使用qDebug()

4.可以继承Qt内置类,扩展功能/重写方法

相关推荐
lly20240610 分钟前
Highcharts 饼图:数据可视化利器
开发语言
lw向北.16 分钟前
Qt For Android之环境搭建(Qt 5.12.11 Qt下载SDK的处理方案)
android·开发语言·qt
IT女孩儿38 分钟前
JavaScript--WebAPI查缺补漏(二)
开发语言·前端·javascript·html·ecmascript
m0_7482389238 分钟前
webgis入门实战案例——智慧校园
开发语言·ios·swift
Clockwiseee1 小时前
PHP伪协议总结
android·开发语言·php
小灰灰搞电子1 小时前
Qt实现Android的图案密码(图形解锁)源码分享
开发语言·qt
吴冰_hogan2 小时前
JVM(Java虚拟机)的组成部分详解
java·开发语言·jvm
白宇横流学长3 小时前
基于java出租车计价器设计与实现【源码+文档+部署讲解】
java·开发语言
数据小爬虫@5 小时前
Java爬虫实战:深度解析Lazada商品详情
java·开发语言
songroom5 小时前
Rust: offset祼指针操作
开发语言·算法·rust