当前位置: 首页 > news >正文

qt初识--02

文章目录

  • qt初识--02
    • 对象树
    • 内存泄漏问题及其验证
    • 乱码的解释以及解决方案
    • 小结
    • 通过按钮实现hello world
    • 结语

很高兴和大家见面,给生活加点impetus!!开启今天的编程之路!!
在这里插入图片描述
今天我们进一步c++11中常见的新增表达
作者:٩( ‘ω’ )و260
我的专栏:qt,Linux,C++进阶,C++初阶,数据结构初阶,题海探骊,c语言
欢迎点赞,关注!!

qt初识–02

对象树

对象树在qt中的作用:使用对象树,将图形化界面上的内容组织起来,是为了能够在合适的时机,将这些对象统一释放

这个合适的时机具体是什么时候?就是在图形化面板关闭的时候!!
那么我们需要如何将对象挂到树上呢?
需要在widget的构造函数中创建控件对象的时候制定父类对象,就成功挂到树上了。
前者我们已经提到了在堆上创建对象和在栈上创建对象的区别:即对象神什么时候销毁。

难道我new对象就一定需要挂到树上吗?
不是的!如果没有挂到树上,就需要手动delete,否则内存泄漏。挂在树上就可以保证和对象树一并销毁了。

在这里插入图片描述

内存泄漏问题及其验证

接下来我们来验证绑定到对象树之后对象树析构,绑定到对象树上的东西也会随之析构:
点击项目->新建项目和文件->c++类->随后创建类名(选择需要继承的文件或者包含的头文件)- >完成

根据这个步骤,需要继承一个QLabel文件,随后创建一个MyLabel的cpp文件,但是在MyLabel.h的头文件中,QLabel找不到,此时需要添加头文件QLabel。
在这里插入图片描述
随后再我们自己创建的这个类中修改构造使变成有参构造
这里添加的是QWidget的指针变量!!
在这里插入图片描述
为什么是添加的这个呢?
在这里插入图片描述
我们来看main函数中的这个代码,其中创建了一个w对象,此时可以理解为就是图形化界面的对象,然后下面又调用了.show(),让这个图形化界面给显示出来。所以:我们要绑定的对象树就是这个w对象,类型是Widget,而Widget是继承自QWidget的。所以需要传QWidget的指针

此时,我们再去修改函数定义:
我们直接使用alt+enter直接可以跳转对应的cpp文件(快捷键方式)

在这里插入图片描述

需要明白:为什么我们要创建这个类,目的就是自定义析构,在析构函数中完成打印销毁这个对象的日志。

接下来来实现析构函数:
在这里插入图片描述
这里我们使用了自己的MyLabel替换Qlabel。
有了这个类,在widget的构造函数中来进行对象树的绑定!!
在这里插入图片描述
我们来看结果:
在这里插入图片描述
我们发现,析构确实是析构了,但是出现了乱码,这是什么问题呢?
继续向下看

乱码的解释以及解决方案

首先,请问,中文字符占几个字节?
如果你回答的只有一个数,那肯定是错的。为什么呢?
因为涉及字符编码的问题

现在普遍流行的两种字符编码:一种是gbk编码,一种是utf8编码,gbk编码中,中文占两个字节,在utf8中,中文占三个字节。vs默认是gbk编码,linux默认是utf8编码,实际上,utf8编码更灵活一些,utf8能够表示几乎所有语言都能够和数字对应(类比ascll码:一个数字对应一个字符,但是中文比26个字符多太多了)

在这两种编码方式中,不同汉字有着不同的编码,乱码的本质就是就是编码方式不同
那么是那两者不匹配呢?
其实就是cpp文件与终端不匹配!!
那我们应该如何修改呢?

在qt中,有这样一个类,QString,它能够自动的处理字符编码,而且,不止是QString,qt中也专门为我们提供了一个打印日志的类,也能够帮我们自动的处理字符编码问题,这个类是QDebug。
我们包含这个头文件,然后来看结果:
在这里插入图片描述
首先,这里的qDebug是一个宏,对应会展开,加上左移操作符就能够完成对于日志的打印。

小结

学到这里,我们来总结一下这篇文章和上一篇文章学习了什么

1:认识了QLabel类,能够在图形化界面上打印字符信息,通过setText来设置的。而且该函数的参数是一个QString
2:内存泄漏/文件资源泄露等问题
3:对象树,qt通过对象树,统一来管理图形化界面中的对象,而且,这些对象最好是通过new创建,想要挂到树上,必须调用父类的构造函数(即制定父类对象),如果说没有挂到树上,必须手动释放,否则内存泄漏
4:通过继承qt内置的类,能够达到功能扩展的效果(面向对象的继承,可以理解为就是对现有代码的扩展)
5:乱码问题和字符集(字符集就是数字对应一个字符,如utf8和gbk都是一个字符集)
6:如何在qt中打印日志,使用QDebug,作用是什么?自动处理字符编码问题,使用这个其实是使用了一个宏,同时还能够统一将日志关闭

说明:QDebug能够将打印日志关闭的话,还需要设置一个宏来控制打印信息关闭,这个宏为QT_NO_DEBUG_OUTPUT,具体不用记忆,使用的时候百度一下即可。至于为什么需要关闭打印信息呢?我们调试的打印信息不应该被用户看见。但是一个一个删掉打印信息有可能出错!!

通过按钮实现hello world

前者的QLabel* Label只能够打印字符串,只能够看,接下来我们实现还能够点。
在这里插入图片描述
我们使用push button一个按钮来控制hello world。
我们直接在ui文件中添加上这个push button。仍然是按住pushbutton随后拖拽到图形的编辑区。双击修改其中的文本内容。
在这里插入图片描述
此时我们就能够点击这个按钮了,但是仍然没有什么变化。
如果我们想要改变,我们使用connect函数(接下来信号与槽的知识后面会讲解,这里我们明白如何用即可)。

connect:qt中的connect的作用是qt中内置的QObject这个类提供的静态函数。这个函数的作用是连接信号与槽。

我们来看一下结果
在这里插入图片描述
如果我们想修改一下,来回“跳跃”,只需修改代码即可完成:
在这里插入图片描述
底层我们会使用到connect这个函数,这个函数有四个参数:
第一个参数:谁发出的信号
第二个参数:发出的什么类型的信号
第三个参数:谁来接收信号
第四个参数:怎么来处理这个信号

书写如下:
在这里插入图片描述
那么为什么我们的这个对象叫这个pushButton这个名字呢?
我们来看一下qt desinger的界面:
在这里插入图片描述
我们发现这个对象名(object name)叫做pushButton,而且每次添加控件,都能够保证控件的名字不相同。

前面我们已经提到过,Widget.ui会被qmake处理随后生成ui_widget.h的头文件,我们来看下这个头文件中的内容:
在这里插入图片描述
我们能够发现其中多了一个成员变量pushButton,那么ui是哪里来的呢?
在这里插入图片描述
ui是在widget.h文件中的成员变量,再来看ui_widget.h文件中:
在这里插入图片描述
Widget是继承Ui_Widget,说明Ui_Widget中有的,Widget也有,前面使用Widget定义了ui,所以ui中就有pushButton。

总结:
1:widget.ui文件经过qmake处理过后产生Ui_Widget.h文件,ui_widget自动生成的代码中包含pushButton的名字,这个名字,就是根据控件对象的名字得来的
2:在objectname中,设置成什么值,对应qmake产生的变量就叫什么名字。

结语

今天的文章到此为止,不足之处欢迎留言指出,我们下期再见!!
路漫漫其修远兮,吾将上下而求索!!
在这里插入图片描述

相关文章:

  • 扣子数据库实战案例:搭建AI登记助手
  • 大数据学习(138)-Hive数据分析3
  • 部署http服务
  • 2025-06-13【api】阿里百炼api调用方法
  • Windows 提权工具(“Potato“ 系列)用法指南
  • 基于51单片机的温室植物生长环境监测系统
  • WPF将容器内的组件按比例缩放
  • Linux中shell编程的函数递归用法和脚本自动化讲解
  • Redis : set集合
  • wpf 解决DataGridTemplateColumn中width绑定失效问题
  • GaussDB创建数据库存储
  • Tomcat调优
  • Linux Alias 魔法:命令行效率提升秘籍
  • docker-Dockerfile 配置
  • 晶圆搬运机器人与RFID半导体读卡器携手赋能半导体制造高效变革
  • CentOS变Ubuntu后后端程序SO库报错,解决方案+原理分析!
  • centos 7.9 升级ssh版本 7.4p1 升级到 8.2p1
  • centos转移mysql的数据存储目录
  • 快速排序:分治思想的经典实践
  • 【Linux系统编程】进程信号 - 信号产生
  • 我做的网站搜不到/app注册推广
  • 做网站毕业论文/西安网站关键词优化费用
  • 深圳响应式网站建设公司/最新军事新闻今日最新消息
  • 一个网站专门做摩托车/培训心得体会万能模板
  • 新风格网站/今日冯站长之家
  • 福州网站制作网站/东莞做网站的联系电话