Qt开发——环境搭建
开发环境概述
Qt开发环境需要按照3个部分
1.C++编译器(gcc,cl.exe......不是Visual Studio) 编译器 != IDE 编译器只是IDE调用的一个程序
2.Qt SDK (SDK =>软件开发工具包,当然一般的SDK中会内置编译器,没有的才需要装编译器)
具体安装过程中记得把对应的C++编译器给一起勾选上。
3.需要有一个Qt 的集成开发环境(IDE)
1)Qt官方提供的Qt Creator(最容易入门,开箱即用,不需要任何额外的配置;虽然使用过程会有bug)
2)Visual Studio 功能更强,但是需要额外的配置更多,更容易出错。需要给 VS 安装 Qt插件,并且需要包Qt SDK使用 VS的编译器重新编译
3)Eclipse
说是安装3个东西,其实按照Qt SDK ,另外两个就都有了。
QtSDK下载
https://download.qt.io/archive/qt/国内清华源
https://mirrors.tuna.tsinghua.edu.cn/qt/archive/qt/
这里我选的是5.14版本

安装QtSDK
没有账号可以注册账号,如果不想注册就把网络断开

记得选择编译器

下边这个也要选

然后就一直下一步直到安装成功
环境变量配置
给Qt配置一下环境变量,当然没有配置也不是不可以用,但是最好还是配置一下
在开始菜单搜索环境变量,弹出此窗口

点击环境变量选项,然后弹出此窗口

有用户变量和系统变量,Windows是支持多用户的,当然一般也不会把自己的电脑给别人用,这里配置哪个都没区别。
其中有个环境变量为Path,Linux中也有个环境变量叫PATH,但是作用是一样的。
在Linux中你输入一个命令,就会去PATH下对应的目录中查找对应的程序。
此处就需要把Qt SDK 中的某个目录加入到Path环境变量中
我安装的是这个目录
D:\code\Qt\QtSDK\5.14.0\mingw73_64\bin是这个包含了一大堆动态库和exe的目录

为什么要配置环境变量?
让操作系统/Qt Creator 工具,能够找到Qt SDK中提供的exe
也是运行Qt 程序的时候,能够找到对应的.dll动态库
认识Qt SDK 中的重要工具
这几个就是SDK中自带的一些工具程序,也是我们在开发中需要关注的

第一个Qt助手,打开它就是一个文档,到时候可以在这里查函数啥的

第二个Qt 设计师,这是一个图形化的可以通过拖拽控件方式来去设计界面的工具,到时候会结合Creator来使用

第三个Linguist,语言家。支持国际化,有的时候,写的程序要和国际接轨,允许你单独创建一个语言配置文件,把界面中所用到的文字都配置到文件中,并且在文件中提前的把各种语言的翻译都配置进去,就可以起到"一键式切换语言"的效果

第四个没啥好说的就是一个命令行终端,黑框一个,可以在里边写一些命令啥的

最后一个Qt Creator,Qt 的集成开发工具(学习Qt过程中最常用的一个工具)

使用Qt Creator创建项目
左上角就可以创建

应用程序,如果使用Qt写一个GUI程序,就应该选择这个。

右侧还有许多选项,我们要选的是第一个,一个图形化界面的模板

第二个是控制台程序模板TUI
再下面还有Qt for python ,Qt还可以用Python、java来编写
以上的都是传统的开发GUI的方式叫做Qt Widget
后面的都是Qt Quick,Qt搞出的一套新的用来开发GUI 的方式。

选好后就choose,然后填写名称和路径

然后build system就有三个选项来选

构建系统,通过Qt写的程序,涉及到一系列"元编程"技术。
元编程:通过代码来生成代码
Qt框架会再编译的时候,自动先调用一系列的生成工具,基于你自己写的代码,生成一系列的其他的C++的代码,最终编译的代码也是最后生成的这些代码
主要还是选择qmake,它是一个老牌的Qt构建工具;Cmake也是一个老牌的,并非Qt专属的一个构建工具,Qbs是新一代的但是用的人非常少。

注意一下这个 base class:使用QT creator创建项目,会自动生成一些代码出来。生成的代码就包含了一个类,此处就是要选择这个自动生成的类的父类是谁
那么就有一下三个选项

第一个:完整 的应用程序窗口(可以包含菜单栏、工具栏、状态栏...)
第二个:表示一个控件(窗口上的一个具体的元素:输入框、按钮、下拉框、单选按钮......)
第三个:表示一个对话框
这里我们选第二个,比较简单

此处生成的文件名和类名是相关联的

当然这样的关联并非强制的(推荐大家搞成一样的)
From file非常关键
Qt 中创建的图形化界面的程序,有两种方式:
1、直接通过C++代码的方式创建界面
2、通过from file ,以图形化的方式来生成界面
此时就可以使用Qt Designer或者直接使用 Qt Creator来编辑这个ui文件从而以图形化的方式快速方便的生成图形界面

选择 翻译文件 (对应的语言)此处暂时不关注,直接下一步

选择一下,基于哪个编译器的Qt SDK来构建后续代码

none或者git,然后点击完成

项目就创建好了。
左下角有个运行符号,就可以运行代码

项目代码解释
首先就是一个mian.cpp文件,里边包含了一个简单的main函数
#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}两个参数,argc命令行参数的个数,argv命令行参数的内容
然后以这两个参数构建了一个对象,编写一个Qt 的图形化界面工具,一定需要有QApplication对象。
然后又创建了一个Widget w,刚才在创建项目是不是填写了生成的类名嘛。于是Qt就给我们生成了Widget这样一个类,定义了这么一个对象,并且调用了show这样一个方法。
也就是说,创建一个控件对象,并显示出来。.show方法让控件显示出来,.hide方法让控件隐藏。Widget的父类是QWidget,这两个方法都是QWidget提供的
最后return a.exec ,那么a就是上面创建的对象,而这个exec方法就是让程序执行起来
之前Linux中也提到过六个函数(本质上是一个)叫exec,进程程序替换,把可执行文件中的代码和数据,替换到当前进程中(有点像夺舍)
Qt中的exec和Linux的没有任何关系,只是名字恰好是一样
widget
那么我们再来看一下Widget这个类,左边Headers文件夹中有头文件,Sources中有.cpp文件
先看一下.h里头放的是什么

header guard 保证头文件只包含一次,更推荐写作#pragma once
#ifndef WIDGET_H
#define WIDGET_H
然后就是包含一个头文件,在下面有一个命名空间,这个先不管,其实也就是声明了一个类
然后就能看到类的一个情况,首先是继承自QWidget——创建项目时选择的父类,QtSDK内置,要想使用这个类就要包含对应的头文件,当然上面包含了
class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;
};在Qt的设定中,内置的类,包含的头文件的名字就是和类名一致的。当然也不是用到的所有的Qt的类都需要显示包含头文件,C++头文件可能是间接包含的,后续写代码的原则,一个Qt的类如果拿来就可以直接用,说明对应的头文件已经被间接包含过的,那么就不需要额外的去显示包含。
如果这个类提示找不到定义啥的,手动显示的把对应的头文件包含一下就行了
然后就是Q_OBJECT,一个Qt内置的宏,宏本质上是一个文本替换。Q_OBJECT展开之后就会生成一大堆的代码。这个宏什么时候才需要用到呢?当我们需要使用Qt信号槽这样一个机制的时候。
Qt有一个非常核心的机制:"信号"和"槽",当某个类想要使用这个机制的时候,就要引入Q_OBJECT
再下面就是构造和析构,构造函数的参数需要讲一下
Qt中引入了"对象树"机制,创建的Qt的对象,就可以把这个对象给挂到树上,往树上挂的时候就需要指定"父节点"
最后Ui::Widget *ui;和我们的form file密切相关
然后再看一下widget.cpp中有什么东西。

首先包含了两个头文件
#include "widget.h"
#include "ui_widget.h"第一个是创建项目生成的头文件,第二个是form file被qmake生成的头文件
再下面就是构造函数具体的定义
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}就是给ui这个成员变量创建实例,然后调用ui中的函数setupUi(this),就是把form file生成的界面和当前的widget关联起来
然后就是析构函数delete ui;
ui文件
关键要点form file,展开左边的Forms文件夹中就有一个widget.ui文件

如果双击这个文件,那么再QT creator中就会自动切换到设计的标签页

当双击ui文件,此时Qt creator就会调用Qt designer ,打开ui文件。此时我们看的就是一个图形化的界面编辑器。
中间部分就是生成的程序窗口,左边则为一些Qt中内置的控件,可以直接拖拽控件到程序窗口中,就可以创建出具体的界面了。右边是编辑属性,每个控件都有很多属性,就影响到控件具体的行为了。
此时再点击左侧边栏的编辑按钮,就会显示.ui文件的本身代码,这个格式称为xml格式

这里的xml和html非常类似,都是使用成对的标签来表示数据。xml这里的标签,有哪些标签,都表示什么含义,这个是程序员自定义的。现在我们只需要知道ui文件本质上是一个xml即可。此处约定xml标签的含义就类似于Linux网络中自定义应用层协议
而html的标签是啥含义是有一个专门的标准委员会来约定的。
Qt中使用xml文件就是去描述程序的界面是啥样的。进一步的qmake会调用相关的工具,依据这个xml文件生成一些C++代码,从而把完整的界面构造出来
工程文件
在我们生成的项目文件中还有一个重要的东西叫Empty.pro

.pro Qt项目中的工程文件,也是qmake工具构建时候的重要依据
QT += core gui要引入的Qt模块
下一句先不管,在下一个是一个编译选项c++11
CONFIG += c++11接下来比较关键的是这里
SOURCES += \main.cpp \widget.cppHEADERS += \widget.hFORMS += \widget.ui描述了当前项目中,参与构建的文件都有什么(编译器想要编译哪些文件),这个不需要我们手动修改,Qt creator会帮我们自动维护好。
再下面的就不去关注。
.pro就类似于Linux中的Makefile文件。
中间文件
上面看到的.h .cpp .pro .ui都是源代码,如果编译运行QT项目,构建过程中还会生成一些中间文件。右键.pro,选择在explorer中显示。

打开文件管理器,看看项目对应的目录是什么样子的。

运行一次程序之后就会在项目目录 并列的地方,就会多出来一个bulid-xxxxx目录,这个目录里边就是该项目运行过程中生成的一些临时文件。

进入此文件

里边还有一个makefile,只不过这个makefile是qmake自动生成的。
在下面还有一个ui_widget.h文件,这个文件是widget.ui 和xml生成的.h文件

那么里边都有啥呢?

定义了一个类,Qt自动生成的代码,这个代码会在setupUi方法中,生成出界面的具体细节
其实前边也有提到,就是这个,看起来不一样其实是一个东西。

exe就是我们之前运行的窗口

