【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内置类,扩展功能/重写方法

相关推荐
大气的小蜜蜂10 分钟前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·qt·sqlite
Esaka_Forever15 分钟前
Python 与 JS (V8) 垃圾回收核心区别 + 底层根源分析
开发语言·javascript·jvm
pp起床22 分钟前
黑马点评 - 短信验证码登录实现
java·开发语言·tomcat
芒鸽22 分钟前
在仓颉语言里造一个没有反射的服务端框架
开发语言·华为·harmonyos
尘中远28 分钟前
【Qwt 7.0 系列】总体架构解析 —— 从单体到三库模块化的演进
qt·matplotlib·绘图·qwt·科学绘图
CodeStats32 分钟前
《源纹天书》第121-125章:源匠归来——全栈重构与归元圣域的2.0时代
java·开发语言·源纹天书
binbin_5233 分钟前
UIAbility 与 WindowStage:窗口创建、加载、销毁的完整链路
开发语言·javascript·深度学习·华为·harmonyos
AI人工智能+电脑小能手33 分钟前
【大白话说Java面试题 第154题】【06_Spring篇】第14题:Spring 支持的 Bean 作用域
java·开发语言·spring·面试
xcyxiner1 小时前
DicomViewer (编译以及优化)8
qt
旖-旎1 小时前
QT界面优化(6)
开发语言·c++·qt