C++(week16): C++提高:(六) Qt基础

零、课前须知

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)类型转换:整型转字符串、字符串转整数、进制转换:fromto


格式化字符串,占位符
在这里插入图片描述
在这里插入图片描述


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

在这里插入图片描述
在这里插入图片描述

  • 20
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员爱德华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值