一、Qt
1.1 Qt介绍
Qt是一个跨平台的C++图形用户界面应用程序框架。为应用程序开发者提供建立艺术级图形界面所需的所有功能。Qt是完全面向对象的,很容易扩展,且允许真正的组件编程。
支持Windows、Linux、MacOS、嵌入式平台等全平台开发。
Qt的优点
- 跨平台,几乎支持所有平台
- 接口简单,容易上手
- 简化了内存回收机制
- 开发效率高,可快速构建应用程序
- 社区氛围好
- 可进行嵌入式开发
Qt的案例
- Linux桌面环境KDE
- WPS Office
- Skype
- Google Earth
- VirtualBox 以上都是使用Qt进行开发的。
1.2 Qt的安装
(1)Qt主程序与Qt Creator
到QT官网下载windows安装包:[Index of /archive/qt/5.12/5.12.12](Index of /archive/qt/5.12/5.12.12)
从上面网站中找到qt-opensource-windows-x86-5.12.12.exe下载并安装,安装过程中选择下面这些组件:

(2)Visual Studio中配置Qt扩展
在扩展菜单栏中点击管理扩展,点击联机扩展,搜索QT,下载Qt Visual Studio Tools插件,下载成功后重启VS2022并安装插件(关闭时会自动弹出安装插件界面,点击Modify即可)。
打开【扩展 -> Qt VS Tools -> Qt Versions】。
添加环境,路径就是刚刚安装QT5的路径中的msvc2017.
配置完成点击确定,关闭VS2022。
打开VS2022,创建新项目,选择Qt Widgets Application项目,选择debug调试版,有调试信息的,ok结束。
二、第一个Qt程序
2.1 界面介绍

- 欢迎界面
- 工程:创建、打开工程
- 示例:提供了各行各业一些现成的qt工程,可以直接打开学习其代码
- 教程:Qt官方提供的教程,感觉不如b站大学
- 编辑
- 进行应用程序代码编写,C++
- 设计
- 进行界面UI设计
- Debug
- 如名
- 项目
- 进行一些项目配置
- 帮助
- 非常重要,很多想要实现的功能都可以通过查阅帮助文档实现
2.2 第一个项目
注意,项目名称和路径中都不要出现中文和空格。
(1)创建项目
基类:
- QWidget:是下面两种基类的父类,创建后什么都没有
- QMainWindow:多了菜单栏和工具,以及底部状态栏
- QDialog:多了对话框
类名:
- 创建自己的类

创建完成后如图,注意这里没有勾选ui文件,因此工程目录如左面所示。
(2)main文件
#include "learning01.h" //新建qt工程后的类.h文件
#include <QApplication> //包含一个应用程序类的头文件
// main程序入口,argc命令行变量的数量,argv命令行变量的数组
int main(int argc, char *argv[])
{
//a是应用程序对象,在Qt中有且只有一个
QApplication a(argc, argv);
//通过自定义的类,实例化一个对象(窗口对象)
//其父类在创建项目时选择
learning01 w;
//窗口对象默认不会显示,必须调用show方法显示窗口
w.show();
//让应用程序对象进入消息循环机制
return a.exec();
}
消息循环机制:
在正常C++中,运行后窗口都会一闪而过,一般只有添加system(“pause”)才能看到输出窗口。而在qt中,应用程序会阻塞到return行,等待用户的鼠标键盘操作,或点击窗口右上角x才可以退出程序。
(3).pro文件
注意:除非知道你在做什么,否则不要动.pro文件,里面的内容会根据项目自动更新。
# Qt包含的模块
QT += core gui
# 大于4版本以上,包含 wigdet 模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
# 目标,生成的.exe程序的名称
TARGET = learning01
# 模板,应用程序模板
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS
# 源文件,自动追加
SOURCES += \
main.cpp \
learning01.cpp
# 头文件,自动追加
HEADERS += \
learning01.h
(4)头文件
#ifndef LEARNING01_H
#define LEARNING01_H
//包含头文件QWidget窗口类
#include <QWidget>
class learning01 : public QWidget
{
Q_OBJECT //Q_OBJECT宏,允许类中 使用信号和槽的机制
public:
learning01(QWidget *parent = 0); //构造函数
~learning01(); //析构函数
};
#endif // LEARNING01_H
(5)cpp文件
#include "learning01.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
learning01 w;
w.show();
return a.exec();
}
(6)快捷键
- 注释:ctrl + /
- 运行:ctrl + r
- 编译:ctrl + b
- 查找:ctrl + f
- 整行移动:ctrl + shift +↑/↓
- 字体缩放:ctrl + 滚轮
- 自动对齐:ctrl + i
- 同名之间的.h和.cpp切换:F4
三、按钮控件
(1)创建按钮
使用QPushButton创建按钮,需要指定父类(否则会新建窗口生成按钮),设置文本。
QPushButton * btn1 = new QPushButton();
btn1->setParent(this);
btn1->setText("第一个按钮");
QPushButton * btn2 = new QPushButton("第二个按钮", this);
(2)其他操作
见代码注释:
#include "learning01.h"
#include <QPushButton>
learning01::learning01(QWidget *parent)
: QWidget(parent)
{
//创建按钮,按照空间的大小创建窗口
QPushButton * btn1 = new QPushButton();
btn1->setParent(this);
btn1->setText("第一个按钮");
QPushButton * btn2 = new QPushButton("第二个按钮", this);
//移动btn2按钮
btn2->move(100, 100);
//重置窗口大小(可以拖拽边框)
resize(600, 400);
//设置固定的窗口大小(不可拖拽边框)
setFixedSize(600, 400);
//设置窗口标题
setWindowTitle("第一个窗口");
}
learning01::~learning01()
{
}
四、对象树
QObject是以对象树的形式组织的。
当创建一个QObject对象,并指定了父对象指针时,会自动将其添加到其父对象的children()列表。
当父对象析构时,children()列表的所有对象都会析构。

五、信号与槽
实现点击按钮关闭窗口
具体过程如下:
- 信号的发送者
- 发送具体信号
- 信号的接受者
- 对信号进行处理(槽函数)
以上四个就是信号传递connect的四个参数。
信号槽的优点:松散耦合,信号发送端和接收端本身是没有关联的,通过connect函数进行连接。
connect()函数参数
- 参数1:信号的发送者,按钮对象
- 参数2:发送的信号,clicked, pressed, released,toggled
- 参数3:信号的接受者,窗口,this
- 参数4:信号的处理,close
#include "learning01.h"
#include <QPushButton>
learning01::learning01(QWidget *parent)
: QWidget(parent)
{
/************* 创建按钮 ************/
//创建按钮,按照空间的大小创建窗口
QPushButton * btn1 = new QPushButton();
btn1->setParent(this);
btn1->setText("第一个按钮");
QPushButton * btn2 = new QPushButton("第二个按钮", this);
//移动btn2按钮
btn2->move(100, 100);
//重置窗口大小(可以拖拽边框)
resize(600, 400);
//设置固定的窗口大小(不可拖拽边框)
setFixedSize(600, 400);
//设置窗口标题
setWindowTitle("第一个窗口");
/************* 按钮关闭窗口 ************/
//参数1:信号的发送者; 参数2:发送的信号;
connect(btn1, &QPushButton::clicked, this, &QWidget::close);
}
learning01::~learning01()
{
}
评论