【嵌入式——QT】Model/View
【嵌入式——QT】Model/View
- 基本原理
- 数据模型
- 视图组件
- 代理
- Model/View结构的一些概念
- QFileSystemModel
- QStringListModel
- QStandardItemModel
- 自定义代理
基本原理
GUI应用程序的一个很重要的功能是由用户在界面上编辑和修改数据,典型的如数据库应用程序,数据库应用程序中,用户在界面上执行各种操作,实际上是修改了界面组件所关联的数据库内的数据。将界面组件与所编辑的数据分离开来,又通过数据源的方式连接起来,是处理界面与数据的一种较好的方式,Qt使用Model/View结构来处理这种关系。
数据模型
QAbstractItemModel
- QAbstractListModel:QStringListModel,处理字符串列表数据的数据模型类;
- QAbstractProxyModel:QSortFilterProxyModel,提供排序和过滤功能的数据模型类;
- QAbstractTableModel:QSqlQueryModel,数据库SQL查询结构的数据模型类;QSqlTableModel,用于数据库的一个数据表的数据模型类;QSqlRelationalTableModel,关系型数据表的数据模型类;
- QStandardItemModel:每个项数据可以使任何数据类型;
- QFileSystemModel:文件系统的数据模型类;
视图组件
- QListView:用于显示单列的列表数据,适用于一维数据的操作;
- QTreeView:用于显示树状结构数据,适用于树状结构数据的操作;
- QTableView:用于显示表格状数据,适用于二维表格型数据的操作;
- QColumnView:用多个QListView显示树状层次结构,树状结构的一层用一个QListView显示;
- QHeaderView:提供行表头或列表头的视图组件,如QTableView的行表头和列表头;
代理
代理(Delegate)就是在视图组件上为编辑数据提供编辑器,如在表格组件中编辑一个单元格的数据时,缺省是使用一个QLineEdit编辑框。
代理负责从数据模型获取相应的数据,然后显示在编辑器里,修改数据后,又将其保存到数据模型中。
QAbstractItemDelegate是所有代理类的基类,它不能直接使用,它的一个子类QStyledItemDelegate,是Qt的视图组件缺省使用的代理类。
Model/View结构的一些概念
基本结构
数据模型中的存储数据的基本单元都是项(item),每个项都有一个行号,一个列号,还有一个父项。
模型索引
QModelIndex表示模型索引的类,模型索引提供数据存取的一个临时指针,用于通过数据模型提取或修改数据,因为模型内部数据的结构随时可能改变,所以模型索引是临时的。
行号和列号
数据模型的基本形式是用行和列定义的表格数据,要获得一个模型索引,必须提供行号、列号、父项的模型索引。
父项
当数据模型是列表或表格时,使用行号、列号存储数据比较直观,所有数据项的父项就是顶层项,当数据模型是树状结构时,情况比较复杂,一个节点可以有父节点,也可以是其他节点的父节点,在构造数据项的模型索引时,必须指定正确的行号、列号和父节点。
项的角色
在为数据模式的一个项设置数据时,可以赋予其不同项的角色的数据。
enum ItemDataRole
- Qt::DisplayRole:在视图组件中显示字符串,标准角色;
- Qt::ToolTipRole:鼠标提示消息;
- Qt::UserRole:可以自定义数据;
QFileSystemModel
QFileSystemModel提供了一个可用于访问本机文件系统的数据模型,QFileSystemModel和视图组件QTreeView结合使用,可以用目录树的形式显示本机上的文件系统,如同Windows的资源管理器一样,使用QFileSystemModel提供的接口函数,可以创建目录,删除目录,重命名目录,可以获得文件名称、目录名称、文件大小等参数,还可以获得文件的详细信息。
图示

代码示例
ModelViewDialog.h
#ifndef MODELVIEWDIALOG_H
#define MODELVIEWDIALOG_H#include <QDialog>
#include <QFileSystemModel>namespace Ui
{class ModelViewDialog;
}class ModelViewDialog : public QDialog
{Q_OBJECTpublic:explicit ModelViewDialog(QWidget* parent = nullptr);~ModelViewDialog();
private slots:void on_treeView_clicked(const QModelIndex& index);private:Ui::ModelViewDialog* ui;QFileSystemModel* model;
};#endif // MODELVIEWDIALOG_H
ModelViewDialog.cpp
#include "ModelViewDialog.h"
#include "ui_ModelViewDialog.h"
ModelViewDialog::ModelViewDialog(QWidget* parent): QDialog(parent), ui(new Ui::ModelViewDialog)
{ui->setupUi(this);model = new QFileSystemModel(this);//QDir::currentPath() 获得本机文件系统model->setRootPath(QDir::currentPath());//设置根目录ui->treeView->setModel(model);//设置数据模型ui->listView->setModel(model);//设置数据模型ui->tableView->setModel(model);//设置数据模型connect(ui->treeView, SIGNAL(clicked(QModelIndex)), ui->listView, SLOT(setRootIndex(QModelIndex)));connect(ui->treeView, SIGNAL(clicked(QModelIndex)), ui->tableView, SLOT(setRootIndex(QModelIndex)));
}ModelViewDialog::~ModelViewDialog()
{delete ui;
}void ModelViewDialog::on_treeView_clicked(const QModelIndex& index)
{ui->checkBox->setChecked(model->isDir(index));//是否目录ui->labPath->setText(model->filePath(index));//返回节点的目录名或带路径的文件名ui->labType->setText(model->type(index));//返回描述节点类型的文字ui->labFileName->setText(model->fileName(index));//返回去除路径的文件夹名称或文件名int sz = model->size(index)/1024;//如果节点是文件,返回文件大小的字节数,如果节点是文件夹,返回0if(sz<1024) {ui->labSize->setText(QString("%1 KB").arg(sz));} else {ui->labSize->setText(QString::asprintf("%.1f MB", sz/1024.0));}
}
QStringListModel
QStringListModel用于处理字符串列表的数据模型,它可以作为QListView的数据模型,在界面上显示和编辑字符串列表。
图示

代码示例
QStringListModelDialog.h
#ifndef QSTRINGLISTMODELDIALOG_H
#define QSTRINGLISTMODELDIALOG_H#include <QDialog>
#include <QStringListModel>namespace Ui
{class QStringListModelDialog;
}class QStringListModelDialog : public QDialog
{Q_OBJECTpublic:explicit QStringListModelDialog(QWidget* parent = nullptr);~QStringListModelDialog();private slots:void on_pushButtonAdd_clicked();void on_pushButtonInsert_clicked();void on_pushButtonRemove_clicked();void on_pushButtonClear_clicked();void on_pushButtonShow_clicked();void on_listView_clicked(const QModelIndex& index);void on_pushButtonReset_clicked();void on_pushButtonClearText_clicked();private:Ui::QStringListModelDialog* ui;QStringListModel* model;
};#endif // QSTRINGLISTMODELDIALOG_H
QStringListModelDialog.cpp
#include "QStringListModelDialog.h"
#include "ui_QStringListModelDialog.h"
QStringListModelDialog::QStringListModelDialog(QWidget* parent): QDialog(parent), ui(new Ui::QStringListModelDialog)
{ui->setupUi(this);QStringList theStrList;theStrList<<"北京"<<"上海"<<"天津"<<"河北"<<"河南"<<"山东";model = new QStringListModel(this);//将一个字符串列表的内容作为数据模型的初始化数据内容model->setStringList(theStrList);ui->listView->setModel(model);//双击 或 选择并单击后进入编辑状态ui->listView->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::SelectedClicked);
}QStringListModelDialog::~QStringListModelDialog()
{delete ui;
}void QStringListModelDialog::on_pushButtonAdd_clicked()
{model->insertRow(model->rowCount());//在尾部插入一行QModelIndex index = model->index(model->rowCount()-1, 0);model->setData(index, "new item", Qt::DisplayRole);ui->listView->setCurrentIndex(index);//设置当前选中的行
}void QStringListModelDialog::on_pushButtonInsert_clicked()
{QModelIndex index = ui->listView->currentIndex();model->insertRow(index.row());model->setData(index, "inserted item", Qt::DisplayRole);ui->listView->setCurrentIndex(index);
}void QStringListModelDialog::on_pushButtonRemove_clicked()
{QModelIndex index = ui->listView->currentIndex();model->removeRow(index.row());
}void QStringListModelDialog::on_pushButtonClear_clicked()
{model->removeRows(0, model->rowCount());
}void QStringListModelDialog::on_pushButtonShow_clicked()
{QStringList tmpList = model->stringList();ui->plainTextEdit->clear();for(int i=0; i<tmpList.count(); i++) {ui->plainTextEdit->appendPlainText(tmpList.at(i));}
}void QStringListModelDialog::on_listView_clicked(const QModelIndex& index)
{ui->label->setText(QString::asprintf("current:row=%d,column=%d", index.row(), index.column()));
}void QStringListModelDialog::on_pushButtonReset_clicked()
{model->removeRows(0, model->rowCount());QStringList theStrList;theStrList<<"北京"<<"上海"<<"天津"<<"河北"<<"河南"<<"山东";model->setStringList(theStrList);
}void QStringListModelDialog::on_pushButtonClearText_clicked()
{ui->plainTextEdit->clear();
}
QStandardItemModel
QStandardItemModel是标准的以项数据为基础的标准数据模型类,通常与QTableView组合成Model/View结构。实现通用的二维数据的管理功能。
图示

代码示例
QStandardItemModelDialog.h
#ifndef QSTANDARDITEMMODELDIALOG_H
#define QSTANDARDITEMMODELDIALOG_H#include <QDialog>
#include <QLabel>#include <QStandardItemModel>
#include <QItemSelectionModel>
#define FixedColumnCount 6
namespace Ui
{class QStandardItemModelDialog;
}class QStandardItemModelDialog : public QDialog
{Q_OBJECTpublic:explicit QStandardItemModelDialog(QWidget* parent = nullptr);~QStandardItemModelDialog();void initModelFromStringList(QStringList& fFileContent);public slots:void on_currentChanged(const QModelIndex& current, const QModelIndex& previous);private slots:void on_pushButtonOpen_clicked();void on_pushButtonAdd_clicked();void on_pushButtonInsert_clicked();void on_pushButtonRemove_clicked();void on_pushButtonLeft_clicked();void on_pushButtonMid_clicked();void on_pushButtonRight_clicked();void on_pushButtonBold_clicked();void on_pushButtonSaveAs_clicked();private:Ui::QStandardItemModelDialog* ui;QStandardItemModel* model;QLabel* labCurFile;QLabel* labCellPos;QLabel* labCellText;QItemSelectionModel* theSelection;};#endif // QSTANDARDITEMMODELDIALOG_H
QStandardItemModelDialog.cpp
#include "QStandardItemModelDialog.h"
#include "ui_QStandardItemModelDialog.h"
#include <QAbstractItemView>
#include <QFileDialog>
#include <QTextStream>QStandardItemModelDialog::QStandardItemModelDialog(QWidget* parent): QDialog(parent), ui(new Ui::QStandardItemModelDialog)
{ui->setupUi(this);model = new QStandardItemModel(0, FixedColumnCount, this);theSelection = new QItemSelectionModel(model);connect(theSelection, SIGNAL(currentChanged(QModelIndex, QModelIndex)), this, SLOT(on_currentChanged(QModelIndex, QModelIndex)));ui->tableView->setModel(model);ui->tableView->setSelectionModel(theSelection);ui->tableView->setSelectionMode(QAbstractItemView::ExtendedSelection);ui->tableView->setSelectionBehavior(QAbstractItemView::SelectItems);
}QStandardItemModelDialog::~QStandardItemModelDialog()
{delete ui;
}void QStandardItemModelDialog::initModelFromStringList(QStringList& fFileContent)
{int rowCnt = fFileContent.count();model->setRowCount(rowCnt);QString header = fFileContent.at(0);//用一个或多个空白字符分隔 SkipEmptyParts函数会跳过任何空的部分QStringList headerList = header.split(QRegExp("\\s+"), QString::SkipEmptyParts);model->setHorizontalHeaderLabels(headerList);QStandardItem* item;QStringList tmpList;int j;for(int i=1; i<rowCnt; i++) {QString aLinText = fFileContent.at(i);tmpList = aLinText.split(QRegExp("\\s+"), QString::SkipEmptyParts);for(j=0; j<FixedColumnCount-1; j++) {item = new QStandardItem(tmpList.at(j));model->setItem(i-1, j, item);}item = new QStandardItem(headerList.at(j));item->setCheckable(true);if(tmpList.at(j) == "0") {item->setCheckState(Qt::Unchecked);} else {item->setCheckState(Qt::Checked);}model->setItem(i-1, j, item);}
}void QStandardItemModelDialog::on_currentChanged(const QModelIndex& current, const QModelIndex& previous)
{if(current.isValid()) {// labCellPos->setText(QString::asprintf("current: row=%d , col=%d", current.row(), current.column()));QStandardItem* item = model->itemFromIndex(current);// this->labCellText->setText("text:"+item->text());// QFont font = item->font();}
}void QStandardItemModelDialog::on_pushButtonOpen_clicked()
{QString curPath = QCoreApplication::applicationDirPath();QString aFileName = QFileDialog::getOpenFileName(this, u8"打开文件", curPath);if(aFileName.isEmpty()) {return;}QStringList fFileContent;QFile afile(aFileName);if(afile.open(QIODevice::ReadOnly |QIODevice::Text)) {QTextStream aStream(&afile);ui->plainTextEdit->clear();while(!aStream.atEnd()) {QString str = aStream.readLine();ui->plainTextEdit->appendPlainText(str);fFileContent.append(str);}afile.close();// labCurFile->setText("currentFile:"+aFileName);initModelFromStringList(fFileContent);}
}void QStandardItemModelDialog::on_pushButtonAdd_clicked()
{QList<QStandardItem*> itemList;QStandardItem* item;//不包含最后一列for(int i=0; i<FixedColumnCount-1; i++) {item = new QStandardItem("0");// item->setCheckable(true);itemList<<item;}QString str = model->headerData(model->columnCount()-1, Qt::Horizontal, Qt::DisplayRole).toString();item = new QStandardItem(str);item->setCheckable(true);itemList<<item;model->insertRow(model->rowCount(), itemList);QModelIndex curIndex = model->index(model->rowCount()-1, 0);theSelection->clearSelection();theSelection->setCurrentIndex(curIndex, QItemSelectionModel::Select);
}void QStandardItemModelDialog::on_pushButtonInsert_clicked()
{QList<QStandardItem*> itemList;QStandardItem* item;//不包含最后一列for(int i=0; i<FixedColumnCount-1; i++) {item = new QStandardItem("0");// item->setCheckable(true);itemList<<item;}QString str = model->headerData(model->columnCount()-1, Qt::Horizontal, Qt::DisplayRole).toString();item = new QStandardItem(str);item->setCheckable(true);itemList<<item;QModelIndex curIndex = theSelection->currentIndex();int curRow = curIndex.row();model->insertRow(curRow, itemList);curIndex = model->index(curRow, 0);theSelection->clearSelection();theSelection->setCurrentIndex(curIndex, QItemSelectionModel::Select);
}void QStandardItemModelDialog::on_pushButtonRemove_clicked()
{QModelIndex curIndex = theSelection->currentIndex();if(curIndex.row() == model->rowCount()-1) {model->removeRow(curIndex.row());} else {model->removeRow(curIndex.row());theSelection->setCurrentIndex(curIndex, QItemSelectionModel::Select);}
}void QStandardItemModelDialog::on_pushButtonLeft_clicked()
{if(!theSelection->hasSelection()) {return;}QModelIndexList selectedIndex = theSelection->selectedIndexes();for(int i=0; i<selectedIndex.count(); i++) {QModelIndex aIndex = selectedIndex.at(i);QStandardItem* item = model->itemFromIndex(aIndex);item->setTextAlignment(Qt::AlignLeft);}
}void QStandardItemModelDialog::on_pushButtonMid_clicked()
{if(!theSelection->hasSelection()) {return;}QModelIndexList selectedIndex = theSelection->selectedIndexes();for(int i=0; i<selectedIndex.count(); i++) {QModelIndex aIndex = selectedIndex.at(i);QStandardItem* item = model->itemFromIndex(aIndex);item->setTextAlignment(Qt::AlignCenter);}
}void QStandardItemModelDialog::on_pushButtonRight_clicked()
{if(!theSelection->hasSelection()) {return;}QModelIndexList selectedIndex = theSelection->selectedIndexes();for(int i=0; i<selectedIndex.count(); i++) {QModelIndex aIndex = selectedIndex.at(i);QStandardItem* item = model->itemFromIndex(aIndex);item->setTextAlignment(Qt::AlignRight);}
}void QStandardItemModelDialog::on_pushButtonBold_clicked()
{if(!theSelection->hasSelection()) {return;}QModelIndexList selectedIndex = theSelection->selectedIndexes();for(int i=0; i<selectedIndex.count(); i++) {QModelIndex aIndex = selectedIndex.at(i);QStandardItem* item = model->itemFromIndex(aIndex);QFont font = item->font();font.setBold(Qt::Checked);item->setFont(font);}
}void QStandardItemModelDialog::on_pushButtonSaveAs_clicked()
{QString curPath = QCoreApplication::applicationDirPath();QString aFileName = QFileDialog::getSaveFileName(this, u8"选择一个文件", curPath);if(aFileName.isEmpty()) {return;}QFile file(aFileName);if(!(file.open(QIODevice::ReadWrite | QIODevice::Text| QIODevice::Truncate))) {return;}QTextStream aStream(&file);QStandardItem* item;int i, j;QString str;ui->plainTextEdit->clear();for(int i=0; i<model->columnCount(); i++) {item = model->horizontalHeaderItem(i);str = str +item->text()+"\t\t";}aStream<<str<<"\n";ui->plainTextEdit->appendPlainText(str);for(i=0; i<model->rowCount(); i++) {str="";for(j=0; j<model->columnCount()-1; j++) {item = model->item(i, j);str=str+item->text()+QString::asprintf("\t\t");}item = model->item(i, j);if(item->checkState() == Qt::Checked) {str = str+"1";} else {str = str+"0";}ui->plainTextEdit->appendPlainText(str);aStream<<str<<"\n";}
}
自定义代理
QAbstractItemDelegate是所有代理类的抽象基类,QStyledItemDelegate是视图组件使用的缺省的代理类,QItemDelegate也是类似功能的类。
QStyledItemDelegate和QItemDelegate的差别在于前者可以使用样式表设置来绘制组件,因此建议使用QStyledItemDelegate作为自定义代理类组件的基类。
无论从QStyledItemDelegate还是QItemDelegate继承设计自定义代理组件,都会必须实现这四个函数。
- createEditor:创建用于编辑模型数据的widget组件,如QSpinBox组件;
- setEditorData:从数据模型获取数据,供widget组件进行编辑;
- setModelData:将widget上的数据更新到数据模型;
- updateEditorGeometry:用于给widget组件设置一个合适的大小;
详见我之前一段时间所写的文章 文章地址
相关文章:
【嵌入式——QT】Model/View
【嵌入式——QT】Model/View 基本原理数据模型视图组件代理Model/View结构的一些概念QFileSystemModelQStringListModelQStandardItemModel自定义代理 基本原理 GUI应用程序的一个很重要的功能是由用户在界面上编辑和修改数据,典型的如数据库应用程序,数…...
向量化编程书籍推荐
文章目录 1. 书籍清单 1. 书籍清单 《Linear Algebra and Its Applications》 by Gilbert Strang 这本书是线性代数的经典教材,线性代数是向量化编程的基础。它涵盖了向量、矩阵、线性变换等内容,对理解向量化编程的数学概念非常有帮助《NumPy Beginner…...
算法D43 | 动态规划5 | 1049. 最后一块石头的重量 II 494. 目标和 474.一和零
1049. 最后一块石头的重量 II 本题就和 昨天的 416. 分割等和子集 很像了,可以尝试先自己思考做一做。 视频讲解:动态规划之背包问题,这个背包最多能装多少?LeetCode:1049.最后一块石头的重量II_哔哩哔哩_bilibili 代…...
设计模式—桥接模式
定义: 桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interfce)模式。 本章代码:小麻雀icknn/设计模式练习 - Gitee.com 结构: 抽象化(Abstraction)角色:…...
伊萨卡训练代码
我们建议创建并激活 conda 环境,以确保在下面安装正确的软件包版本的干净环境。 # Optional but recommended: conda create -n ithaca python3.9 conda activate ithaca 克隆此存储库并进入其根目录。通过以下方式安装完整的 ithaca 依赖项(包括训练&am…...
视频产品介绍:AS-VCVR-N多协议视频接入网关
目 录 一、产品概述 (一)非标设备接入 (二)信令流转换 (三)媒体流转发 二、网关特性 三、技术参数 一、产品概述 视频接入网关服务是终端用户与视频源的传输枢纽,实现把前端不同…...
大型网站架构演化总结
本文图解大型网站架构演化。 目录 1、单一应用服务阶段 2、应用与数据服务分离阶段 3、利用缓存提高性能阶段 4、应用服务集群阶段 5、数据库读写分离阶段 6、反向代理与CDN加速阶段 7、分布式数据库阶段 8、 NoSQL与搜索引擎阶段 9、业务拆分阶段 10、分布式服务阶…...
5G智能制造纺织工厂数字孪生可视化平台,推进纺织行业数字化转型
5G智能制造纺织工厂数字孪生可视化平台,推进纺织行业数字化转型。纺织工业作为传统制造业的重要组成部分,面临着转型升级的紧迫需求。随着5G技术的快速发展,智能制造成为纺织工业转型升级的重要方向。数字孪生可视化平台作为智能制造的核心技…...
仿牛客网项目---Elasticsearch分布式搜索引擎
1.什么是ElasticSearch分布式搜索引擎? Elasticsearch是一个开源的分布式搜索引擎,提供实时的、高可用性的搜索和分析解决方案。它支持快速索引和搜索大规模数据,具有分布式架构、RESTful API、基于JSON的查询语言等功能,适用于各…...
macbook pro 2018 安装 arch linux 双系统
文章目录 友情提醒关于我的 mac在 mac 上需要提前做的事情复制 wifi 驱动 在 linux 上的操作还原 wifi 驱动连接 wifi 网络磁盘分区制作文件系统挂载分区 使用 archinstall 来安装 arch linux遗留问题 友情提醒 安装 archl linux 的时候,mac 的键盘是没法用的&#…...
虚拟机安装CentOS教学,超详细一步安装到底!
首先将Centos的镜像文件进行下载,随后再进行安装配置: https://mirrors.tuna.tsinghua.edu.cn/centos-vault/7.8.2003/isos/x86_64/CentOS-7-x86_64-DVD-2003.iso 1.打开VMware,新建虚拟机,选择典型安装,点击下一步 2.选择稍…...
“2024杭州智慧城市及安防展会”将于4月在杭州博览中心盛大召开
2024杭州国际智慧城市及安防展览会,将于4月24日在杭州国际博览中心盛大开幕。这场备受瞩目的盛会,不仅汇集了全球智慧城市与安防领域的顶尖企业,更是展示最新技术、交流创新理念的重要平台。近日,从组委会传来消息,展会…...
【C++庖丁解牛】模拟实现STL的string容器(最后附源码)
📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 目录 1.vs和g下string结构…...
不要在代码中随便使用try...catch了
前言 📫 大家好,我是南木元元,热爱技术和分享,欢迎大家交流,一起学习进步! 🍅 个人主页:南木元元 目录 背景 js中的try...catch try...catch运行机制 js的事件循环机制 try...c…...
网络编程(3/6)
使用C语言完成数据库的增删改 #include<myhead.h> int do_add(sqlite3 *ppDb) {int numb;char name[50];int salary;printf("请输入员工信息:工号、姓名、薪水\n");scanf("%d %s %d",&numb,name,&salary);char sql[128];char *e…...
(day 2)JavaScript学习笔记(基础之变量、常量和注释)
概述 这是我的学习笔记,记录了JavaScript的学习过程,我是有一些Python基础的,因此在学习的过程中不自觉的把JavaScript的代码跟Python代码做对比,以便加深印象。我本人学习软件开发纯属个人兴趣,大学所学的专业也非软件…...
Spring Boot中全局异常处理器
文章目录 1.Spring Boot中两种异常处理方式2.为什么需要全局异常处理呢?3. 全局异常处理器测试4.ControllerAdvice 详解5.ExceptionHandler 详解 1.Spring Boot中两种异常处理方式 要想解决测试中存在的问题,我们需要对程序中可能出现的异常进行捕获&am…...
【JAVA重要知识 | 第七篇】Java异常知识总结(声明、抛出、捕获异常)
7.Java异常知识总结(声明、抛出、捕获异常) 7.1异常定义 在程序运行过程中,如果JVM检测出一个不可能执行的操作时,就会出现运行时错误(runtime error)。在Java中,运行时错误会作为异常抛出。异…...
SSM整合项目(Vue3环境搭建)
SSM整合项目(Vue3环境搭建) 1.下载node.js 1.卸载原来的node.js 2.检测是否卸载成功 3.下载node.js(10.16.3) 一路next就可以 4.检测是否安装成功 2.全局安装Vue插件cli 命令行输入 npm install -g vue/cli 3.新建Vue项目 1.…...
Golang 方法的接收器 receiver 指针和值的区别
一、如果receiver是指针类型 package mainimport "fmt"type Count struct {count int }func main() {c : Count{count: 0}c.incr()fmt.Println(c.count)c2 : &cc2.incr()fmt.Println(c2.count) }func (c *Count) incr() {c.count }//打印结果 1 2 incr 方法的 …...
Spring with AI (): 搜索扩展——向量数据库与RAG(上)劳
先回顾:三次握手(建立连接)核心流程(实际版) 为了让挥手流程衔接更顺畅,咱们先快速回顾三次握手的实际核心,避免上下文脱节: 第一步(客户端→服务器)&#…...
HY-Motion 1.0避坑指南:写好Prompt指令,轻松生成高质量3D动画
HY-Motion 1.0避坑指南:写好Prompt指令,轻松生成高质量3D动画 你是不是也遇到过这种情况:兴冲冲地打开HY-Motion 1.0,输入一段文字,结果生成的3D动画要么动作僵硬,要么干脆跑偏,完全不是你想要…...
C# 面试高频题:装箱和拆箱是如何影响性能的?负
OCP原则 ocp指开闭原则,对扩展开放,对修改关闭。是七大原则中最基本的一个原则。 依赖倒置原则(DIP) 什么是依赖倒置原则 核心是面向接口编程、面向抽象编程, 不是面向具体编程。 依赖倒置原则的目的 降低耦合度&#…...
如何用Python实现剪映自动化:告别重复剪辑的3步解决方案
如何用Python实现剪映自动化:告别重复剪辑的3步解决方案 【免费下载链接】JianYingApi Third Party JianYing Api. 第三方剪映Api 项目地址: https://gitcode.com/gh_mirrors/ji/JianYingApi 还在为每天重复的视频剪辑工作感到疲惫吗?想象一下&am…...
Motrix WebExtension快速上手:浏览器下载管理终极解决方案
Motrix WebExtension快速上手:浏览器下载管理终极解决方案 【免费下载链接】motrix-webextension A browser extension for the Motrix Download Manager and its forks 项目地址: https://gitcode.com/gh_mirrors/mo/motrix-webextension 还在为浏览器下载速…...
SITS2026上线倒计时48小时:我们如何用轻量级MoE替代全量微调,在边缘GPU集群实现多模态搜索QPS翻4倍且成本降63%?
第一章:SITS2026案例:AI原生电商平台实践 2026奇点智能技术大会(https://ml-summit.org) SITS2026是面向下一代电商基础设施的AI原生平台原型,由阿里巴巴达摩院与浙江大学联合研发,在2026奇点智能技术大会上首次全栈开源。该平台…...
WordPress 站长自查手册:手把手教你用 WPScan 给自己的网站做一次免费“安全体检”
WordPress 站长安全自查指南:用 WPScan 给网站做专业级体检 作为 WordPress 站长,你是否经常担心网站存在安全隐患却无从下手?就像定期体检能预防疾病一样,网站也需要定期安全检查。WPScan 就是专为 WordPress 设计的"体检仪…...
惠普ZBook 15 G2黑苹果双屏实战:EDID提取+Clover注入保姆级教程(附亮度调节技巧)
惠普ZBook 15 G2黑苹果双屏配置全解析:从EDID提取到亮度优化 当专业用户尝试在惠普ZBook 15 G2上实现黑苹果双屏输出时,往往会遇到内屏无法正常管理的问题。这不仅影响工作效率,还会导致不必要的电量消耗和屏幕损耗。本文将深入探讨一套完整的…...
科技向善:我们可以用技术为社会做些什么?
科技向善:我们可以用技术为社会做些什么? 在数字化浪潮席卷全球的今天,科技已不仅仅是提升效率的工具,更成为推动社会进步的重要力量。从人工智能到大数据,从区块链到物联网,技术的快速发展为人类生活带来…...
UniversalSplitScreen:为任意游戏实现分屏多人游戏的技术解析与实战指南
UniversalSplitScreen:为任意游戏实现分屏多人游戏的技术解析与实战指南 【免费下载链接】UniversalSplitScreen Split screen multiplayer for any game with multiple keyboards, mice and controllers. 项目地址: https://gitcode.com/gh_mirrors/un/Universal…...
