每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry”

绪论​:
本章将通过代码示例详细介绍了Qt中QListWidget、QTableWidget和QTreeWidget三种多元素控件的使用方法与核心功能,涵盖列表的增删操作、表格的行列管理以及树形结构的节点处理。
————————
早关注不迷路,话不多说安全带系好,发车啦(建议电脑观看)。

在这里插入图片描述

多元素控件

Qt 中提供的多元素控件有:

  1. QListWidget
  2. QListView(前两个表示列表结构)
    在这里插入图片描述
  3. QTableWidget
  4. QTableView(前两个表示表格结构)
    在这里插入图片描述
  5. QTreeWidget
  6. QTreeView(前两个表示树形结构)
    在这里插入图片描述

不难发现两种结构中有:xxWidget 和 xxView 之间的区别

  1. xxView 是更底层的实现
  2. xxWidget 是基于 xxView 封装起来的

例如:

  • QTableView 是基于 MVC 设计的控件
    • QTableView ⾃⾝不持有数据(不支持Model)。使⽤ QTableView 的时候需要⽤⼾创建⼀个 Model 对象 (⽐如 QStandardModel ),比较麻烦~
    • 并且把 Model 和 QTableView 关联起来. 后续修改 Model 中的数据就会影响 QTableView 的显⽰
    • 修改 QTableView 的显⽰也会影响到 Model 中的数据(双向绑定).
  • QTableWidget 则是 QTableView 的⼦类, 对 Model 进⾏了封装
    • 所以不需要⽤⼾⼿动创建 Model 对象, 直接就可以往 QTableWidget 中添加数据了
    • 提供了更方便的 api 让自己使用

不能说谁好谁坏,不同场景使用不同:

  1. 其中 xxxWidget 使用起来比较方便,但功能有限
  2. 而 xxxView 使用起来比较麻烦,但可以自由diy,实现更复杂的功能

因为他们是两两一组的,所以此处就着重讲解Widget


List Widget 多元素控件 列表

使⽤ QListWidget 能够显⽰⼀个纵向的列表. 形如:
在这里插入图片描述
核⼼属性

属性说明
currentRow当前被选中的是第⼏⾏
count⼀共有多少⾏
sortingEnabled是否允许排序
isWrapping是否允许换⾏
itemAlignment元素的对⻬⽅式
selectRectVisible被选中的元素矩形(高亮)是否可⻅
spacing元素之间的间隔

核⼼⽅法

⽅法说明
addItem(const QString& label)
addItem(QListWidgetItem *item)
列表中添加元素(列表中的每个元素/每一项就成为一个item(通过QListWidgetItem 类表示))
currentItem()返回 QListWidgetItem* 表⽰当前选中的元素
setCurrentItem(QListWidgetItem* item)设置选中哪个元素
setCurrentRow(int row)设置选中第⼏⾏的元素
insertItem(const QString& label, int row)
insertItem(QListWidgetItem *item, int row)
在指定的位置插⼊元素 (此处的 row 参数就表示插入完毕之后新的元素在第几行,也就是把新元素插入到第几行之前)
item(int row)返回 QListWidgetItem* 表⽰第 row ⾏的元素
takeItem(int row)删除指定⾏的元素, 返回 QListWidgetItem* 表⽰是哪个元素被删除了

核⼼信号

⽅法说明
currentItemChanged(QListWidgetItem* current, QListWidgetItem* old)选中不同元素时会触发. 参数是当前选中的元素和之前选中的元素.
currentRowChanged(int)选中不同元素时会触发. 参数是当前选中元素的⾏数.
itemClicked(QListWidgetItem* item)点击某个元素时触发
itemDoubleClicked(QListWidgetItem* item)双击某个元素时触发
itemEntered(QListWidgetItem* item)⿏标进⼊元素时触发

当选错了多元素控件的时候,可以通过右键选择 “变型为” 进行修改:
在这里插入图片描述

实操:ListWidget的新增删除列表

在这里插入图片描述

  1. 初始化默认的值

    1. 直接在构造函数中
      1. 通过列表控件调用addItem接口
      2. 添加:C++、Java、Python 子元素
    2. 也能直接在图形化界面中的右击 “列表控件” 选择 “编辑项目” 进行添加
      在这里插入图片描述
  2. 给新增按钮添加点击信号的槽函数:

    1. 获取到输入框中的内容
    2. 将获取到的内容 添加到QListWidget中
  3. 给删除按钮添加点击信号的槽函数:

    1. 获取被选元素它的行号(currentRow)
    2. 按行号进行删除元素 takeitem
  4. 右键列表新增 currentItemChanged 信号的槽函数(需要添加头文件 QListWidgetItem):

    1. 通过这个槽函数感知变化
    2. 判断current是否为空,不为空则打印:当前选中元素的文本
    3. 并且判断 previous 不为空的话也进行打印文本

结果:
在这里插入图片描述

源码:

#include "widget.h"
#include "ui_widget.h"#include <QListWidget>
#include <QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//添加子元素 addItemui->listWidget->addItem("C++");ui->listWidget->addItem("Java");ui->listWidget->addItem("Python");
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{//获取label内部的数据QString text = ui->lineEdit->text();//添加到list中ui->listWidget->addItem(text);
}void Widget::on_pushButton_2_clicked()
{//获取鼠标选中的行号int row = ui->listWidget->currentRow();//删除行号的内容 takeitemui->listWidget->takeItem(row);
}void Widget::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
{if(previous != nullptr){qDebug() << "previous: "<< previous->text();}//current 表示当前选中的元素、previous表示选中这个元素之前选择的元素if(current != nullptr){qDebug() << "current: "<< current->text();}}

Table Widget

使⽤ QTableWidget 表⽰⼀个表格控件. ⼀个表格中包含若⼲⾏, 每⼀⾏⼜包含若⼲列. 表格中的每个单元格, 是⼀个 QTableWidgetItem 对象

QTableWidget 核⼼⽅法

⽅法说明
item(int row, int column)根据⾏数列数获取指定的 QTableWidgetItem*
setItem(int row, int column, QTableWidget*)根据⾏数列数设置表格中的元素
currentItem()返回被选中的元素 QTableWidgetItem*
currentRow()返回被选中元素是第⼏⾏
currentColumn()返回被选中元素是第⼏列
row(QTableWidgetItem* )获取指定 item 是第⼏⾏
column(QTableWidgetItem* )获取指定 item 是第⼏列
rowCount()获取⾏数
columnCount()获取列数
insertRow(int row)在第 row ⾏处插⼊新⾏
insertColumn(int column)在第 column 列插⼊新列
removeRow(int row)删除第 row ⾏
removeColumn(int column)删除第 column 列
setHorizontalHeaderItem(int column, QTableWidget*)设置指定列的表头
setVerticalHeaderItem(int row, QTableWidget*)设置指定⾏的表头

QTableWidgetItem 核⼼信号

信号说明
cellClicked(int row, int column)点击单元格时触发
cellDoubleClicked(int row, int column)双击单元格时触发
cellEntered(int row, int column)⿏标进⼊单元格时触发
currentCellChanged(int row, int column, int previousRow, int previousColumn)选中不同单元格时触发

QTableWidgetItem 核⼼方法

⽅法说明
row()获取当前是第⼏⾏
column()获取当前是第⼏列
setText(const QString&)设置⽂本
setTextAlignment(int)设置⽂本对⻬
setIcon(const QIcon&)设置图标
setSelected(bool)设置被选中
setSizeHints(const QSize&)设置尺⼨
setFont(const QFont&)设置字体

实操:简单实现表格增加行/列,添加元素

在这里插入图片描述

  1. 使用ui构建,如上图

  2. 编辑框初始化:

    1. 新增列:学号、姓名、年龄
    2. 新增行:1、2、3
    3. 1 张三 20、…
  3. 代码初始化:

    1. 创建三行(insertRow
    2. 创建三列(insertColumn
    3. 给3个列设定列名:setHeorizontalHeaderItem
    4. 给表格中添加数据 setItem(行,列,QTableWidgetItem(数据))

初始化的值:
在这里插入图片描述

给按钮添加槽函数:

  1. 给新增一行按钮添加槽函数
    1. 获取多少行 rowCount
    2. 在最后一行之后新增新行 insertRow(rowCount)(注意此处是下标,表示你新增之后的这是第几行)
  2. 删除选中行
    1. 获取选中的行号 currentRow
    2. 删除这一行 removeRow
  3. 新增行
    1. 获取有几列 columnCount
    2. 新增一列 insertColumn
    3. 设置列名(从输入框中获取)
      1. 获取输入框的文本
      2. 给新增行添加列名 setHorizontalHeaderItem
  4. 删除选中列
    1. 获取选中列号 currentColumn
    2. 删除这一列 removeColumn

在这里插入图片描述

源码:

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//新增行ui->tableWidget_2->insertRow(0);//默认的即可不用设置行名称ui->tableWidget_2->insertRow(1);ui->tableWidget_2->insertRow(2);//新增列ui->tableWidget_2->insertColumn(0);ui->tableWidget_2->setHorizontalHeaderItem(0,new QTableWidgetItem("学号"));ui->tableWidget_2->insertColumn(1);ui->tableWidget_2->setHorizontalHeaderItem(1,new QTableWidgetItem("姓名"));ui->tableWidget_2->insertColumn(2);ui->tableWidget_2->setHorizontalHeaderItem(2,new QTableWidgetItem("年龄"));//添加数据ui->tableWidget_2->setItem(0,0,new QTableWidgetItem("1"));ui->tableWidget_2->setItem(0,1,new QTableWidgetItem("张三"));ui->tableWidget_2->setItem(0,2,new QTableWidgetItem("20"));ui->tableWidget_2->setItem(1,0,new QTableWidgetItem("2"));ui->tableWidget_2->setItem(1,1,new QTableWidgetItem("李四"));ui->tableWidget_2->setItem(1,2,new QTableWidgetItem("28"));ui->tableWidget_2->setItem(2,0,new QTableWidgetItem("3"));ui->tableWidget_2->setItem(2,1,new QTableWidgetItem("王五"));ui->tableWidget_2->setItem(2,2,new QTableWidgetItem("88"));}Widget::~Widget()
{delete ui;
}//新增一列
void Widget::on_pushButton_clicked()
{//获取LineEdit中的文本QString text = ui->lineEdit->text();//获取当前列数int ccount = ui->tableWidget->columnCount();//添加新列ui->tableWidget->insertColumn(ccount);//添加的是下标,所以刚好和个数相同//添加列名称if(text != nullptr){ui->tableWidget->setHorizontalHeaderItem(ccount,new QTableWidgetItem(text));}
}//删除选择的列
void Widget::on_pushButton_2_clicked()
{//获取光标选中的列int ccolumn = ui->tableWidget->currentColumn();//删除ui->tableWidget->removeColumn(ccolumn);
}//新增一行
void Widget::on_pushButton_3_clicked()
{//获取LineEdit中的文本QString text = ui->lineEdit->text();//获取当前行数int rcount = ui->tableWidget->rowCount();//添加新行ui->tableWidget->insertRow(rcount);//添加的是下标,所以刚好和个数相同//添加行名称if(text != ""){ui->tableWidget->setVerticalHeaderItem(rcount,new QTableWidgetItem(text));}
}//删除选中的行
void Widget::on_pushButton_4_clicked()
{//获取光标选中的行int crow = ui->tableWidget->currentRow();//删除行ui->tableWidget->removeRow(crow);
}

Tree Widget

使⽤ QTreeWidget 表⽰⼀个树形控件。⾥⾯的每个元素, 都是⼀个 QTreeWidgetItem ,每个
QTreeWidgetItem 可以包含多个⽂本和图标,每个⽂本/图标为⼀个 列
。可以给 QTreeWidget 设置顶层节点(顶层节点可以有多个), 然后再给顶层节点添加⼦节点, 从⽽构成树形结构。

对于列数的使用,可以对某子元素进行数据的展示,例如下图的 猫2 列,可以改成猫的年龄/体重,来描述当前子元素的各种属性数据
在这里插入图片描述
在这里插入图片描述

QTreeWidget 的 核⼼⽅法(顶层结点的方法

⽅法说明
clear清空所有⼦节点
addTopLevelItem(QTreeWidgetItem* item)新增顶层节点
topLevelItem(int index)获取指定下标的顶层节点.
topLevelItemCount()获取顶层节点个数
indexOfTopLevelItem(QTreeWidgetItem* item)查询指定节点是顶层节点中的下标
takeTopLevelItem(int index)删除指定的顶层节点. 返回 QTreeWidgetItem* 表⽰被删除的元素
currentItem()获取到当前选中的节点, 返回 QTreeWidgetItem*
setCurrentItem(QTreeWidgetItem* item)选中指定节点
setExpanded(bool)控制 展开/关闭 子节点
setHeaderLabel(const QString& text)设置 TreeWidget 的 header 名称

其中QTreeWidget控件虽然是树形结构,但是这个树形结构没有根节点,是从根结点的下一层结点开始计算的(如下图),所以是新增顶层结点
在这里插入图片描述

QTreeWidget 核⼼信号

信号说明
currentItemChanged(QTreeWidgetItem* current, QTreeWidgetItem* old)切换选中元素时触发
itemClicked(QTreeWidgetItem* item, int col)点击元素时触发
itemDoubleClicked(QTreeWidgetItem* item, int col)双击元素时触发
itemEntered(QTreeWidgetItem* item, int col)⿏标进⼊时触发
itemExpanded(QTreeWidgetItem* item)元素被展开时触发
itemCollapsend(QTreeWidgetItem* item)元素被折叠时触发

QTreeWidgetItem 核⼼属性

属性说明
text持有的⽂本
textAlignment⽂本对⻬⽅式
icon持有的图表
font⽂本字体
hidden是否隐藏
disabled是否禁⽤
expand是否展开
sizeHint尺⼨⼤⼩
selected是否选中

QTreeWidgetItem 核⼼⽅法(子节点的方法

⽅法说明
addChild(QTreeWidgetItem* child)新增⼦节点
childCount()⼦节点的个数
child(int index)获取指定下标的⼦节点. 返回 QTreeWidgetItem*
takeChild(int index)删除对应下标的⼦节点
removeChild(QTreeWidgetItem* child)删除对应的⼦节点
parent()获取该元素的⽗节点

实操:理解顶层元素和子元素的添加删除

通过界面编辑快速填充初始值
在这里插入图片描述

代码操作:

  1. 拖拽一个treeWidget
  2. 设置根节点的名字 setHeaderLabel
  3. 新增顶层结点
    1. 创建 QTreeWidgetItem 结点对象
    2. 每个结点都可以设置多个列名称 setText(列数(从0开始),名称猫、狗、鸟)
    3. 添加到顶层结点中,addTopLevelItem
  4. 再添加的子节点
    1. 写创建 结点对象,设置名称(列数,中华田园猫、布偶猫、…)
    2. 添加到item1中的子节点 addChild

在这里插入图片描述

三个按钮的槽函数

  1. 插入顶层结点按钮添加点击信号的槽函数
    1. 获取输入框中的内容
    2. 构造一个节点对象,设置名称 setText 将获取到的内容给到
    3. 添加到顶层结点中
  2. 插入子节点
    1. 获取当前选中节点对象 currentItem(若为空则啥也不做返回…)
    2. 获取输入框中的内容
    3. 构造一个节点对象,
    4. 设置名称 setText 将获取到的内容给到(同上12不变)
    5. 插入到选中结点的子节点中
  3. 删除选中的元素
    1. 获取选中元素
    2. 非空则删除选中元素,需要先获取父元素,通过父元素进行删除 parent
    3. 若为空则代表为顶层元素
      1. 获取顶层元素下标 indexOfTopLevelItem
      2. 从控件中删除顶层结点,takeTopLevelItem
    4. 非空则为普通元素,则通过获取的获取的parent删除子结点 removeChild

结果:
在这里插入图片描述

#include "widget.h"
#include "ui_widget.h"
#include <QTreeWidgetItem>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//设置根节点名称ui->treeWidget->setHeaderLabel("1");//创建结点对象QTreeWidgetItem* item1 = new QTreeWidgetItem();item1->setText(0,"猫");ui->treeWidget->addTopLevelItem(item1);//给顶层元素添加子元素QTreeWidgetItem* citem1 = new QTreeWidgetItem();citem1->setText(0,"狸花猫");item1->addChild(citem1);//就不多添加了...QTreeWidgetItem* item2 = new QTreeWidgetItem();item2->setText(0, "狗");ui->treeWidget->addTopLevelItem(item2);QTreeWidgetItem* item3 = new QTreeWidgetItem();item3->setText(0, "⻦");ui->treeWidget->addTopLevelItem(item3);
}Widget::~Widget()
{delete ui;
}//添加顶层元素
void Widget::on_pushButton_clicked()
{//获取输入框内容QString text = ui->lineEdit->text();if(text == QString()){text = "默认值...";}//将内容创建项目QTreeWidgetItem* item = new QTreeWidgetItem();item->setText(0,text);//添加到顶层ui->treeWidget->addTopLevelItem(item);
}//添加选中的子元素
void Widget::on_pushButton_2_clicked()
{//获取当前选中的顶层元素QTreeWidgetItem* item = ui->treeWidget->currentItem();if(item == nullptr) return ;//获取输入框内容QString text = ui->lineEdit->text();if(text == QString()){text = "默认值...";}//将输入框内容添加到创建的新子元素中QTreeWidgetItem* citem = new QTreeWidgetItem();citem->setText(0,text);//给顶层添加新元素item->addChild(citem);
}//删除选中的节点
void Widget::on_pushButton_3_clicked()
{//获取当前选中的节点QTreeWidgetItem* item = ui->treeWidget->currentItem();//需要获取父元素,通过父元素进行删除QTreeWidgetItem* pitem = item->parent();//若为空则,此时已经是顶层元素if(pitem == nullptr){//获取指定节点的顶层元素的下标int index = ui->treeWidget->indexOfTopLevelItem(item);ui->treeWidget->takeTopLevelItem(index);}else{ //若不是则://通过获取的父元素,删除指定的子元素pitem->removeChild(item);}}

注意上述控件相关的操作,数据都是在内存中的,重新运行程序数据就没了


本章完。预知后事如何,暂听下回分解。

如果有任何问题欢迎讨论哈!

如果觉得这篇文章对你有所帮助的话点点赞吧!

持续更新大量C++细致内容,早关注不迷路。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于TI DSP控制的光伏逆变器最大功率跟踪mppt

基于TI DSP&#xff08;如TMS320F28335&#xff09;控制的光伏逆变器最大功率跟踪&#xff08;MPPT&#xff09;程序通常涉及以下几个关键部分&#xff1a;硬件电路设计、MPPT算法实现、以及DSP的编程。以下是基于TI DSP的光伏逆变器MPPT程序的一个示例&#xff0c;主要采用扰动…

Python实现P-PSO优化算法优化卷积神经网络CNN回归模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 随着人工智能和深度学习技术的快速发展&#xff0c;卷积神经网络&#xff08;CNN&#xff09;在图像分类、目标检测…

计算机视觉入门:OpenCV与YOLO目标检测

计算机视觉入门&#xff1a;OpenCV与YOLO目标检测 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 计算机视觉入门&#xff1a;OpenCV与YOLO目标检测摘要引言技术原理对比1. OpenCV&#xff1a;传统图像处理与机器学…

【PCB工艺】绘制原理图 + PCB设计大纲:最小核心板STM32F103ZET6

绘制原理图和PCB布线之间的联系,在绘制原理图的时候,考虑到后续的PCB设计+嵌入式软件代码的业务逻辑,需要在绘制原理图之初涉及到 硬件设计流程的前期规划。在嵌入式系统开发中,原理图设计是整个项目的基础,直接影响到后续的: PCB 布线效率和质量 ☆☆☆重点嵌入式软件的…

Centos系统搭建主备DNS服务

目录 一、主DNS服务器配置 1.安装 BIND 软件包 2.配置主配置文件 3.创建正向区域文件 4.创建区域数据文件 5.检查配置语法并重启服务 二、从DNS服务配置 1.安装 BIND 软件包 2.配置主配置文件 3.创建缓存目录 4.启动并设置开机自启 一、主DNS服务器配置 1.安装 BIN…

LeetCode[513]找树左下角的值

思路&#xff1a; 找树左下角的值&#xff0c;有可能这个值不是左叶子节点&#xff0c;可能是右叶子节点&#xff0c;但怎么说这个值都是叶子节点&#xff0c;首先这道题用层序遍历的思路比如什么队列和BSF的递归都可以做&#xff0c;但我比较喜欢用纯递归来搞&#xff0c;因为…

ubuntu20.04.5--arm64版上使用node集成java

ubuntu20.04.5arm上使用node集成java #ssh&#xff0c;可选 sudo apt update sudo apt install openssh-server sudo systemctl status ssh sudo systemctl enable ssh sudo systemctl enable --now ssh #防火墙相关&#xff0c;可选 sudo ufw allow ssh sudo ufw allow 22…

更新 Docker 容器中的某一个文件

&#x1f504; 如何更新 Docker 容器中的某一个文件 以下是几种在 Docker 中更新单个文件的常用方法&#xff0c;适用于不同场景。 ✅ 方法一&#xff1a;使用 docker cp 拷贝文件到容器中&#xff08;最简单&#xff09; &#x1f9f0; 命令格式&#xff1a; docker cp <…

JavaEE->多线程:定时器

定时器 约定一个时间&#xff0c;时间到了&#xff0c;执行某个代码逻辑&#xff08;进行网络通信时常见&#xff09; 客户端给服务器发送请求 之后就需要等待 服务器的响应&#xff0c;客户端不可能无限的等&#xff0c;需要一个最大的期限。这里“等待的最大时间”可以用定时…

html基础01:前端基础知识学习

html基础01&#xff1a;前端基础知识学习 1.个人建立打造 -- 之前知识的小总结1.1个人简历展示1.2简历信息填写页面 1.个人建立打造 – 之前知识的小总结 1.1个人简历展示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8&qu…

uniapp 键盘顶起页面问题

关于uniapp中键盘顶起页面的问题。这是一个在移动应用开发中常见的问题&#xff0c;特别是当输入框位于页面底部时&#xff0c;键盘弹出会顶起整个页面&#xff0c;导致页面布局错乱。 pages.json 文件内&#xff0c;在需要处理软键盘的页面添加 softinputMode 配置&#xff1…

使用 React Native 开发鸿蒙运动健康类应用的​​高频易错点总结​​

&#x1f6a8; ​​一、环境配置与工程初始化​​ ​​1. Node.js 版本冲突​​ ​​现象​​&#xff1a;DevEco Studio 报错 Unsupported Node version&#xff08;鸿蒙 RN 依赖 Node ≥18&#xff09;。​​解决​​&#xff1a; nvm install 18.16.0 # 强制锁定版本 ech…

机器学习——聚类算法

一、聚类的概念 根据样本之间的相似性&#xff0c;将样本划分到不同的类别中的一种无监督学习算法。 细节&#xff1a;根据样本之间的相似性&#xff0c;将样本划分到不同的类别中&#xff1b;不同的相似度计算方法&#xff0c;会得到不同的聚类结果&#xff0c;常用的相似度…

Python训练第四十四天

DAY 44 预训练模型 知识点回顾&#xff1a; 预训练的概念常见的分类预训练模型图像预训练模型的发展史预训练的策略预训练代码实战&#xff1a;resnet18 作业&#xff1a; 尝试在cifar10对比如下其他的预训练模型&#xff0c;观察差异&#xff0c;尽可能和他人选择的不同尝试通…

Spring Boot中保存前端上传的图片

在Spring Boot中保存前端上传的图片可以通过以下步骤实现&#xff1a; 1. 添加依赖 确保在pom.xml中已包含Spring Web依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifact…

应用层协议:HTTP

目录 HTTP&#xff1a;超文本传输协议 1.1 HTTP报文 1.1.1 请求报文 1.1.2 响应报文 1.2 HTTP请求过程和原理 1.2.1 请求过程 1、域名&#xff08;DNS&#xff09;解析 2、建立TCP连接&#xff08;三次握手&#xff09; 3、发送HTTP请求 4、服务器处理请求 5、返回H…

商务合同范本智能审核系统 AI 大模型处理方案

1. 项目概述与目标 目标: 构建一个基于AI大模型的智能合同审核系统,能够自动解析商务合同范本,识别其中的法律风险点(如权责不对等、违约金比例异常、条款模糊、缺失必要条款等),并结合企业内部合规数据库进行实时比对,提供专业的修改建议,大幅提升合同审查的效率和合…

Kafka 消息队列

一、 消息队列 1. 什么是消息队列 消息(Message)是指在应用间传送的数据。消息可以非常简单&#xff0c;比如只包含文本字符串&#xff0c;也可以更复杂&#xff0c;可能包含嵌入对象。消息队列(Message Queue)是一种应用间的通信方式&#xff0c;消息发送后可以立即返回&…

NodeJS全栈WEB3面试题——P3Web3.js / Ethers.js 使用

3.1 Ethers.js 和 Web3.js 的主要区别是什么&#xff1f; 比较点Ethers.jsWeb3.js体积更轻量&#xff0c;适合前端较大&#xff0c;加载慢&#xff0c;适合 Node文档文档简洁、现代化&#xff0c;支持 TypeScript文档丰富&#xff0c;但不够现代化模块化设计高度模块化&#x…

Ubuntu 桌面版忘记账户密码的重置方法

如果你忘记了 Ubuntu 桌面版的用户密码&#xff0c;可以通过进入恢复模式&#xff08;Recovery Mode&#xff09;来重置密码。以下是详细步骤&#xff1a; 一、进入 GRUB 引导菜单 重启计算机&#xff1a;点击关机按钮&#xff0c;选择重启。在启动时按住 Shift 键&#xff1…