高精尖带你迅速了解 QT 基本框架
一:QT是什么
1.1 了解 QT 是什么
Qt 是⼀个 跨平台的 C++ 图形⽤⼾界⾯应⽤程序框架 。它为应⽤程序开发者提供了建⽴艺术级图形界⾯所需的所有功能。它是完全⾯向对象的,很容易扩展。Qt 为开发者提供了⼀种基于组件的开发模式,开发者可以通过简单的拖拽和组合来实现复杂的应⽤程序,同时也可以使⽤ C++ 语⾔进⾏⾼级开发。
图形⽤⼾界⾯ :指采⽤图形⽅式显⽰的计算机操作⽤⼾界⾯,是计算机与其使⽤者之间的对话接⼝,是计算机系统的重要组成部分
1.2 QT 的开发环境
QT 的开发环境需要安装 3 个部分:
- C++编译器
- Qt SDK(软件开发工具包)
- QT 的集成开发环境(IDE)
Qt ⽀持多种开发⼯具,其中⽐较常⽤的开发⼯具有:Qt Creator、Visual Studio、Eclipse
因为当前我们使用的是 Qt Creator,其他就不做过多赘述。
- Qt Creator 是⼀个轻量级的跨平台集成开发环境(IDE),专为使⽤ Qt 框架进⾏应⽤程序开发⽽设 计。 它是⼀个功能强⼤、易于使⽤、快速且⾼效的⼯具,被⼴泛⽤于编写各种类型的应⽤程序,如桌⾯应 ⽤程序、移动应⽤程序和嵌⼊式系统等。
- Qt Creator 提供了⼀个可视化的界⾯设计器和代码编辑器,可以帮助开发者更快捷地创建复杂的⽤⼾ 界⾯和处理各种事件。
- 它还包含了调试⼯具、版本控制⼯具、⾃动完成和智能提⽰等功能,以及⽀持多语⾔和跨平台的开发 环境。
Qt Creator 的主要特点包括:
- 紧密集成的 Qt 框架:Qt Creator 专⻔为 Qt 开发⽽设计,因此它与 Qt 框架集成得⾮常紧密,使开发者可以更容易地管理和部署他们的应⽤程序。
- 强⼤的编辑器:Qt Creator 具有⼀些先进的编辑器功能,如语法⾼亮、代码折叠、智能提⽰、⾃动完成和代码重构。
- 集成的调试器:Qt Creator 内置了调试器,允许开发⼈员在代码中设置断点以及检查变量、堆栈和调⽤树等信息。
- ⾼效的构建系统:Qt Creator 提供了⼀个⾼效的构建系统,可以⾃动构建和部署应⽤程序,同时⽀持使⽤不同的编译器和平台。
- 可视化界⾯设计器:Qt Creator 具有⼀个可视化界⾯设计器,它允许开发⼈员在没有编写代码的情况下创建复杂的⽤⼾界⾯。
- 多语⾔⽀持:Qt Creator ⽀持多种编程语⾔,包括 C++、QML、JavaScript 等。
总:因为 Qt Creator 可以集成 C++ 编译器和Qt SDK软件开发工具包,所以我们只需要安装 Qt Creator 即可。
二:安装 QT
链接: https://pan.baidu.com/s/1YUacmf4hI6zcsf6m0_Y1tA 提取码: 7f35

之后会让你申请一个账号,申请即可,如果不想申请需要在双击之前先断⽹。

之后一路 next ...

找一个路径来存放该 QT 包(注意:路径不能带有中文!!!!)

继续下一步 安装 C++编译器和软件工具包
之后 一路 next ....

安装完毕之后,最好将 Qt sdk 中的某个目录加入到 Path 环境变量之中
三:创建一个简单的 QT 示例
3.1 创建 QT 项目示例

Qt Widggets Application 应用程序,如果使用 Qt 写一个 GUI 程序,就应该选择这个,(传统的开发 GUI 的方式就叫做 Qt Widget)
填写 项目名称和项目代码的路径

然后一路next ... 直至遇到该界面
这里使用Qt Creator创建项目,会自动的生成一些代码出来。而生成的代码就包含一个类,此处就是要选择这个自动生成的类的父类是谁。
- QMainWindows完整的应用程序窗口(可以包含菜单栏工具栏状态栏…)
- QWidget表示一个控件(窗口上的一个具体的元素.输入框,按钮,下拉框,单选按钮复选按钮…)
- QDialog表示一个对话框
这里我们刚开始 选择 QWidget 即可
特别说明一下,
form file 有些重要。
Qt中创建图形化界面的程序,有两种方式:
1.直接通过 C++ 代码的方式创建界面。
2.通过 form file,以图形化的方式来生成界面。
此时,就可以使用 Qt Designer 或者 直接使用 Qt Creator 来编辑这个 ui 文件从而以图形化的方式快速方便的生成图形界面
之后一路 next ...
直接 运行,出现小框框

3.2 解析 QT 项目代码
解析 main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[]) // main的形参就是命令行参数
{
QApplication a(argc, argv); // 注意:只要编写一个 Qt 的图形化界面程序,一定要有一个 QApplication 对象
Widget w; // Widget 刚才在创建项目的时候,填写了生成的类名,这里代表的是创建了一个控件对象
w.show(); // show()方法是让控件显示出来,hide()方法是让控件隐藏
return a.exec(); // 让该 图形化界面程序跑起来
}
// 注意一个点:Widget 的父类是 QWidget, 而 show()方法和 hide()方法 都是QWidget 提供的
解析 widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; } // 在 Ui 命名空间内定义了一个 Widget 类
QT_END_NAMESPACE
class Widget : public QWidget // 我们在创建项目时,继承的父类【Qt SDK内置的,要想使用这个类,就需要包含相应的头文件:QWidget】
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
Q_OBJECT:是一个 Qt 内置的宏,因为宏的本质是文本替换。Q_OBJECT展开之后就会生成一大堆代码。因为 Qt 中有一个非常核心的机制——信号和槽。当某一个类想要使用“信号和槽”的话就必须引入 Q_OBJECT 这个宏。
Widget(QWidget *parent = nullptr); // Qt 引入对象树机制,通过创建的 Qt 对象,就可以将这个对象挂到对象树上,并且往树上挂的时候需要指定 "父节点"。至于为什么要挂到对象树上,此处不多做解释之后在进行讲解。
解析 widget.cpp
#include "widget.h" // 创建项目生成的头文件
#include "ui_widget.h" // form file 被 qmake 生成的头文件
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget) // 将 form file 生成的界面和当前的 widget 关联起来
{
ui->setupUi(this); // 将 form file 生成的界面和当前的 widget 关联起来
}
Widget::~Widget()
{
delete ui;
}
解析 widget.ui (重点!)
双击 ui 文件,Qt Creator就会调用Qt Designer,打开ui文件,图形化的界面编辑器
此时在点击 编辑

会有 这样一个 xml 格式的代码文件。因为 Qt中使用xml文件就是去描述程序的界面是什么样的,
进一步的 qmake 会调用相关的工具,依据这个xml文件生成一些C++代码,从而把完整的界面构造出来。
解析 Qt_project_001.pro 即 pro 文件(Qt项目中的工程文件)

.pro 类似于之前 Linux 中学的 Makefile 文件
这些信息描述了在当前项目中,参与构建的文件都有什么(编译器要编译到的文件),这些地方我们不需要手动修改,Qt Creator 已经帮我们自动维护好了。
另外,在编译运行完项目之后,构建过程中还会生成一些中间文件,例如 build-xxxx

进入该文件 ,发现 ui_widget.h 头文件(widget.ui 即xml生成的 .h 文件)

查看该 头文件(Qt 自动生成的 代码)
进入 Debug :.exe 文件就是最终生成的可执行程序,如果直接运行,效果和之前在 Qt Creator 中运行时相同的效果

四:简单示例项目— hello world
4.1 通过文本方式创建 hello world
4.1.1 图形化方式文本创建 hello world
双击 widget.ui 文件 ->
-> 输入 hello world ->
与此同时,我们还需要观察右边框框的一些信息

4.1.2 纯代码方式文本创建 hello world

4.2 通过按钮方式创建 hello world
4.2.1 图形化方式按钮创建 hello world
双击 widget.ui 文件 ->
-> 在按钮上输入 hello world -> 直接运行
4.2.2 纯代码方式按钮创建 hello world

五:QT 坐标系情况是怎样的
坐标体系:以左上角为原点(0,0),X向右增加,Y向下增加。


界面的修改方式:move 函数
六:理解 信号和槽
当前我们已经了解了怎么 创建一个按钮了,(这边先使用 ui 界面方式创建一个按钮)
那么我们创建一个按钮,肯定是要让我们点击按钮之后要发生一些事情。这该怎么办呢?需要 connect 函数了
注意:这个 connect 和 Linux 中的 Connect 可不一样。
Linux 网络编程中的 connect ,这个函数是用来给 TCP socket 建立连接的,写TCP客户端的时候,就需要先建立链接,然后才能读写数据。
Qt 中的 connect 是QObject 这个类提供的静态函数,这个函数的作用就是 "连接信号" 和 "槽"【和 TCP 的建立连接操作没有任何关系】
// Qt 中 connect 用法
connect(ui->pushButton, &QPushButton::clicked, this, &Widget::slotsHeader);
// ui->pushButton : 谁发出的信号
// &QPushButton::clicked : 发出的是个什么信号,这里的是一个点击。即点击按钮的时候就会自动触发这个信号
// this : 谁处理这个信号,此处是 Qwidget
// &Widget::slotsHeader : 具体怎么处理这个信号
具体实例:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
connect(ui->pushButton, &QPushButton::clicked, this, &Widget::slotsHeader);
}
Widget::~Widget()
{
delete ui;
}
void Widget::slotsHeader()
{
this->setWindowTitle("你好");
if(ui->pushButton->text() == QString("hello world"))
{
ui->pushButton->setText("中华人民共和国万岁");
this->setWindowTitle("中华标题NO1");
}
else
{
ui->pushButton->setText("hello world");
this->setWindowTitle("hello world 标题");
}
}
测试结果:

所以,那具体什么是 信号和槽呢?
先看 Linux 中的信号 Signal:系统内部的通知机制,属于进程间通信的方式
而 Qt 中的信号 Signal :涉及三个要素,信号源(谁发的信号),信号的类型(由哪一个控件发出的信号),信号的处理方式(注册信号处理函数【槽 slot 函数】, 在信号被触发的时候自动调用执行)。
Qt 中可以使用 connect 这样的函数,将一个信号和一个槽 关联起来。后续 只要信号被触发,Qt 就会自动的执行槽函数。所谓的“槽函数”本质上也是一种 回调函数(callback)
Qt 中,一定是要先关联 信号和槽,然后再触发这个信号,顺序不能颠倒,否则信号就不知道如何处理了。
更多推荐





所有评论(0)