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产生的变量就叫什么名字。
结语
今天的文章到此为止,不足之处欢迎留言指出,我们下期再见!!
路漫漫其修远兮,吾将上下而求索!!