QT概述
什么是QT
QT是一个跨平台的C++图形用户界面应用程序框架。为应用程序开发者提供建立艺术级图形界面所需的所有功能。它是完全面向对象的,很容易拓展,并允许真正的组建编程。我们本系列QT基础讲解所用到的QT软件是 QT creator(Community)如果有需要下载的小伙伴可以后台私信我。
QT原理
QT就相当于在我们之前学习C++用到的Visual Stdio(以下用VS代替)编程软件中添加一个类,与QT不同的是VS软件会创建一个.h头文件以及一个.cpp文件,不会创建main.cpp。
言归正传,我们进入到QT 创建类的界面中:
QT环境下创建一个类的流程大概是:在.h头文件中声明所创建的类,在.cpp文件中引入,并自动生成析构函数和构造函数,同时添加一个主函数。
第一行“类名(C)”中填入的就是我们为这个创建的类所起的名字,第二行“基类(B)”就是我们这个类想要继承的基类,展开我们可以看到有三个选项:QMainWindow,QWidget,QDialog。下面我们简单介绍一下这三个基类以及他们之间的关系。
- QMainWindow:是一个窗口类,具有菜单栏、工具栏、状态栏。当我们选择继承QMainWindow的时候,我们所创建的类也就拥有和QMainWindow一样的性质,此时就形成了多态(PS:多态的目的就是减少通过一个类来创建新的类)。
- QWidget:窗口类,只有一个窗口,没有菜单栏等。
- QDialog :窗口类,例如对话框等都属于QDialog的范畴:当我们创建一个记事本的时候,输入一些内容,点击关闭按钮之后,会弹出一个对话框来询问是否保存这些内容,这个对话框就属于QDialog。
QMainWindow、QDialog、QWidget之间的关系
- 总结起来,三个类都属于窗口类,QWidget是其他两个窗口类的基类。
了解完上述内容之后,我们就来创建一个基于QMainWindow这一基类的类,创建完成之后我们会看到以下几个界面:
映入眼帘的就是"项目"二字
那么在哪能找到这个项目呢?
在我们保存的路径中就可以找到这些文件了。
.pro界面
头文件 .h文件界面
源文件 类的.cpp界面
源文件 main.cpp界面
界面文件 .ui文件界面
初始文件中各个部分的介绍
接下来我们来介绍一下初始情况下各个部分的大致内容:
.pro文件
着重介绍下面这两个:
- core:表示引入模块,core 包含了QT的一些特性如:信号与槽,用于保护指针(Qpointer)获取对象所有权等
- gui:该模块包含了窗体系统,事件处理,字体等
信号与槽:当我们关闭一个窗口时,这一举动会向信号槽发出一个信号,该信号被信号槽接收之后信号槽会发出指令。
.h头文件
由图可以看到,当我们在创建类的时候选择的基类就是QMainWindow类,在代码中就体现出来了;而构造函数的关键字"explicit"的作用是防止用"="调用构造函数;同时具有析构函数,下面有一个UI作用域中定义了一个ui指针(以后会讲到)。
类的.cpp文件
当进入到类的.cpp文件中,我们会看到有一行一长串的代码,别着急,我们慢慢分析:首先优快云one::代表的是作用域,紧接着的是优快云one的构造函数,后面的“:”以及后面的代码构成了初始化参数列表,再后面就是析构函数析构ui指针了。那么就有疑问了,刚刚的头文件中不是只创建了一个ui指针对象吗?为什么前面还有一个QMainWindow的构造函数呢?在此之前我们要看一下QMainWindow的内容,把鼠标放在QMainWindow上,然后按键盘上的F2,找到QMainWindow的构造函数:
我们可以看到,QMainWindow的构造函数是有参构造!!! 那么我们就要回顾一下C++中的知识:在学习C++的时候,我们知道当一个子类继承父类时,创建子类对象一定会先创建一个父类对象,而创建父类对象的时候一定会调用父类的构造函数,顺序为父类构造->子类构造->子类析构->父类析构,但如果父类构造函数不是无参构造时,我们需要在子类对象的初始化参数列表中显示调用父类构造函数。在VS中就应该是这样:
main.cpp
介绍一下
- QApplication:该类型创建的对象主要是管理应用程序的事件循环,处理用户输入和其他按键,通俗来说就是用户做出的一系列举动:关闭窗口啥的。
- w:定义一个创建的类的类型的w对象,这个“w.show()"的作用就是显示窗口
- return a.exec():等待一个指令来关闭窗口等
那么这时候就有一个疑问了,为什么不能是return 0呢?为什么改成return 0之后会看到窗口闪一下就没了?
答案很简单:我们知道创建的这个w对象,他是一个局部变量,当作用域结束的时候就被销毁了,那窗口肯定就消失了,所以我们要用return a.exec()来等待指令关闭窗口,说白了就是给窗口卡在那。