一、QT
1、什么是QT
是一个跨平台的C++应用程序开发框架
具有短平快的优秀特质: 投资少、周期短、见效快、效益高
几乎支持所有的平台, 可用于桌面程序开发以及嵌入式开发
有属于自己的事件处理机制
可以高效率的开发基于窗口的应用程序。
Qt是标准 C++ 的扩展, C++的语法在Qt中都是支持的
良好封装机制使得 Qt 的模块化程度非常高,可重用性较好,可以快速上手。
Qt 提供了一种称为 signals/slots 的安全类型来替代 callback(回调函数),这使得各个元件 之间的协同工作变得十分简单。
2、QT的特点
广泛用于开发GUI程序,也可用于开发非GUI程序。
GUI = Graphical User Interface ----> 也就是基于窗口的应用程序开发。
有丰富的 API
Qt 包括多达 250 个以上的 C++ 类
可以处理正则表达式。
支持 2D/3D 图形渲染,支持 OpenGL
Qt给程序猿提供了非常详细的官方文档
支持XML,Json
框架底层模块化, 使用者可以根据需求选择相应的模块来使用
可以轻松跨平台 ---> 和Java的跨平台方式不同
在不同的平台使用的是相同的上层接口,但是在底层封装了不同平台对应的API(暗度陈仓)。
3、QT的模块
Qt类库里大量的类根据功能分为各种模块,这些模块又分为以下几大类:
Qt 基本模块(Qt Essentials):提供了 Qt 在所有平台上的基本功能。
Qt 附加模块(Qt Add-Ons):实现一些特定功能的提供附加价值的模块。
增值模块(Value-AddModules):单独发布的提供额外价值的模块或工具。
技术预览模块(Technology Preview Modules):一些处于开发阶段,但是可以作为技术预览使用的模块。
Qt 工具(Qt Tools):帮助应用程序开发的一些工具。
Qt官网或者帮助文档的“All Modules”页面可以查看所有这些模块的信息。以下是官方对Qt基本模块的描述。关于其他模块感兴趣的话可以自行查阅。于其他模块感兴趣的话可以自行查阅。
模块 |
描述 |
Qt Core |
Qt 类库的核心,所有其他模块都依赖于此模块 |
Qt GUI |
设计 GUI 界面的基础类,包括 OpenGL |
Qt Multimedia |
音频、视频、摄像头和广播功能的类 |
Qt Multimedia Widgets |
实现多媒体功能的界面组件类 |
Qt Network |
使网络编程更简单和轻便的类 |
Qt QML |
用于 QML 和 JavaScript语言的类 |
Qt Quick |
用于构建具有定制用户界面的动态应用程序的声明框架 |
Qt Quick Controls |
创建桌面样式用户界面,基于 Qt Quick 的用户界面控件 |
Qt Quick Dialogs |
用于 Qt Quick 的系统对话框类型 |
Qt Quick Layouts |
用于 Qt Quick 2 界面元素的布局项 |
Qt SQL |
使用 SQL 用于数据库操作的类 |
Qt Test |
用于应用程序和库进行单元测试的类 |
Qt Widgets |
用于构建 GUI 界面的 C++ 图形组件类 |
4、QT案例
Qt发展至今已经是一个非常成熟的框架,基于这个框架许多公司开发出了很多优秀的软件,下边给大家介绍几款我们常见到的软件:
VirtualBox:虚拟机软件。
VLC多媒体播放器:一个体积小巧、功能强大的开源媒体播放器。
YY语音:又名“歪歪语音”,是一个可以进行在线多人语音聊天和语音会议的免费软件。
咪咕音乐:咪咕音乐是中国移动倾力打造的正版音乐播放器
WPS Office:金山公司(Kingsoft)出品的办公软件,与微软Office兼容性良好,个人版免费。
Skype:一个使用人数众多的基于P2P的VOIP聊天软件。
5、QtCreator
QtCreator是编写Qt程序默认使用的一款 IDE,使用VS写Qt程序也是可以的,在此不做介绍。
- 使用QtCreator创建的项目目录中不能包含中文
- QtCreator默认使用Utf8格式编码对文件字符进行编码
-
-
- 字符必须编码后才能被计算机处理
- 为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5。
- GB2312 支持的汉字太少,1995年的汉字扩展规范GBK1.0,支持了更多的汉字。
- 2000年的 GB18030取代了GBK1.0成为了正式的国家标准。
- Unicode 也是一种字符编码方法,不过它是由国际组织设计,可以容纳全世界所有语言文字的编码方案
-
-
-
-
- utf8
- utf16
-
-
-
-
- vs写Qt程序默认使用的本地编码 -> gbk
- 修改QtCreator的编码, 菜单栏 -> 工具
-
关于这些编译套件跟大家做一个介绍,安装过程中根据自己的情况酌情选择即可。
MSVC2015 64-bit: Visual Studio 2015 使用的64位编译套件
MSVC2017 32-bit: Visual Studio 2017 使用的32位编译套件
MSVC2017 64-bit: Visual Studio 2017 使用的64位编译套件
MinGW7.3.0 32-bit: QtCreator 使用的32位编译套件
MinGW7.3.0 64-bit: QtCreator 使用的64位编译套件
UWP –> Universal Windows Platform: 用于window平台应用程序开发的编译套件
UWP 即Windows通用应用平台,在Windows 10 Mobile/Surface(Windows平板电脑)/ PC/Xbox/HoloLens等平台上运行,uwp不同于传统pc上的exe应用,也跟只适用于手机端的app有本质区别。它并不是为某一个终端而设计,而是可以在所有Windows10设备上运行。
在这个窗口中除了选择必要的编译套件,还有一些非必要组件,常用的有以下两个:
Source: Qt源码, 另外Qt的一些模块运行需要的驱动没有提供现成的动态库需要自己编译, 建议安装
Qt Charts: 用于绘制统计数据对应的图表, 比如: 折线图/曲线图等
默认的编译套件
MinGW -> Minimalist GNU for Windows
- MinGW 提供了一套简单方便的Windows下的基于GCC 程序开发环境。MinGW 收集了一系列免费的Windows 使用的头文件和库文件;
- 整合了GNU的工具集,特别是GNU 程序开发工具,如经典gcc, g++, make等。
- MinGW是完全免费的自由软件,它在Windows平台上模拟了Linux下GCC的开发环境,为C++ 的跨平台开发提供了良好基础支持,为了在Windows下工作的程序员熟悉Linux下的C++工程组织提供了条件。
二、创建第一个QT工程
1、创建项目
创建基于窗口的QT应用程序
指定项目的存储路径
注意: 项目名称根据需求自己指定即可
在指定项目的存储路径的时候, 路径中不能包含中文, 不能包含中文, 不能包含中文
指定默认的窗口类的名字以及窗口的类型
2、工程详解
(1).pro文件
QT += core gui
# 用的模块QT基本模块 core 和 GUI模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
# CONFIG += c++11 ----> 告诉qmake 应用程序 相关的配置信息
# ----- 我的工程使用 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 \
mainwindow.cpp
HEADERS += \
mainwindow.h
FORMS += \
mainwindow.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
(2) mainwindow.h
声明!!!
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
// mainwindow.ui 文件中也有一个类叫 MainWindow, 将这个类放到命名空间 Ui 中
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT // 这个宏是为了能够使用Qt中的信号槽机制
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui; // 定义指针指向窗口的 UI 对象
};
#endif // MAINWINDOW_H
(3)mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
//会自动调用该类的 构造函数
//这个就是窗口的构造函数 ---> 实现整个UI
// 将 mainwindow.ui 的实例对象和 当前类的对象进行关联
// 这样同名的连个类对象就产生了关联, 合二为一了
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
(4)main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
(5)mainwindow.ui
<!-- 双击这个文件看到的是一个窗口界面, 如果使用文本编辑器打开看到的是一个XML格式的文件 -->
<!-- 看不懂这种格式没关系, 我们不需要在这种模式下操作这个文件。 -->
<!-- 这里只是给大家介绍这个文件的本质 -->
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget"/>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
三、QT中的窗口类
我们在通过Qt向导窗口基于窗口的应用程序的项目过程中倒数第二步让我们选择跟随项目创建的第一个窗口的基类, 下拉菜单中有三个选项,
分别为: QMainWindow、QDialog、QWidget如下图:
1、基础窗口类
常用的窗口类有3个
在创建Qt窗口的时候, 需要让自己的窗口类继承上述三个窗口类的其中一个
- QWidget
-
- 所有窗口类的基类
- Qt中的控件(按钮, 输入框, 单选框…)也属于窗口, 基类都是QWidget
- 可以内嵌到其他窗口中: 没有边框
- 可以不内嵌单独显示: 独立的窗口, 有边框
- QDialog
-
- 对话框类, 后边的章节会具体介绍这个窗口
- 不能内嵌到其他窗口中
- QMainWindow
-
- 有工具栏, 状态栏, 菜单栏, 后边的章节会具体介绍这个窗口
- 不能内嵌到其他窗口中
2、窗口的显示
- 内嵌窗口
-
- 依附于某一个大的窗口, 作为了大窗口的一部分
- 大窗口就是这个内嵌窗口的父窗口
- 父窗口显示的时候, 内嵌的窗口也就被显示出来了
- 不内嵌窗口
-
- 这类窗口有边框, 有标题栏
- 需要调用函数才可以显示
// QWidget是所有窗口类的基类, 调用这个提供的 show() 方法就可以显示将任何窗口显示出来
// 非模态显示
void QWidget::show(); // 显示当前窗口和它的子窗口
// 对话框窗口的非模态显示: 还是调用show() 方法
// 对话框窗口的模态显示
[virtual slot] int QDialog::exec();
四、坐标体系
1、窗口的坐标原点
所有坐标的确定都需要先找到坐标原点, Qt的坐标原点在窗口的左上角
x轴向右递增 y轴向下递增
2、窗口的相对坐标
在一个Qt窗口中一般都有很多子窗口内嵌到这个父窗口中,其中每个窗口都有自己的坐标原点,子窗口的位置也就是其使用的坐标点就是它的父窗口坐标体系中的坐标点。
- 在