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

news2024/9/21 18:52:33

文章目录

  • 零、课前须知
  • 一、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)类型转换:整型转字符串、字符串转整数、进制转换: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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1994418.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在嵌入式Linux平台上使用Nginx搭建RTMP流媒体服务器

概述 Nginx是一个以高效稳定著称的高性能的HTTP和反向代理web服务器&#xff0c;它同时也是基于事件驱动开发的异步高性能跨平台服务器。Nginx-RTMP是基于Nginx框架的模块开发&#xff0c;很好地继承了Nginx的异步高性能以及扩展性好的优点。 RTMP 是 Real Time Messaging Pr…

docker 部署 ElasticSearch;Kibana

ELasticSearch 创建网络 docker network create es-netES配合Kibana使用时需要组网&#xff0c;使两者运行在同一个网络下 命令 docker run -d \ --name es \ -e "discovery.typesingle-node" \ -v /usr/local/es/data:/usr/share/elasticsearch/data \ -v /usr/…

C语言——编译与链接

目录 引言 翻译环境与运行环境 翻译环境 1.翻译环境的简述 2.编译过程 2.1 预处理&#xff08;预编译&#xff09; 2.2 编译 2.2.1 词法分析 2.2.2 语法分析 2.2.3 语义分析 2.3 汇编 3.链接 运行环境 结束语 引言 C语言编译与链接过程是理解程序如何从代码转化…

8月5日学习笔记 glibc安装与安全用户角色权限

一&#xff0c;glibc安装 https://www.mysql.com/ 官⽹ https://downloads.mysql.com/archives/community/ https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.33-li nux-glibc2.12-x86_64.tar 安装步骤 1.安装依赖库 [rootlocalhost ~]# yum list installed |g…

在vscode中使用ssh运行docker:从下载到运行全流程

首先在本机或者服务器上下载docker并运行 本文目的旨在本机下载docker并打包&#xff0c;然后在服务器上进行加载 docker -v Docker version 27.0.3, build 7d4bcd8有输出说明在运行 一、下载 在docker hub上下载docker以tensorflow为例 点击tag搜索自己想要的版本 copy命…

All-Reduce通信原语;Reduce+LayerNorm+Broadcast算子;gRPC:远程过程调用(RPC)框架;

目录 All-Reduce通信原语 定义与作用 实例说明 示例图解(以Ring算法为例) 结论 Reduce+LayerNorm+Broadcast算子 1. Reduce算子 2. LayerNorm算子 3. Broadcast算子 组合使用场景 gRPC:远程过程调用(RPC)框架 All-Reduce通信原语 是计算机科学中,特别是在分布式…

解锁成都跃享未来教育咨询抖音小店

在数字化浪潮汹涌的今天&#xff0c;教育行业的变革与创新层出不穷&#xff0c;其中&#xff0c;成都跃享未来教育咨询以其敏锐的洞察力和前瞻性的教育理念&#xff0c;在抖音平台上开设的小店&#xff0c;正悄然改变着人们的学习方式和教育资源的获取途径。本文将深入探讨成都…

骰子游戏的UML分析

一、需求分析 游戏者掷两个骰子,如果总点数是7则赢得游戏,否则为输 二、概要设计 2.1 设计用例 用例是基于某个场景(注:包括成功和失败场景,重要体现需求的边界)说明了用户如何通过系统实现实现其目标。 示例:玩游戏场景用例 用例名称:玩游戏 主要参与者: 游戏用户 前…

实时数据监控,三防平板在工业领域的应用解析

随着工业4.0时代的到来&#xff0c;数字化转型已成为各行各业的共同目标。在这一过程中&#xff0c;实时数据监控扮演着至关重要的角色&#xff0c;为企业提供数据驱动的决策支持&#xff0c;提升效率、降低成本、提高安全性。而作为移动终端设备&#xff0c;三防平板凭借其可靠…

深兰科技荣获2024年度金势奖“AI出海先锋品牌”金奖

近日&#xff0c;由金势奖组委会、凤凰网、营销国际协会等国内外知名机构、集团共同主办的“第四届未来营销大会暨锐品牌盛典”在上海举行。大会揭晓了第四届“金势奖锐品牌大赏”奖项的评选结果&#xff0c;深兰科技凭借自身在机器人产品出口和海外市场开拓等出海全球化发展方…

2-59 基于matlab的全离散法单自由度稳定极限切深叶瓣图绘制、两自由度稳定极限切深叶瓣图绘制

基于matlab的全离散法单自由度稳定极限切深叶瓣图绘制、两自由度稳定极限切深叶瓣图绘制&#xff0c;特定切削力系数进行数值积分。输出相应的叶瓣图。程序已调通&#xff0c;可直接运行。 2-59 两自由度稳定极限切深叶瓣图 - 小红书 (xiaohongshu.com)

【计算机组成原理】3.程序的执行

程序的执行 进程与线程 一个程序&#xff0c;读入内存&#xff0c;全是0和1构成 从内存读入到CPU计算&#xff0c;这个时候要通过总线 怎么区分一段01的数据到底是数据还是指令&#xff1f; 总线分类为三种&#xff1a;控制线 地址线 数据线 一个程序的执行&#xff0c;首…

美团创始人的亲授产品课

2020年王慧文受邀在清华大学演讲了个人的非产品公开课&#xff0c;课程内容以美团早期的实战经验结合规模效益、马太理论等诸多知名理论为主。 前两天重新翻阅的时候&#xff0c;还是有很多新的感悟&#xff0c;所以也借此机会把课程内容和大家分享一下。 规模效益 一个业务有…

视频压缩文件太大了怎么缩小?这6个视频压缩方法真有效

视频压缩文件太大了怎么缩小&#xff1f;视频文件太大不仅会占据磁盘空间&#xff0c;而且会影响分享传输&#xff0c;因此太大的视频文件我们可以通过压缩缩小来减少体积&#xff0c;那么要怎么压缩视频文件大小呢&#xff1f;在这里小编要分享亲测有用的6个视频压缩方法&…

EF8 学习过程中的问题和解决方案

一、varchar类型字段如果为null 无法使用contains来判断是否包含字符串 1. 有问题的代码&#xff1a; contractList _dbcontext.contractHeads.Where(u > u.code.Contains(queryStr) || u.name.Contains(queryStr) || u.companyName.Contains(queryStr) || u.customerNa…

Linux 内核源码分析---挂载文件系统

挂载描述符 Linux 操作系统的一个文件系统&#xff0c;只有挂载到内存中目录树的一个目录下&#xff0c;进程才能够访问这个文件系统。 每次挂载文件系统&#xff0c;虚拟文件系统就会创建一个挂载描述符&#xff08;mount 结构体&#xff09;。 挂载描述符用来描述文件系统的…

CSS 多按钮根据半圆弧度排列

需求 多个按钮根据弧度&#xff0c;延边均匀排列。 实现 HTML 分两级&#xff1b;第一级&#xff0c;外层定义按钮的 compose-container 宽度&#xff1b;第二级&#xff0c;按钮集合&#xff0c;使用方法 styleBtn(index)&#xff0c;根据索引计算&#xff1b; <div c…

原理图与 PCB设计核心指南!

这篇文章献给从事电子信息行业的硬件工程师、射频工程和PCB工程师&#xff0c;若有不足之处&#xff0c;请多多包涵&#xff01; 原理图设计原理 原理图设计是电子设计的核心环节&#xff0c;它为后续的 PCB 设计、生产、调试等流程奠定了坚实基础。深入理解原理图设计的原理及…

【Hot100】LeetCode—124. 二叉树中的最大路径和

1- 思路 使用递归 dfs 实现① 递归思路&#xff1a;每次递归返回值为 &#xff0c; root.valMath.max(left,right) 从 左右孩子中挑选一个大的。② 递归公式&#xff1a;定义 sum&#xff0c;sum root.val left right 2- 实现 ⭐124. 二叉树中的最大路径和——题解思路 cl…

如何使用调查问卷获得需求

通过调查问卷进行需求调研是个效率非常高的方法&#xff0c;也是需求调研常用的方法。对于调研者&#xff0c;不必跑到工作现场&#xff0c;不必跟一个又一个用户一遍又一遍地沟通&#xff0c;只要编写调查问卷&#xff0c;让甲方对接人安排人回答&#xff0c;然后分析答卷就可…