QT是一个十分常见的图形化界面开发工具,在我们学习QT的不同控件之前,我们需要首先了解到一个图形界面由哪些基本的元素所组成,并且如何构建代码和图形化界面间的联系。
目录
QT项目选择:
当我们打开新建一个QT的项目时,我们需要进行很多项目类型的选择,而如何去了解根据不同的选项的目的去进行选择也是很重要的。
下面是我们打开QT项目的时候遇到的第一个选择界面,项目一栏我们常用QT制作APP所以一般这里都是选择Applciation。然后是中间的一排,这一排从上到下分别是桌面平台图形化界面应用程序、控制台应用程序(黑框框)。目前我们初步学习先了解这两个比较常用的。
下面选择项目路径和填写项目名 以及 编译器的选取没有什么好说的:
我们把目光放到细节选取这里,这里的我们一般需要改变的就是基类,基类有三大类,分别是QMainWindow、QWidget、QDialog等三个。
QMainWindow是一个主窗口类,它是一个包含状态栏、主菜单等我们常用的工具的界面。
QWidget是一个最基础的可视化界面,可以理解为最原始的一张白纸,我们需要向其添加一些控件和布局。
QDialog是一个对话框,我们如果需要建立对话框类界面则需要选它,并且如果它后面还有窗口,那么后面窗口不可选择。
QT项目基本组成
我们新建一个QT的项目,打开它的项目栏,可以大致看到其文件由四类型组成:
.pro文件、.h文件、.cpp文件和.ui文件
这四种文件分别对应整个UI结构中的四个抽象化部分。首先是.pro文件,这个文件中会包含我们对这个项目的一些配置:例如第一行中对QT版本大于4的要执行QT +=core gui。这就类似于C语言中的加头文件的操作,而这里是对模块的导入。
然后TARGET就是我们最后生成的APP的.exe可执行文件的名称;
TEMPLATE就是我们选取的QT制作模块,这里是制作应用程序APP;
项目的其它三类文件中包含的内容等。
接下来就是.ui文件,这个文件是我们用于配置展示窗口的文件,我们可以通过直接操作将一些控件放上去或者修改采用xml格式的文件内容来设置框架的布局和控件的选取排放。
![](https://i-blog.csdnimg.cn/blog_migrate/9cee73baef5d987dfbcfbb8351e2c8ae.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e0e5966d874b136f4168b39e3123ffc7.png)
最后就是.cpp文件和.h文件,这个相信学习过c++的同学都很熟悉,就是源文件和头文件。而这里的main.cpp文件用于写实现逻辑框架,也是程序的入口,而weight.cpp用于写窗口类的具体实现,而weight.h就用来声明具体的窗口类,是我们设计的一个个窗口类的头文件。
除开上面的所以文件,还有一个ui_widget.h的头文件,这个文件里面存储的是我们根据UI自动布局以及信号、槽排布而自动生成的代码。
UI设计界面
下面我们以UI的设计界面为例,它共有5大部分组成。左边红色部分是控件面板即存放控件的地方,如按钮、文本等,我们可以直接将某个控件拖动出来。中间黄色区域是我们设计出来的UI的预览图,我们也可以直接拖动控件进行布局。
右上方粉色区域是存放我们使用到的控件面板的区域,其中每一种控件都是一个类,而我们实例化出来的单个控件都是一个具体的对象。在这里,左边一栏就是对象名,右边一栏就是类名,我们可以通过对象名确定我们每一个UI,同时也可以修改对象名(如下面右图)。
而蓝色区域是存放某一个对象的下面的属性、方法的一个框架,例如我们实例化出来一个按钮对象,那么我们对该按钮的一些设置(如大小、里面的字体、颜色、是否触发事件)等都是可以在该按钮的属性栏中查看。而如果我们仔细将所有折叠项都折叠起来,可以看到我们的按钮类继承自多个父类。其中最大的父类是QObject,其次是我们创建的基本窗口父类QWidget,再其次就是一个抽象化的按钮父类QAbstractButton,最后才是我们的按钮窗口类QPushButton。所以通过下面的框架我们不难看出一个控件是通过继承父类的属性和方法制作而成的。
既然子类是继承了很多的父类属性,并且QT这个设计窗口还为我们提供了很多的调制某个对象属性的属性控制栏,那么我们也可以通过修改这个属性控制栏里对应属性的参数来达到对我们的对象进行直接操作和修改。例如上面左图中我就通过修改text属性达到对按钮的显示文本进行修改。
最后是下面绿色部分有两大窗口,它由两大板块组成,包括信号、槽模块和Action动作编辑器模块。这里我们先来看信号、槽模块,这个模块是可以让我们通过避免代码书写的方式手动设置一些事件。例如我们想让点击按钮1就会关闭UI,首先我们先新建一个信号条目,然后根据需要依次选择按钮1的对象名、触发事件的形式(点击形式)、响应发生事件的对象、事件发生的结果。
下面就是根据该设置设置完成后实现的点击关闭操作:
main函数
main函数是整个程序的入口,如果我们打开main函数,会发现它里面初始的内容是下面这段。前面的导入包等等都不讨论。我们主要来看main函数里面的内容,main函数里面先创建了一个a类,这个类表明该程序将用于创建一个应用程序app,然后会实例化一个widget的对象,这个对象的名字是w,w对象是一个窗口基类,是一个最基础的窗口。接着我们再调用show函数来让这个窗口展示,最后返回的是a里面的exc函数,它表示让会一直等待消息去处理或者处理反复进行的数据。
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
Widget.h / Widget.cpp
接下来我们来看看widget.h这个文件,这个文件里面存储的都是我们要创建的窗口类的头文件。首先我们从第一个大括号里面的内容可以知道在UI这个命名空间里面有一个Widget的类,这是一个声明,声明我们将要要使用的这个类Widget是继承自之前ui_Widget.h这个文件里面的类Ui_Widget,而这个Widget类还继承自Qwidget这个类,如果我们打开UI_Widget.h这个文件,我们可以很清晰看出这条声明:
而这个方法下面比较有价值的是private里面的指针ui,这个指针指向一个可视化的界面,它指向的数据类型是UI下面的Widget类型。
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
然后我们再来看Widget.cpp的文件,首先是调用Widget这个类里面的构造函数,并且传入一个Qwidget类型的指针。随后初始化含有对象的类对象成员列表。它的成员是它的一些基类,所以在初始化时需要调用它们的构造函数,例如Qwidget类初始化、ui类的初始化等。而这里我们着重注意的是ui这个类,它在Widget的构造函数被调用时ui->setupUi(this)的含义是将ui与我们创建的信号、槽和控件等相互结合。让我们创建的指向可视化界面的ui指针与我们创建的控件布局等信息相关联,而我们创建的这些具体的指针布局等等都位于Ui_Widget这个类的setupui这个方法里面。所以我们需要让ui指向我们创建的这些控件布局等。
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}