【Qt】Item Widgets 多元素控件
Qt中提供的多元素控件有:
- QListWidget
- QListView
- QTableWidget
- QTableView
- QTreeWidget
- QTreeView
上述控件分为Widget和View,其区别如下:
以QTableWidget和QTableView为例
- QTableView是基于MVC(Model-View-Controller)设计的控件。QTableView自身不持有数据,只是实现界面效果。使用QTableView需要用户创建一个Model对象(比如QStandarModel),并且把Model和QTableView关联起来,后续修改Model中的恶数据就会影响QTableView的显示;修改QTableView也会影响Model中的数据(双向绑定)
- QTableWidget则是QTableView的子类,对Model进行了封装,不需要我们手动创建Model对象,直接往QTableWidget中添加数据即可
目录
QListWidget
QListWidgetItem
QTableWidget
QTableWidgetItem
QTreeWidget
QTreeWidgetItem
QListWidget
QListWidget类是用于显示条目列表的控件。每个条目可以包含文本和可选的图标

核心属性
| 属性 | 说明 |
| currentRow | 当前被选中的是第几行,下标从0开始 |
| count | 当前有多少行条目 |
| sortingEnabled | 是否允许排序 |
| isWrapping | 是否允许换行 |
| itemAlignment | 元素的对齐方式 |
| selectRectVisible | 被选中的元素矩形是否可见 |
| spacing | 元素之间的间隔 |
核心方法
| 方法 | 说明 |
| addItem(const QString &label) addItem(QListWidgetItem *item) | 在列表末尾添加元素 |
| currentItem() | 获取当前选中的条目,返回值是QListWidgetItem* |
| setCurrentItem(QListWidgetItem *item) | 设置选中哪个元素 |
| setCurrentRow(int row) | 设置选中第几行的条目 |
| insertItem(const QString& label, int row) insertItem(QListWidgetItem *item, int row) | 指定行插入元素,插入的元素顶替原先的位置 例如row = 0,那么新插入的元素下标将会为0 |
| item(int row) | 获取第row行的条目,返回值为QListWidgetItem * |
| takeItem(int row) | 删除指定行的条目,返回值为QListWidgetItem *,被删除的条目 |
核心信号
| 信号 | 说明 |
| currentItemChanged(QListWidgetItem *current, QListWidgetItem *old) | 选中不同元素时会触发,参数是当前选中的元素和之前的元素 注意:在QListWidget最开始展示时就会触发该信号,但此时没有old,所以编写相应的槽函数需要对指针判空 |
| currentRowChanged(int) | 选中不同元素时触发,参数是当前选中的行数 |
| itemClicked(QListWidgetItem *item) | 点击某个元素时触发 |
| itemDoubleClicked(QListWidgetItem *item) | 双击某个元素时触发 |
| itemActivated(QListWidgetItem *item) | 某个元素被激活,点击和双击都会触发该信号 |
| itemEntered(QListWidgetItem *item) | 鼠标进入元素时触发 |
| itemChanged(QListWidgetItem *item) | 条目的内容被改变时触发 |
QListWidgetItem
XXItem是用于显示界面中单个条目的类,包含了条目的数据和显示设置,比如文本、图标等
这些Item本身并不是Model,更类似于View或是对Model数据的一种显示
核心方法
| 方法 | 说明 |
| setFont | 设置字体 |
| setIcon | 设置图标 |
| setHidden | 设置隐藏 |
| setSizeHint | 设置尺寸 |
| setSelected | 设置是否选中 |
| setText | 设置文本 |
| setTextAlignment | 设置文本对齐方式 |
代码示例:使用QListWidget展示语言,QLineEdit输入新增语言,一个新增按钮和删除按钮
1. 使用Qt Designer添加所需控件

2. 编写widget.cpp,在构造函数中添加初始元素
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//初始化添加几个元素ui->listWidget->addItem("C++");ui->listWidget->addItem("Java");ui->listWidget->addItem("Python");//设置提示词ui->lineEdit->setPlaceholderText("请输入要添加的元素");
}
3. 编写按钮的槽函数
//增加条目
void Widget::on_pushButton_add_clicked()
{//获取输入框的文本const QString &text = ui->lineEdit->text();if(text == nullptr) return;//获取当前选中的下标int row = ui->listWidget->currentRow();//将新条目插入到选中条目之后,若没选中,index = 0,为头插ui->listWidget->insertItem(row, text);
}
//删除条目
void Widget::on_pushButton_delete_clicked()
{//另一种获取选中元素的方法auto *item = ui->listWidget->currentItem();if(item == nullptr) return;int row = ui->listWidget->row(item);ui->listWidget->takeItem(row);
}
QTableWidget
QTableWidget类用于显示二维表格数据

核心方法
| 方法 | 说明 |
| item(int row, int column) | 通过指定行列获取元素,返回值为QTableWidgetItem * |
| setItem(int row, int column, QTableWidget *item) | 通过指定行列,设置表格中的元素 |
| currentItem() | 返回被选中的元素,返回值为QTableWidgetItem * |
| currentRow() | 返回被选中元素的行号,从0开始 |
| currentColumn() | 返回被选中元素的列号,从0开始 |
| row(QTableWidgetItem *item) | 获取指定 item 的行号 |
| column(QTableWidgetItem *item) | 获取指定 item 的列号 |
| rowCount() | 获取当前列表有几行 |
| columnCount() | 获取当前列表有几列 |
| insertRow(int row) | 在第 row 行插入新行 若 insertRow(0),则新插入的行为第0行 |
| insertColumn(int column) | 在第 column 列插入新列 |
| removeRow(int row) | 删除第 row 行 |
| removeColumn(int column) | 删除第 column 列 |
| setHorizontalHeaderItem(int column, QTableWidgetItem *item) | 设置指定列的表头,即列属性 |
| setVerticalHeader(int row, QTableWidgetItem *item) | 设置指定行的表头,即行属性 |
| setHorizontalHeaderLabels(QStringList &labels) | 通过QStringList快速设置列属性 |
| setVerticalHeaderLabels(QStringList &labels) | 通过QStringList快速设置行属性 |
核心信号
| 信号 | 说明 |
| 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
QTableWidgetItem是二维单元格中表示和管理单元格数据的类,允许开发者在表格中操作和显示文本、图标和其他数据
核心方法
方法大致与QListWidgetItem相同,多了行列相关的方法
| 方法 | 说明 |
| row() | 获取该元素的行号 |
| column() | 获取该元素的列号 |
| setText(const QString &) | 设置文本 |
| setTextAlignment(int) | 设置文本对齐方式 |
| setIcon(const QIcon &) | 设置图标 |
| setSelected(bool) | 设置被选中 |
| setSizeHints(cinst QSize &) | 设置尺寸 |
| setFont(const QFont &) | 设置字体 |
代码示例:简易学生成绩表
1. 使用Qt Designer添加所需控件

2. 编写widget.cpp,在构造函数中初始化相关元素
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//设置提示词ui->lineEdit->setPlaceholderText("请输入新增列名");//插入4行3列for(int i = 0; i < 4; ++i)//4行ui->tableWidget->insertRow(i);for(int i = 0; i < 3; ++i)//3列ui->tableWidget->insertColumn(i);//设置列名QStringList colName = {"学号", "姓名", "成绩"};ui->tableWidget->setHorizontalHeaderLabels(colName);//初始数据ui->tableWidget->setItem(0, 0, new QTableWidgetItem("1001"));ui->tableWidget->setItem(0, 1, new QTableWidgetItem("张三"));ui->tableWidget->setItem(0, 2, new QTableWidgetItem("83"));ui->tableWidget->setItem(1, 0, new QTableWidgetItem("1002"));ui->tableWidget->setItem(1, 1, new QTableWidgetItem("小明"));ui->tableWidget->setItem(1, 2, new QTableWidgetItem("95"));ui->tableWidget->setItem(2, 0, new QTableWidgetItem("1003"));ui->tableWidget->setItem(2, 1, new QTableWidgetItem("小华"));ui->tableWidget->setItem(2, 2, new QTableWidgetItem("79"));
}
3. 编写按钮的槽函数
//新增一行
void Widget::on_pushButton_clicked()
{//尾插int row = ui->tableWidget->rowCount();ui->tableWidget->insertRow(row);
}
//新增一列,同时设置列名
void Widget::on_pushButton_2_clicked()
{const QString &text = ui->lineEdit->text();if(text == nullptr) return;//尾插一列并设置列名int col = ui->tableWidget->columnCount();ui->tableWidget->insertColumn(col);ui->tableWidget->setHorizontalHeaderItem(col, new QTableWidgetItem(text));
}
//删除一行
void Widget::on_pushButton_3_clicked()
{int row = ui->tableWidget->currentRow();ui->tableWidget->removeRow(row);
}
//删除一列
void Widget::on_pushButton_4_clicked()
{int col = ui->tableWidget->currentColumn();ui->tableWidget->removeColumn(col);
}
程序效果如下:

默认情况下,单元格的内容可以直接编辑。如果不想让用户编辑,可以设置
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
QTreeWidget
QTreeWidget类用于显示树形结构,集成了数据模型和视图的功能

QTreeWidget不同于往常的多叉树,Qt隐藏了该多叉树的根节点,我们只能访问从根节点以下的节点。
根节点以下第一层是 topLevelItem ,通过QTreeWidget添加;再往下的节点t通过 QTreeWidgetItem 的child指针连接
核心方法
| 方法 | 说明 |
| clear() | 清空所有子节点 |
| addTopLevelItem(QTreeWidgetItem *item) | 新增顶层节点 |
| topLevelItem(int index) | 获取指定下标的顶层节点,返回值是 QTreeWidgetItem * |
| topLevelItemCount() | 获取顶层节点的个数 |
| indexOfTopLevelItem(QTreeWidgetItem *item) | 查询指定节点在顶层节点中的下标 |
| takeTopLevelItem(int index) | 通过下标删除顶层节点,返回值是 QTreeWidgetItem * 表示被删除的节点 |
| currentItem() | 获取当前选中的节点,返回值是 QTreeWidgetItem * |
| setCurrentItem(QTreeWidgetItem *item) | 设置选中的节点 |
| setExpanded(bool) | 展开/关闭节点 true为展开,false为关闭 |
| setHeaderLabel(const QString &text) | 设置QTreeWidget的header名称,如上述样例的"动物" |
核心信号
| 信号 | 说明 |
| 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
QTreeWidgetItem类用于表示树状结构中的每个节点,可显示文本和图标等元素
在QTreeWidget中顶层元素和子元素其实都是QTreeWidgetItem,只是调用的接口不同,顶层元素通过QTreeWidget添加、删除、管理,子元素由顶层元素管理。
核心属性
| 属性 | 说明 |
| text | 持有的文本 |
| textAlignment | 文本对齐方式 |
| icon | 持有的图标 |
| font | 文本字体 |
| hidden | 是否隐藏 |
| disabled | 是否禁用 |
| expand | 是否展开 |
| sizeHint | 尺寸大小 |
| selected | 是否选中 |
| parent | 父亲节点 |
核心方法
| 方法 | 说明 |
| addChild(QTreeWidgetItem *child) | 新增子节点 |
| childCount() | 子节点的个数 |
| child(int index) | 获取指定下标的子节点,返回值是QTreeWidgetItem * |
| takeChild(int index) | 通过下标删除对应子节点 |
| removeChild(QTreeWidgetItem *child) | 通过指针删除对应子节点 |
| parent() | 获取父节点,返回值是QTreeWidgetItem * |
代码示例:使用QTreeWidget 展示动物种类
1. 通过Qt Designer添加所需控件

2. 编写widget.cpp,通过构造函数初始化相关控件
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->lineEdit->setPlaceholderText("请输入要添加的元素");//设置根节点名称ui->treeWidget->setHeaderLabel("动物");//添加顶层元素QTreeWidgetItem *item_cat = new QTreeWidgetItem(ui->treeWidget);item_cat->setText(0, "猫");ui->treeWidget->addTopLevelItem(item_cat);QTreeWidgetItem *item_dog = new QTreeWidgetItem(ui->treeWidget);item_dog->setText(0, "狗");ui->treeWidget->addTopLevelItem(item_dog);QTreeWidgetItem *item_bird = new QTreeWidgetItem(ui->treeWidget);item_bird->setText(0, "鸟");ui->treeWidget->addTopLevelItem(item_bird);
}
3. 编写按钮的槽函数
//添加顶层节点
void Widget::on_pushButton_clicked()
{const QString &text = ui->lineEdit->text();if(text.isEmpty()) return;//构造新节点并链入QTreeWidgetQTreeWidgetItem *newColumn = new QTreeWidgetItem(ui->treeWidget);newColumn->setText(0, text);ui->treeWidget->addTopLevelItem(newColumn);
}
//添加非顶层节点
void Widget::on_pushButton_2_clicked()
{const QString &text = ui->lineEdit->text();if(text.isEmpty()) return;//获取父亲节点QTreeWidgetItem *parent = ui->treeWidget->currentItem();if(parent == nullptr) return;//构造新节点并链入parentQTreeWidgetItem *newColumn = new QTreeWidgetItem(parent);newColumn->setText(0, text);parent->addChild(newColumn);//添加完后直接展开parent->setExpanded(true);
}
//删除子项
void Widget::on_pushButton_3_clicked()
{QTreeWidgetItem *curItem = ui->treeWidget->currentItem();QTreeWidgetItem *parent = curItem->parent();if(parent == nullptr){//顶层元素int index = ui->treeWidget->indexOfTopLevelItem(curItem);ui->treeWidget->takeTopLevelItem(index);}elseparent->removeChild(curItem);//非顶层元素
}
结束语
感谢你的阅读,如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要

相关文章:
【Qt】Item Widgets 多元素控件
Qt中提供的多元素控件有: QListWidgetQListViewQTableWidgetQTableViewQTreeWidgetQTreeView 上述控件分为Widget和View,其区别如下: 以QTableWidget和QTableView为例 QTableView是基于MVC(Model-View-Controller)设计的控件。QTableView自身…...
sharded_inference_engine:MLXDynamicShardInferenceEngine;step
目录 sharded_inference_engine:MLXDynamicShardInferenceEngine 类属性 方法 __init__(self) async def infer_prompt(self, shard: Shard, prompt: str, inference_state: Optional[str] = None) -> (np.ndarray, str, bool) async def infer_tensor(self, shard: …...
JAVA开发学习-day21
JAVA开发学习-day21 1. 删除表单数据 根据ElementUI的官方组件指南,为表单每列的数据添加删除按钮 <el-table :data"tableData" style"width: 100%"><el-table-column prop"id" label"ID" width"180"…...
Python的安装环境以及应用
1.环境python2,Python 最新安装3.12可以使用源码安装 查看安装包 [rootpython001 ~]# yum list installed | grep epel 3[rootpython001 ~]# yum list installed | grep python [rootpython001 ~]# yum -y install python3 安装python3 查看版本 [root…...
TabLayout使用以及自定义tab标签
<?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"xmlns:tool…...
第二十节、有限状态机和抽象类多态
一、抽象类 挂载到动画器上的就是继承抽象类代码 1、使用onenable周期函数启用 2、在每一个周期函数中对抽象类进行调用 3、隐藏公开的变量...
SQL注入实例(sqli-labs/less-23)
0、初始网页 1、闭合方式判断 闭合符号为单引号,通过测试发现过滤了注释,所以直接闭合 2、确定查询表的列数 确定查询表的列数为3列 ?id1 order by 3 3、确定回显位置 回显位置为第二列和第三列 ?id-1 union select 1,2,3 4、查看当前登录和数据…...
3.Redis数据类型(二)
LIST List 是一个简单的双向链表,支持从两端进行插入和删除操作。 常用命令: lpush/rpush/lrange lpush 插入一个或多个元素到列表的左端。 rpush 插入一个或多个元素到列表的右端。 lrange key start stop 获取元素(前闭后闭࿰…...
JavaWeb系列十一: Web 开发会话技术Session
Web 开发会话技术Session Session有什么用session基本原理session原理示意图session可以做什么如何理解Session Session常用方法Session底层实现机制原理分析图应用实例session实现原理动画 Session生命周期Session生命周期说明Session生命周期实例 作业布置 Session有什么用 …...
k8s中yaml文件的编写
目录 1.编写pod.yaml 2.编写deploment.yaml 3.编写service.yaml关联创建的pod 4.总结获取K8S资源配置清单文件模板方法 5.补充 1.编写pod.yaml vim demo1-pod.yaml apiVersion: v1 kind: Pod metadata:name: scj-podnamespace: xy101labels:app: nginxmylove: tangjunmyc…...
打卡第37天------动态规划
加油!不要放弃,那些冲进清北复交的高材生的水平真不是盖的,名不虚传,有实力的全能选手。我在刷题的过程中不得不表达一下对他们的钦佩。 这里在遍历顺序上可就有说法了。 如果求组合数就是外层for循环遍历物品,内层for遍历背包。如果求排列数就是外层for遍历背包,内层for…...
openfeign本地试用
目的:在本地搭建一个简单的openfeign使用场景,测试查询、新增等功能 平台:win10 技术栈:Springboot, SpringCloud, Nacos, Mybatis, MySql, Logback 框架作用说明: Nacos用于服务注册,将provider应用注…...
数据库|SQLServer数据库:查询函数(SUM、COUNT、MAX、MIN、AVG)的使用
哈喽,你好啊,我是雷工! 日拱一卒,进一寸有进一寸的欢喜,本节学习数据库查询函数的使用。 以下为学习笔记。 01 求和 SUM:对某一字段列进行求和运算; 示例: 对账号表Account的文章…...
简单Qt贪吃蛇项目
目录 先看效果 项目介绍 界面一:游戏大厅界面 界面二:关卡选择界面编辑 界面三:游戏界面 游戏大厅页面 游戏关卡选择页面 游戏房间页面 封装贪吃蛇数据结构 初始化游戏房间界面 设置窗口大小、标题、图标等 蛇的移动 初始化贪…...
画菱形(曼哈顿距离)
输入一个奇数 nn,输出一个由 * 构成的 nn 阶实心菱形。 输入格式 一个奇数 nn。 输出格式 输出一个由 * 构成的 nn 阶实心菱形。 具体格式参照输出样例。 数据范围 1≤n≤991≤n≤99 输入样例: 5输出样例: * *** ******** * #i…...
CSP初赛知识点讲解(六)
CSP初赛知识点讲解(六) 运算表达式中缀变后缀表达式求值前缀表达式 例题训练(八) 运算表达式 运算表达式有三种,前缀表达式,中缀表达式,后缀表达式,我们常用的是中缀表达式…...
linux rocky 9.2系统安装mysql-wsrep-8.4.2-26.20-linux-x86_64.tar.gz二进制包
1.环境准备, ①装好Rocky linux9.2系统,设置好IP nmcli con mod ens160 ipv4.addresses 192.168.0.106/24 nmcli con mod ens160 ipv4.gateway 192.168.0.2 nmcli con mod ens160 ipv4.dns 114.114.114.114 nmcli con up ens160 nmcli con mod ens…...
QT实现上传服务器功能
代码如下所示: void UploadZipFileToServer(const QString& strPath) {m_pFile new QFile(strPath);// 创建HTTP多部份请求QHttpMultiPart *multiPart new QHttpMultiPart(QHttpMultiPart::FormDataType);QHttpPart keyPart;keyPart.setHeader(QNetworkReques…...
元岳食堂采购供应链系统-智慧食堂数据化解决方案
随着社会的发展和科技的进步,在数字化浪潮的推动下,智慧食堂供应链系统逐渐成为食堂管理的重要工具。在此背景下,元岳食堂采购供应链系统应运而生,该系统通过其独特的数字化和自动化功能,能够对食堂的采购、储存、配送…...
基于Java+SpringBoot+Vue的影城管理系统
基于JavaSpringBootVue的影城管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 哈喽…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...
给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
