文章目录
- 零、课前须知
- 一、Qt基础
- 1.CLI与GUI
- 2.事件驱动模型
- 3.Qt快捷键
- 二、QtCreator
- 1.Qt的安装:Qt框架、IDE
- 2.Qt的六大模式
- 3.核心模块
- 4.布局
- 5.Qt项目中的文件
- 6.信号与槽机制
- 7.添加资源:资源文件qrc
- 8.main.cpp解析
- (1)ui文件 和 纯代码
- (2)按钮 + 信号槽机制
- (3)自定义槽函数
- ①设计师模式
- ②纯代码
- 三、Qt中的数据结构
- 1.基础
- (1)控制台打印
- (2)QDebug
- 2.Qt字符串:QChar和QString
- (1)编码的知识
- (2)QString
- ①底层原理
- ②函数接口
- (3)小项目:计算器
- (4)小项目:井字棋
- 3.Qt的顺序容器
- (1)QVector
- (2)QList
- (3)QStack
- (4)QQueue
- 4.Qt的关联式容器
- (1)QSet
- (2)QMap
- (3)QHash
- 5.迭代器 和 for_each
零、课前须知
1.学习方法:
(1)泥鳅:结果不是最重要。更重要的是思考问题、解决问题的过程。
(2)遇到问题、形成方案、实现方案。
(3)理解&记忆模型,根据模型形成代码。
2.复习思维导图
https://www.kdocs.cn/view/l/ciK8WuFRfrgv
3.最后三周课程安排
(1)16周Qt阶段:
(2)17周:workflow
(3)18周:搜索引擎
一、Qt基础
1.CLI与GUI
CLI:命令行界面
GUI:图形化用户界面
2.事件驱动模型
1.事件 event
2.事件循环 EventLoop
3.事件处理函数 event handler 【业务方】
业务方写的函数,框架调用,用轮子。回调函数。
3.Qt快捷键
1.注释:crtl+ /
2.代码对齐:crtl + i
二、QtCreator
1.Qt的安装:Qt框架、IDE
1.Qt框架:头文件、库文件
用的是5.14.2
2.IDE:Qt Creator用的是4.14
Qt组件安装:
2.Qt的六大模式
1.欢迎模式 (crtl + 1)
2.编辑模式 (crtl + 2)
3.设计师(designer)模式 (crtl + 3)
4.调试(Debug)模式 (crtl + 4)
5.项目模式 (crtl + 5):打开下载的Qt项目,需要在项目模式界面点configue
6.帮助模式 (crtl + 6)
3.核心模块
core、gui、widgets、network、sql
4.布局
①左边是组件列表。列表中列出了所有Qt自带的图形组件。
②中上是中心区域。中心区域是主要的设计区域,用于绘制和布局用户界面的各种控件和部件。在这个区域中,用户可以通过拖放控件、设置属性等方式来设计界面。
③右上是对象浏览器。对象浏览器用于显示当前界面中所有的控件和部件的层次结构。
④右下是对象属性编辑器。编辑器用于获取和修改当前选中控件的属性和属性值。
⑤中下是Action编辑器和信号槽编辑器。
5.Qt项目中的文件
Qt 项目 的目录结构:
1.pro文件:负责代码的构建,根据pro文件形成Makefile,再进行qmake
2.Headers目录,下面存放头文件 (.h)
3.Sources目录,下面存放源文件 (.cpp)
4.Forms目录,下面存放ui文件 (.ui):本质是一个xml文件,使用设计师模式进行编辑
5.可以自己添加资源,形成Resources目录,下面存放qrc文件 (.qrc)
1.pro文件
6.信号与槽机制
对象间通信:发送方 发射信号,接收方 执行槽。
1.信号&槽都是预设的:设计模式的信号槽编辑器
2.信号是预设的,槽不是预设:
(1)转到槽
(2)纯代码
①定义槽函数
②实现槽函数
③QObject::connect
7.添加资源:资源文件qrc
1.添加qrc文件。右键 addNew
再次添加资源:右键 Open in Editor
8.main.cpp解析
1.对于Q/t前缀的: F1
查看帮助手册
2.F2
查看源码
1.QApplication 继承自QGuiApplication,QGuiApplication继承自QCoreApplicatin,QCoreApplicatin提供了一个事件循环类。 QCoreApplicatin继承自QObject。
继承体系:QObject -> QCoreApplication -> QGuiApplication -> QApplication
2.MainWindow 继承自 QMainWindow
(1)ui文件 和 纯代码
ui文件搭框架,纯代码写细节
1.设计模式 (ui文件)
(1)用设计模式添加按钮(等组件)
(2)用设计模式添加信号与槽的连接
2.纯代码
(1)ui添加的按钮,转到槽,自定义槽函数的实现 (槽函数的声明、setUi、connect由框架生成)
(2)用纯代码添加按钮(等组件),自定义槽函数的声明的实现,自己写newButton、自己写connect函数
(2)按钮 + 信号槽机制
发送对象信号发射,接收对象执行槽函数。
(3)自定义槽函数
①设计师模式
ui文件,转到槽。会自动添加头文件和connect函数,只需要自己实现槽函数。
②纯代码
需要自己写 关联connect()
1.添加组件:添加头文件、对应组件的指针
2.声明槽函数 (伪关键字slots)、定义槽函数
3.使用QObject::connect()进行关联
三、Qt中的数据结构
1.基础
(1)控制台打印
1.控制台
3号窗口输出
(2)QDebug
#include <QDebug>
qDebug() << "hello"; //函数调用,自带换行
坐标:QPoint
#include <QPoint>
QPoint point(300, 500);
qDebug() << point; //自动换行
//一个点的绝对位置,是用一对整数描述的
QPoint Class
The QPoint class defines a point in the plane using integer precision. More...
Header:
#include <QPoint>
#include "mainwindow.h"
#include <QApplication>
#include <QDebug>
#include <QPoint>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
qDebug() << "helloworld";
QPoint point(300, 500);
qDebug() << point;
return a.exec();
}
2.Qt字符串:QChar和QString
(1)编码的知识
unicode,为了兼容所有的标准。GB国标(中)、big5(台)
Qt用的是utf-16
字符数组是utf-8
控制台默认输出是GB
(2)QString
①底层原理
0.QString与char字符数组、std::string的区别
(1)底层编码:
底层实现不同QString的底层是utf-16 (一个字符QChar占两个字节),而char字符数组、std::string没有规定编码格式,一般是utf-8
(2)隐式共享(写时复制)
(3)越界检查:
下标访问运算符不同std::string的[]不会越界检查,可能访问越界QString的[]会越界检查,越界访问下标会在控制台报错。
1.使用
#include <QString>
2.底层存储原理
QString底层使用了utf-16(两个字节)。而字符数组底层是utf-8(一个字节)。
C风格字符串,就是字符数组。const char *
3.QString的隐式共享(写时复制)
验证写时复制
所以QString拷贝的代价小,传参和复制。但是进行写操作的代价大,要新开辟那空间。
②函数接口
1.QString的构造
(1)QString的成员函数:
(2)静态成员函数
QString QString::fromStdString(const std::string &str)
std::string str1 = "helloworld";
QString str2 = QString::fromStdString(str1);
qDebug() << str2;
2.QString的特色接口:
(1)从所有占位符中找到最小的,进行替换:arg()
(2)类型转换:整型转字符串、字符串转整数、进制转换:from
、to
格式化字符串,占位符
arg会从最小的占位符开始,依次填充
一行输出
整数转字符串
改进制
字符串转整数:to系列
3.QString的插入
(1)尾部插入:apend
或 +=
QString &QString::append(const QString &str)
//尾部插入
QString str("Ed");
str.append("ward");
str += "2024";
qDebug() << str;
(2)头部插入:prepend
QString &QString::prepend(const QString &str)
//头部插入
QString str2("2024");
str2.prepend("Edward");
qDebug() << str2;
(3)中间插入:insert
QString &QString::insert(int position, const QString &str)
//中间插入
QString str3("Ed2024");
str3.insert(2, "ward");
qDebug() << str3;
4.QString的删除
(1)移除末尾的n个字符:chop
void QString::chop(int n) //Removes n characters from the end of the string.
(2)指定位置删除n个字符:remove
QString &QString::remove(int position, int n)
(3)全部删除:clear
void QString::clear() //Clears the contents of the string and makes it null.
isNull和isEmpty
空的判断不一样,所以一般用isEmpty
5.QSring的修改:[ ]
6.QString的查找:
(1)根据位置查找元素
①[]
②at
QString的[]会检查边界,越界会在控制台报错。而std::string的[]不会越界检查。
(2)根据元素查找位置
①从左往右找:indexOf
②从右往左找:lastIndexOf
7.提取子串
(1)取中间:mid()
(2)取左边:left()
(3)取右边:right()
8.切割:split
跳过空的
split的实际应用场景:对URL进行切割,将扁平的信息提取
(3)小项目:计算器
代码链接:https://github.com/WangEdward1027/Qt/tree/main/calculator
(4)小项目:井字棋
代码链接:https://github.com/WangEdward1027/Qt/tree/main/tictactoe
3.Qt的顺序容器
QList底层是std::deque
QLinkedList底层是std::list
(1)QVector
(2)QList
Qlist的底层是std::deque
1.构造函数
2.增
QList的<<相当于末尾插入,<<支持链式调用
3.删
removeone():将从左往右的第一个value删除
4.改
QList支持operator[]
,按下标改
5.查
(3)QStack
Qt中的栈和容器,是QVector和QList的子类,而不是容器适配器。
(4)QQueue
4.Qt的关联式容器
(1)QSet
QSet的底层是哈希表,std::unorderedset。
无序的,自动去重。不允许修改。
1.构造
无参构造
2.增
insert()
3.删
remove()
4.set允许修改,只能删了再插入
5.查
contains()
(2)QMap
QMap的底层是红黑树,std::map。
1.构造函数
2.增
insert()
3.删
①remove():按值删除
②erase():按迭代器删除
4.改
insert() 或 [ ]
5.查
contains()。存在返回true,不存在返回false。
(3)QHash
操作和QMap完全一致。
5.迭代器 和 for_each