Qt开发
内容摘要:文章主要是为初学者介绍 Qt 框架的一些基本特性,主要内容包括: Qt的特点 , Qt中的模块划分 , Qt的安装 , Qt项目文件介绍 , Qt中的窗口类 , Qt窗口的坐标体系 , Qt框架的内存回收机制。 文章中除了关于知识点的文字描述,还有相关的视频讲解 。
1、Qt概述
不论我们学习什么样的知识点首先第一步都需要搞明白它是什么,这样才能明确当前学习的方向是否正确,下面给大家介绍一下什么是 Qt。
1.1 什么是 Qt
不论我们学习什么样的知识点首先第一步都需要搞明白它是什么,这样才能明确当前学习的方向是否正确,下面给大家介绍一下什么是 Qt。
1、Qt是一个跨平台的 C++ 应用程序开发框架
-
具有短平快的优秀特质:投资少、周期短、见效快、效益高
-
几乎支持所有的平台,可用于桌面程序开发以及嵌入式开发
-
有属于自己的事件处理机制
-
可以搞效率的开发基于窗口的应用程序。
2、Qt 是标准 C++ 的扩展,C++ 的语法在 Qt 中都是支持的
- 良好封装机制使得 Qt 的模块化程度非常高,可重用性较好,可以快速上手。
- Qt 提供了一种称为 signals/slots 的安全类型来替代 callback(回调函数),这使得各个元件 之间的协同工作变得十分简单。
1.2 Qt的特点
知道了 Qt 是什么之后,给大家介绍一下 Qt 这个框架的一些优点,就是因为具有了这些优秀的特质才使得现在很多企业都首选 Qt 进行基于窗口的应用程序开发,并且近年来市场对 Qt 程序猿的需求也在不断攀升。
- 广泛用于开发 GUI 程序,也可用于开发非 GUI 程序。
- GUI = Graphical User Interface(GUI = 图形用户界面)
- 也就是基于窗口的应用程序开发。
- 有丰富的 API
- Qt 包括多达 250 个以上的 C++ 类
- 可以处理正则表达式。
- 支持 2D/3D 图形渲染,支持 OpenGL
- Qt 给程序猿提供了非常详细的官方文档
- 支持 XML,Json
- 框架底层模块化, 使用者可以根据需求选择相应的模块来使用
- 可以轻松跨平台
- 和 Java 的跨平台方式不同
- 在不同的平台使用的是相同的上层接口,但是在底层封装了不同平台对应的 API(暗度陈仓)。
框架底层模块化,使用者可以根据需求选择合适的模块来使用
1.2.1 附加说明
- Qt Core、 Qt GUI 、 Qt Widgets自动加载到项目中
- Qt SQL 用于数据库操作的类
- Qt Test 用于应用程序和库进行单元测试的类
1.3 Qt 中的模块
Qt 类库里大量的类根据功能分为各种模块,这些模块又分为以下几大类:
- Qt 基本模块(Qt Essentials):提供了 Qt 在所有平台上的基本功能。
- Qt 附加模块(Qt Add-Ons):实现一些特定功能的提供附加价值的模块。
- 增值模块(Value-AddModules):单独发布的提供额外价值的模块或工具。
- 技术预览模块(Technology Preview Modules):一些处于开发阶段,但是可以作为技术预览使用的模块。
- Qt 工具(Qt Tools):帮助应用程序开发的一些工具。
Qt基本模块重点模块(Qt Essentials)
- Qt Core
- Qt GUI
- Qt Widgets
Qt 官网或者帮助文档的 “All Modules” 页面可以查看所有这些模块的信息。以下是官方对 Qt 基本模块的描述。关于其他模块感兴趣的话可以自行查阅。
于其他模块感兴趣的话可以自行查阅。
1.4 Qt案例
Qt 发展至今已经是一个非常成熟的框架,基于这个框架许多公司开发出了很多优秀的软件,下边给大家介绍几款我们常见到的软件:
VirtualBox
:虚拟机软件。VLC多媒体播放器
:一个体积小巧、功能强大的开源媒体播放器。YY语音
:又名 “歪歪语音”,是一个可以进行在线多人语音聊天和语音会议的免费软件。咪咕音乐
:咪咕音乐是中国移动倾力打造的正版音乐播放器WPS Office
:金山公司(Kingsoft)
出品的办公软件,与微软Office
兼容性良好,个人版免费。Skype
:一个使用人数众多的基于 P2P的VOIP
聊天软件。
2、Qt安装
2.1 安装包下载
up讲得Qt版本是v5.14.2
在我们学习 Qt 之前必须要安装开发环境,本小节基于 Qt 自带的集成开发环境(IDE)为大家讲解一下响应的开发步骤。在这里我们基于 Window 平台 Qt 5.14.2 给大家讲解如何进行安装和相关配置。
Qt官方下载地址:https://download.qt.io/archive/qt/
关于这些编译套件跟大家做一个介绍,安装过程中根据自己的情况酌情选择即可。
- 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++ 工程组织提供了条件。
2.2 模块安装
- UWP windows通用平台开发
- Android 安卓开发
- Sources 动态库的源码 (开发要求必安装)
- Qt Charts 图表统计
2.3 环境变量设置
最终生成的exe文件,想要任意目录下都能加载成功,需要环境变量设置里面的动态库
2.4 Qt Creator
2.4.1 Qt Creator简介
Qt自带集成开发环境(IDE),名为Qt Creator。它可以在Linux、Mac OS X和Windows上运行,并提供智能代码完成、语法高亮、集成帮助系统、调试器和剖析器集成,还集成了所有主要的版本控制系统git、Bazaar。除了Qt Creator外,Windows上的开发人员还可以使用Qt的Visual Studio插件。也可以使用其他的IDE(如KDE上的KDevelop)。但当然绝不是必须使用任何IDE。
-
Qt Creator 是编写Qt程序默认的一款IDE,当然也可以安装插件在VS开发
-
使用Qt Creator 创建的项目中不能含有中文
-
Qt Creator 默认使用Utf8格式编码对文件字符进行编码
-
字符必须编码后才能被计算机处理
-
为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5
-
GB2312支持的汉字太少,1995年的汉字扩展规范GBK1.0,支持了更多的汉字
-
2000年的GB18030取代了GBK1.0成为了正式的国家标准
-
Unicode也是一种字符编码方法,不过它是由国际组织设计,可以容纳全世界所有语言文字的编码方法
-
utf8(常用)
-
utf16
-
-
-
附加说明:Qt Creator 设置默认编码格式为 UTF-8
为了保证 QT的文件能在Windows 和Linux下都能正常打开,以及避免由于Windows下和Linux下编码不同而产生的中文字符乱码的问题,需统一代码中的字符编码。为了达到这个目的,需设置 QtCreator的默认编码为UTF-8.
在工具->选项 ->文本编辑器-> 行为 把默认编码改为 UTF-8 如果要把visual studio工程中的文件加在Qt中,要改文件语系。
2.4.2 基本功能介绍
1.设计UI界面
2.帮助文档 帮助---->索引------>Look for
通过 QtCreator 可以直接查阅 Qt 的帮助文档,里边对 Qt 框架提供的 API 做了非常详尽的介绍。
Release 生成的exe,进行过优化,生成代码量较小,调试时不会在断点处暂停
3、创建第一个Qt项目
3.1 创建一个Qt项目
1、创建基于窗口的 Qt 应用程序
2、指定项目的存储路径
项目名称根据需求自己指定即可
在指定项目的存储路径的时候, 路径中不能包含中文, 不能包含中文, 不能包含中文
3、指定默认的窗口类的名字以及窗口的类型
可以选择是否需要UI文件
4、选择编译套件,编译套件用于项目文件的编译,如果安装了多个编译套件,在这里选择其中一个就可以了。
5、选择版本控制工具,比如: git, svn 等,可以不指定。
4、讲解项目文件
4.1 讲解.pro文件
在项目文件中, 注释需要使用 #号(#)
项目编译的时候需要加载哪些底层模块
如果当前Qt版本大于4, 会添加一个额外的模块: widgets,在QT4版本中widgets属于gui
Qt 5中对gui模块进行了拆分, 将widgets独立出来了
在创建的 Qt 项目中自动生成了一个后缀为 .pro 的项目文件,该文件中记录着项目的一些属性信息,具体信息如下:
#-------------------------------------------------
#
# Project created by QtCreator 2022-08-26T10:39:06
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = hellQt_20220826
TEMPLATE = app
# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as 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 you use 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
CONFIG += c++11
# 项目中的源文件
SOURCES += \
main.cpp \
helloqt.cpp
# 项目中的头文件
HEADERS += \
helloqt.h
# 项目中的窗口界面文件
FORMS += \
helloqt.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
一般不需要修改.pro文件
QT += core gui
(QT_MAJOR_VERSION, 4): QT += widgets//高于QT4版本 则需要额外添加widgets模块。 该宏是为了兼容性
CONFIG += c++11 //兼容c++11 新特性
使用过时的函数编译器会发出警告
DEFINES += QT_DEPRECATED_WARNINGS
# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as 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.
# 下面的定义会让你的编译器在你使用时发出警告
# Qt 的任何被标记为弃用的特性(确切的警告
# 取决于你的编译器)。 请查阅相关文档
# 不推荐使用的 API,以便了解如何将您的代码从其中移植
**建立工程时自动添加 .cpp .h .ui ** (源文件,头文件,UI文件)
SOURCES += \
main.cpp \
helloqt.cpp
HEADERS += \
helloqt.h
FORMS += \
helloqt.ui
需要添加第三方的库,后面再讲解
.pro 文件使用#号添加注释
4.2 讲解程序的入口函数main.cpp文件
在这个源文件中有程序的入口函数 main(),下面给大家介绍下这个文件中自动生成的几行代码
#include "helloqt.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
helloQt w;
w.show();
return a.exec();
}
要使用一个类,需要包含该类的头文件,类名就是头文件的名字
#include <QApplication>
QApplication 应用程序类,非常关键,负责整个窗口的事件处理机制,在任务队列
4.3 讲解.ui文件
在 Qt 中每一个窗口都对应一个可编辑的可视化界面(*.ui), 这个界面对应的是一个 xml 格式的文件,一般情况下不需要在 xml 格式下对这个文件进行编辑,关于这个文件结构了解即可。
XML全称是Extensible Markup Language,可扩展的标记语言,它是SGML(标准通用标记语言)的一个子集,与hxml文件不同的是,XML的作用只是数据保存和数据交换。
<!-- 双击这个文件看到的是一个窗口界面, 如果使用文本编辑器打开看到的是一个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"/>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
4.4 讲解窗口界面对应的类的文件
4.4.1 mainwindow.h
mainwindow.h,这个文件是窗口界面对应的类的头文件。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow> // Qt标准窗口类头文件
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
4.4.2 mainwindow.cpp
这个文件是窗口界面对应的类的源文件。
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow) // 基于mainwindow.ui创建一个实例对象
{
// 将 mainwindow.ui 的实例对象和 当前类的对象进行关联
// 这样同名的连个类对象就产生了关联, 合二为一了
ui->setupUi(this);
}
MainWindow::~MainWindow()//析构函数,释放内存
{
delete ui;
}
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow) // 基于mainwindow.ui创建一个实例对象
{
// 将 mainwindow.ui 的实例对象和 当前类的对象进行关联
// 这样同名的连个类对象就产生了关联, 合二为一了
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
Qt项目中的三个文件
- mainwindow.h
- mainwindow.cpp
- mainwindow.ui
两个同名类的对象组合,捆绑在一起
5、Qt 中的窗口类
我们在通过 Qt 向导窗口基于窗口的应用程序的项目过程中倒数第二步让我们选择跟随项目创建的第一个窗口的基类,下拉菜单中有三个选项,分别为: QMainWindow、QDialog、QWidget 如下图:
Bass class 基类 : QMainWindow、QDialog、QWidget
5.1 基础窗口类
-
常用的窗口类有 3 个
- 在创建 Qt 窗口的时候,需要让自己的窗口类继承上述三个窗口类的其中一个
-
QWidget
- 所有窗口类的基类,所有窗口类都具有QWidget的属性
- Qt 中的控件 (按钮,输入框,单选框…) 也属于窗口,基类都是 QWidget
- 可以内嵌到其他窗口中:没有边框
- 可以不内嵌单独显示:独立的窗口,有边框
-
QDialog
- 对话框类,后边的章节会具体介绍这个窗口
- 不能内嵌到其他窗口中
-
QMainWindow
- 有工具栏,状态栏,菜单栏,后边的章节会具体介绍这个窗口
- 不能内嵌到其他窗口中
5.2 窗口的显示
-
内嵌窗口
- 依附于某一个大的窗口,作为了大窗口的一部分
- 大窗口就是这个内嵌窗口的父窗口
- 父窗口显示的时候, 内嵌的窗口也就被显示出来了
-
不内嵌窗口
- 这类窗口有边框,有标题栏
- 需要调用函数才可以显示
// QWidget是所有窗口类的基类, 调用这个提供的 show() 方法就可以显示将任何窗口显示出来 // 非模态显示 void QWidget::show(); // 显示当前窗口和它的子窗口 // 对话框窗口的非模态显示: 还是调用show() 方法 // 对话框窗口的模态显示 [virtual slot] int QDialog::exec();