这里写目录标题
1. QtCreator创建项目
首先我们要创建一个项目
- 点击左上角的文件
- 创建新文件
- 选择Application中的Qt Widgets Application方式进行创建
新建项目对话框里有五类项目模板模板:
项目模板 | 说明 |
---|---|
Application | Qt 应用程序,包括普通窗体程序和 Qt Quick 程序 |
Library | 可以创建动态库、静态库以及 Qt Quick 扩展插件、QtCreator 自身插件 |
其他项目 | 可以创建单元测试项目、Qt4 设计师自定义控件、子目录项目等 |
Non-Qt-Project | 非 Qt 项目。可以创建纯 C 或纯 C++ 项目 |
Import Project | 导入项目。从版本控制系统管理的软件项⽬导入旧的项目 |
常用的只有第⼀类 Application,选择它,在右侧会看到 Qt 应⽤程序的五个子模板:
- Qt Widgets Application:普通窗体模板,传统基于部件的窗体界面程序。
- Qt Console Application:Qt 控制台应用程序。因为 Qt 主要用于图形界面设计,这个控制台项目模板基本不用。
- Qt for Python:在Python下用 LGPL 的许可来开发闭源 Qt 软件。
- Qt Quick Application: Qt 提供的⼀种高级用户界面技术,使用它可以方便快速的为移动以及嵌入式设备开发流畅美观的用户界面。Qt Quick 模块是开发 QML 应用的标准库,提供了使用 QML 创建用户界⾯所需的⼀切,包括可视化、交互、动画、模型、视图、粒子效果以及着色效果等。
- 选择存放路径
这里需要注意的是我们选择路径的时候一定不要带中文路径,不然在运行程序的时候会出现报错。
- 选择构建工具
这个是构建系统,通过Qt写的程序,涉及到一些“元编程”技术,是通过代码来生成代码。也就是说Qt框架会在编译的时候,会自动调用一些列的生成工具,基于写的代码,生成一系列的其他C++代码,最终编译的代码,也是最后生成的代码。所以这里我们使用的是qmake构建工具。
Qt 中的构建⼯具有三种可供选择,分别是:qmake、CMake、Qbs,下面依次介绍。
- qmake: qmake 是⼀个构建⼯具(build tool),用于自动生成 makefile 文件。qmake 支持跨平台构建。qmake 编辑的是⼀个后缀名为 .pro 的文件。
- CMake:CMake 是⼀个跨平台的构建⼯具。CMake 本⾝不是⼀个编译器,其实就是生成⼀个让编译器能读懂编译流程的文件工具。让 CMake 自动生成构建系统,例如 Makefile 和 Visual Studio 项目文件。CMake 是⼀个第第三方工具,有自己的文案。
- Qbs:Qbs(Qt Build Suite:Qt构建套件)同 qmake、CMake ⼀样都是构建⼯具。Qbs 号称是新⼀代的构建工具,比qmake 编译速度更快。Qbs 没有绑定 Qt 版本,它从项目文件的高级项目描述中生成⼀个正确的依赖表。而传统的MakeFile 生成工具如 qmake 和 CMake ,其在⽣成 MakeFile 文件后将实际的名利交给 Make 工具去执行。
- 选择父类
我们使用Qt Creator 创建项目,会自动的生成一些代码出来,生成出来的代码就包含一个类。此处就是用来选择自动生成的类的父类是谁。
- QMainWindows:完整的应用程序窗口(可以包含菜单栏,工具栏,状态栏……)
- QWidget:表示一个控件。(可以是输入框,下拉框,按钮,单选框,复位按钮……)
- QDialog:表示一个对话框
这里我们选择第二个QWidget
就可以了。
还有一点就是form file
的勾选
在Qt
创建图形化界面程序,有两种方式,一种是通过代码的方式进行编写,第二种就是通过图形化界面的方式来生成界面,此时通过图形化界面的方式就需要使用到这个form file
文件。勾选了这个form file
我们就可以使用Qt Designer
或者直接使用Qt creator
来边界 ui
文件,从而通过图形化界面的方式生图形化界面。
上面三者的之间的关系是:
- 选择对应翻译文件
这里我们暂时不关注,直接选择none即可。
- 选择基于那个编译器的Qt SDK来构建后序代码
因为当时我们只是选择以其中的一个下载,如果勾选了其他的选项的话,这里就需要进行选择
- 项目管理器
如果我们想要把我们的代码提交的git,githu,gitee上的话,就可以选择。
此时我们就创建好了一个项目。
2. 项目代码解析
我们创建好一个项目后,Qt会自动给我们生成一些代码。
2.1 main.cpp
int main(int argc, char *argv[]) // 命令行参数
{
QApplication a(argc, argv); // 编写一个Qt的图形化界面程序,一定需要QApplication对象
Widget w; // 这个就是我们刚开始选择的父类名称,而这个Widget的父类就是QWidget
w.show(); // 这个就是用来显示窗口用到,我们刚创建出来的项目是可以直接进行执行的,只会出现一个窗口,而这个窗口就是这个函数显示出来的。
return a.exec(); // exec就是执行让代码跑起来
}
2.2 widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget> // 包含对应的头文件
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget // 从这里我们就可以看到Widget是继承了QWidget,而QWidget是Qt内置的类,Qt的设定就是Qt内置的类和包含头文件的名字是一样的,这样也是方便记忆。
{
Q_OBJECT // 这是一个Qt内置的宏,展开后就是一大堆的代码,而这个也是后期非常核心的机制,就是“信号”和“槽”,如果某个想使用“信号和槽”的话就需要引入这个宏
// 可以通过crtl+鼠标左键进入文档查看细节。
public:
Widget(QWidget *parent = nullptr); // Qt种引入了“对象树”机制(后期会讲解到),创建Qt对象,就可以将对象挂到对象树上,往对象树上挂的时候就需要指定“父节点”,此处的树就是一个N叉树
~Widget();
private:
Ui::Widget *ui; // 这个就是和form file密切相关的。
};
#endif // WIDGET_H
2.3 widget.cpp
#include "widget.h" // 创建生成时的文件
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this); // 将form file生成的界面和我们当前的widget进行关联起来
}
Widget::~Widget()
{
delete ui;
}
- widget.ui
如果我们直接进行双击点击的话,我们将会得到一个图形化界面。这个时候Qt Creator就会调用Qt Designer界面设计界面
以下这种格式叫做XML,和HTML一样都是使用标签来表示数据。xml文件就是用来描述程序界面的模样,进一步的qmake会调用相关工具,依据这个xml进一步生成C++代码,从而把完整的的界面代码构造出来。
2.4 .pro工程文件
.pro是Qt项目的工程文件,也是qmake工具构建时候的重要依据。.pro其实和linux种学过的Makefile文件很像,qmake和.pro搭配的作用就和Makefile是类似的。
QT += core gui // 要引入的Qt模板,按需要进添加
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11 // 使用的语言标准
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
// 这个就是描述了当前构建的文件都有啥,编译器需要编译那些,这些不需要进行手动添加。
SOURCES += \
main.cpp \
widget.cpp
HEADERS += \
widget.h
FORMS += \
widget.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
3. 中间文件
以上的.h .cpp .ui .pro都是一些源文件,但是如果编译运行Qt项目后,构建构成中还会生成一些中间文件。
这里Qt还会创建一个目录,这个目录下生成的是一些临时文件。
而这里的ui_widget.h就是我们编译运行成功后Qt给我我们生成的代码。而这个代码就会在widget.cpp种的setupUi中生成界面的具体细节。