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

相关推荐
望获linux2 小时前
【Linux基础知识系列】第一百一十篇 - 使用Nmap进行网络安全扫描
java·linux·开发语言·前端·数据库·信息可视化·php
雷达学弱狗5 小时前
链式法则解释上游梯度应用
开发语言·前端·javascript
小清兔8 小时前
c#基础知识
开发语言·数据库·学习·unity·c#·游戏引擎·.net
奇某人10 小时前
【语法】【C+V】本身常用图表类型用法快查【CSDN不支持,VSCODE可用】
开发语言·vscode·markdown·mermaid
做一位快乐的码农10 小时前
php程序设计之基于PHP的手工艺品销售网站/基于php在线销售系统/基于php在线购物商城系统
开发语言·php
@珍惜一生@10 小时前
Qt开源库
开发语言·qt·开源
Slaughter信仰11 小时前
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第四章知识点问答补充及重新排版
java·开发语言·jvm
心灵宝贝11 小时前
Mac用户安装JDK 22完整流程(Intel版dmg文件安装指南附安装包下载)
java·开发语言·macos
secondyoung11 小时前
一文丝滑使用Markdown:从写作、绘图到转换为Word与PPT
开发语言·vscode·编辑器·powerpoint·markdown·visual studio·mermaid
雨枪幻。12 小时前
spring boot开发:一些基础知识
开发语言·前端·javascript