QT数据库SQLite:QsqlTableModel使用总结
数据库连接、数据模型与界面组件所涉及的类之间的关系如下所示:
数据库类
QSqlDatabase 类用于建立与数据库的连接,QSqlDatabase 对象就表示这种连接。QSqlDatabase 类的功能主要分为三大部分:
1、创建数据库连接,即创建 QSqlDatabase 对象,加载指定类型的数据库驱动。
静态函数 QSqlDatabase::addDatabase()创建 QSqlDatabase 对象:
QSqlDatabase QSqlDatabase::addDatabase(const QString &type,
const QString &connectionName = QLatin1String(defaultConnection))
参数 type 是要连接的数据库类型:
如“QSQLITE”就是指 SQLite 数据库,参数 connectionName 是所创建的数据库连接的名称,如
果不设置这个参数,就采用应用程序默认的数据库连接。使用函数 addDatabase()创建 QSqlDatabase 对象时只是设置了驱动程序名称,设置的 connection Name 会被自动添加到应用程序的数据库连接名称列表。如果成功创建 QSqlDatabase 对象,QSqlDatabase 的函数 isValid()会返回 true。一个 QSqlDatabase 对象用于表示一个数据库连接,一个应用程序里可以创建多个 QSqlDatabase 对象,它们可分别连接一个数据库。使用静态函数 QSqlDatabase::connectionNames()返回应用程序里所有已 创建的数据库连接名称列表。如果一个应用程序里有多个数据库连接,可以使用静态函数 QSqlDatabase::database()通过 connectionName 来引用其中的某个数据库连接。
2、打开数据库,设置需要连接的数据库具体参数,例如数据库名称、用户名、用户密码等,
然后打开数据库。只有打开数据库之后,才可以进行数据查询和修改等操作。
运行函数 QSqlDatabase::addDatabase()只是加载了数据库驱动,创建了数据 库连接,还需要用 QSqlDatabase 的函数 open()打开一个具体的数据库。设置好连接数据库参数后,用函数 open()打开数据库,如果 open()的返回值为 true,表示成功打开数据库。若要关闭数据库,则要使用函数 close()。
3、对数据库进行事务(transaction)操作,获取数据库的一些信息。
bool MainWindow::openDatabase(QString aFile)
{DB=QSqlDatabase::addDatabase("QSQLITE","Database1"); //添加 SQLITE数据库驱动DB.setDatabaseName(aFile); //设置数据库名称if (!DB.open()) //打开数据库失败return false;else{openTable(); //打开数据表return true;}
}
QSqlTableModel 是一个模型类,它与数据库中的一个数据表关联后就作为该数据表的模型。
QSqlTableModel 类的构造函数定义如下:
QSqlTableModel(QObject *parent = nullptr, const QSqlDatabase &db = QSqlDatabase())
创建 QSqlTableModel 对象时需要指定数据库连接,也就是设置一个 QSqlDatabase 对象。如果
不指定数据库连接,就使用应用程序的默认数据库连接。还需要使用 QSqlTableModel 的 setTable()函数设置需要连接的数据表。
函数 select()。这个函数的作用是根据当前设置的排序和过滤规则从数据表查询数据并将 其刷新到数据模型。在使用函数 setTable()设置数据表之后,还需要运行函数 select()才能将数据刷 新到模型。函数 select()的返回值若为 true,则表示数据查询操作成功;若为 false,则表示操作失 败,可以通过函数 lastError()获取错误信息。
tabModel=new QSqlTableModel(this,DB); //数据模型tabModel->setTable("employee"); //设置数据表tabModel->setEditStrategy(QSqlTableModel::OnManualSubmit); //数据保存方式,OnManualSubmit , OnRowChangetabModel->setSort(tabModel->fieldIndex("empNo"),Qt::AscendingOrder); //排序if (!(tabModel->select())) //查询数据失败{QMessageBox::critical(this, "错误信息","打开数据表错误,错误信息:\n"+tabModel->lastError().text());return;}
建立View组件与model的模型/视图
为一个 QTableView 组件设置一个 QSqlTableModel 模型后,它们就组成模型/视图结构,可以
显示和编辑数据表的数据。还可以为 QSqlTableModel 模型设置一个 QItemSelectionModel 对象作
为选择模型。在 QTableView 组件中可以使用自定义代理。
//Model/View结构ui->tableView->setModel(tabModel); //设置数据模型selModel=new QItemSelectionModel(tabModel,this); //关联选择模型ui->tableView->setSelectionModel(selModel); //设置选择模型
建立界面组件与Model的映射
QDataWidgetMapper 类对象要设置一个 QSqlTableModel 模型,然后将数据表的某个字段与界面
上某个组件建立映射,界面组件就可以自动显示这个字段的数据,成为数据感知(data-aware)组件。这样这些界面组件就会自动显示关联字段的数据,并且在组件中修改数据后可以提交到模型。
一般的数值、字符串、备注等类型的字段可以用 QSpinBox、QLineEdit、QPlainTextEdit 等界
面组件作为数据感知组件,但是 BLOB 类型的字段不能直接与某个界面组件建立映射。如图片数据信息,需要单独编写代码实现图片的显示、导入和清除等操作。
QDataWidgetMapper::AutoSubmit:自动提交。当一个界面组件失去输入焦点时,所进行的
修改自动提交到模型。
QDataWidgetMapper 对象指向数据模型的某一行记录并将其作为当前行,函数 currentIndex()
返回当前行号,函数 setCurrentIndex()可以设置当前行号,toFirst()、toPrevious()、toNext()和 toLast() 函数可以移动当前行。QDataWidgetMapper 对象的当前行变化时,设置了映射字段的界面组件会 自动更新显示当前记录的数据
//创建界面组件与数据模型的字段之间的数据映射dataMapper= new QDataWidgetMapper(this);dataMapper->setModel(tabModel); //设置数据模型dataMapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit); //数据更新方式//界面组件与数据模型的具体字段之间的联系dataMapper->addMapping(ui->dbSpinEmpNo,tabModel->fieldIndex("empNo"));dataMapper->addMapping(ui->dbEditName,tabModel->fieldIndex("Name"));dataMapper->addMapping(ui->dbComboSex,tabModel->fieldIndex("Gender"));dataMapper->addMapping(ui->dbEditBirth,tabModel->fieldIndex("Birthday"));dataMapper->addMapping(ui->dbComboProvince,tabModel->fieldIndex("Province"));dataMapper->addMapping(ui->dbComboDep,tabModel->fieldIndex("Department"));dataMapper->addMapping(ui->dbSpinSalary,tabModel->fieldIndex("Salary"));dataMapper->addMapping(ui->dbEditMemo,tabModel->fieldIndex("Memo"));dataMapper->toFirst(); //移动到首记录
界面的数据表格上点击 单元格,使数据模型 tabModel 的当前记录发生变化时,dataMapper 的当前行并不会自动变化。因此如果要确保视图组件 tableView 中的当前行和数据映射对象 dataMapper 的当前行是一致,在修改currentIndex发生变化时候,需要使用以下来更新
dataMapper->setCurrentIndex(current.row()); //更新数据映射的行号
设置字段显示的标题
函数 fieldIndex()。这个函数根据字段名称返回字段的序号。若字段不存在,则返回-1。使用时注意要与数据库的表格字段一致,以防找不到字段
函数 setHeaderData()。这个函数用于设置一个字段的表头数据,一般用于设置字段的显示标题。
bool QSqlQueryModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole)
其中,section 是字段序号;orientation 是方向,对于字段就是 Qt::Horizontal;value 是需要设置的数据;role 是数据的角色,默认为 Qt::EditRole。如果不进行表头设置,在 QTableView 组件里显示表格数据时,会将字段名作为表头。
tabModel->setHeaderData(tabModel->fieldIndex("empNo"), Qt::Horizontal, "工号");tabModel->setHeaderData(tabModel->fieldIndex("Name"), Qt::Horizontal, "姓名");tabModel->setHeaderData(tabModel->fieldIndex("Gender"), Qt::Horizontal, "性别");tabModel->setHeaderData(tabModel->fieldIndex("Birthday"), Qt::Horizontal, "出生日期");tabModel->setHeaderData(tabModel->fieldIndex("Province"), Qt::Horizontal, "省份");tabModel->setHeaderData(tabModel->fieldIndex("Department"), Qt::Horizontal, "部门");tabModel->setHeaderData(tabModel->fieldIndex("Salary"), Qt::Horizontal, "工资");tabModel->setHeaderData(tabModel->fieldIndex("Memo"),Qt::Horizontal,"备注");tabModel->setHeaderData(tabModel->fieldIndex("Photo"),Qt::Horizontal,"照片");
获取记录的字段
QSqlRecord 类记录了数据表的字段信息和一条记录的数据内容,QSqlTableModel 有两种参数
形式的函数 record()可以返回一条记录。
QSqlRecord QSqlTableModel::record() //返回字段定义
QSqlRecord QSqlTableModel::record(int row) //返回字段定义和数据
不带有参数的函数 record()返回的一个 QSqlRecord 对象只有记录的字段定义,没有各字段的
数据,一般用于获取一个数据表的字段定义。带有参数的函数 record()返回行号为 row 的记录,包括记录的字段定义和数据。
//获取所有字段名称
void MainWindow::getFieldNames()
{QSqlRecord emptyRec=tabModel->record(); //获取空记录,只有字段名for (int i=0;i<emptyRec.count();i++)ui->comboFields->addItem(emptyRec.fieldName(i));
}
添加-修改-插入-删除项
insertRecord() 用于添加或插入记录,函数 setRecord()用于修改记录,删除记录使用的是函数 removeRow()。
在插入记录时,即使是必填字段(例如 Name 字段)没有被赋值,程序也不会出错,因为我们设置的数据模型 tabModel 的编辑策略是 OnManualSubmit。但是在保存修改到数据库时,如果必填字段没有设置数据,则会出现错误。
void MainWindow::on_actRecAppend_triggered()
{//添加一条记录使用QSqlRecordQSqlRecord rec=tabModel->record(); //获取一个空记录,只有字段定义rec.setValue(tabModel->fieldIndex("empNo"),2000+tabModel->rowCount());rec.setValue(tabModel->fieldIndex("Gender"),"男"); //设置数据tabModel->insertRecord(tabModel->rowCount(),rec); //插入到数据模型的最后selModel->clearSelection();QModelIndex curIndex=tabModel->index(tabModel->rowCount()-1,1); //创建最后一行的ModelIndexselModel->setCurrentIndex(curIndex,QItemSelectionModel::Select);showRecordCount();项数据模型操作方式,功能相同,但是不符合数据库的操作习惯// tabModel->insertRow(tabModel->rowCount(),QModelIndex()); //在末尾添加一行// QModelIndex curIndex=tabModel->index(tabModel->rowCount()-1,1); //创建最后一行的ModelIndex// theSelection->clearSelection(); //清空选择项// theSelection->setCurrentIndex(curIndex,QItemSelectionModel::Select); //设置刚插入的行为当前行// int currow=curIndex.row(); //获得当前行编号// tabModel->setData(tabModel->index(currow,tabModel->fieldIndex("empNo")),// 2000+tabModel->rowCount()); //自动生成编号// tabModel->setData(tabModel->index(currow,tabModel->fieldIndex("Gender")),"男"); //必填字段,需要赋值// showRecordCount();// 插入行时设置缺省值,需要在primeInsert()信号里去处理
}void MainWindow::on_actRecInsert_triggered()
{//插入一条记录使用QSqlRecordQModelIndex curIndex=ui->tableView->currentIndex();QSqlRecord rec=tabModel->record(); //获取一个空记录,只有字段定义tabModel->insertRecord(curIndex.row(),rec); //在当前行前面插入一条记录selModel->clearSelection();selModel->setCurrentIndex(curIndex,QItemSelectionModel::Select); //设置当前行showRecordCount();//项数据模型操作方式,功能相同,但是不符合数据库的操作习惯// QModelIndex curIndex=ui->tableView->currentIndex(); //当前行的模型索引// tabModel->insertRow(curIndex.row(),QModelIndex()); //插入一行// theSelection->clearSelection(); //清除已有选择// theSelection->setCurrentIndex(curIndex,QItemSelectionModel::Select); //选择新插入的一行// showRecordCount();}void MainWindow::on_actRecDelete_triggered()
{//删除当前记录QModelIndex curIndex=selModel->currentIndex(); //获取当前选择单元格的模型索引tabModel->removeRow(curIndex.row()); //删除当前行showRecordCount();
}
保存或取消修改
数据模型 tabModel 的编辑策略为 OnManualSubmit时,即手动提交 修改。当数据模型的数据被修改后,不管是直接修改字段值,还是插入或删除记录,在未提交修改前, tabModel->isDirty()函数都返回 true。保存会将所有对Model进行的增删改同步到数据库.db文件中,取消会撤销对model的增删改操作。
函数 submitAll()用于将数据模型所有未提交的修改保存到数据库,函数 revertAll()取消所有修
改。调用 submitAll()保存数据时如果失败,可以通过函数 lastError()获取错误的具体信息。
void MainWindow::on_actRevert_triggered()
{//取消修改tabModel->revertAll();ui->actSubmit->setEnabled(false);ui->actRevert->setEnabled(false);showRecordCount();
}void MainWindow::on_actSubmit_triggered()
{//保存修改bool res=tabModel->submitAll();if (!res)QMessageBox::information(this, "消息", "数据保存错误,错误信息\n"+tabModel->lastError().text());else{ui->actSubmit->setEnabled(false);ui->actRevert->setEnabled(false);}showRecordCount();
}
遍历数据记录
获取model的count后,使用record(i)即可遍历每一条记录,通过value函数访问每个字段对应的数据,便可遍历修改后保存。
void MainWindow::on_actScan_triggered()
{//涨工资,记录遍历if (tabModel->rowCount()==0)return;for (int i=0;i<tabModel->rowCount();i++){QSqlRecord aRec=tabModel->record(i); //获取一条记录float salary=aRec.value("Salary").toFloat();salary=salary*1.1;aRec.setValue("Salary",salary); //更新记录数据tabModel->setRecord(i,aRec); //更新记录}// 索引方式刷新记录,速度一样// float salary;// for (int i=0;i<tabModel->rowCount();i++)// {// salary=tabModel->data(tabModel->index(i,10)).toFloat();// salary=salary*1.1;// tabModel->setData(tabModel->index(i,10),salary);// }if (tabModel->submitAll())QMessageBox::information(this, "消息", "涨工资数据计算完毕");
}
记录排序
QSqlTableModel 模型里的记录可以按某个字段排序,对应 SQL 语句中的 ORDER BY 子句。
QSqlTableModel 有 setSort()和 sort()两个函数用于排序。
void QSqlTableModel::setSort(int column, Qt::SortOrder order) //设置排序条件
void QSqlTableModel::sort(int column, Qt::SortOrder order) //立刻排序
参数 column 表示排序字段的字段序号;参数 order 表示排序方式,可设置为升序(Qt::Ascending
Order)或降序(Qt::DescendingOrder)。
这两个函数稍有差别,函数 setSort()只是用于设置排序条件,需要再运行 select()函数才会刷
新数据模型的数据;函数 sort()则是用于根据设置的字段和排序方式直接排序并刷新数据模型,无
须调用 select()函数。
void MainWindow::on_comboFields_currentIndexChanged(int index)
{//选择字段进行排序if (ui->radioBtnAscend->isChecked())tabModel->setSort(index,Qt::AscendingOrder);elsetabModel->setSort(index,Qt::DescendingOrder);tabModel->select();
}void MainWindow::on_radioBtnAscend_clicked()
{//升序排序tabModel->setSort(ui->comboFields->currentIndex(),Qt::AscendingOrder);tabModel->select(); //setSort()之后需要执行select()才会刷新数据
}void MainWindow::on_radioBtnDescend_clicked()
{//降序排序tabModel->sort(ui->comboFields->currentIndex(),Qt::DescendingOrder);// tabModel->setSort(ui->comboFields->currentIndex(),Qt::DescendingOrder);// tabModel->select();
}
记录过滤
QSqlTableModel 的 setFilter()函数可设置记录过滤条件,该函数原型定义如下:
void QSqlTableModel::setFilter(const QString &filter)
字符串类型的参数 filter 是过滤条件,实际上就是 SELECT 语句里 WHERE 子句的条件。
运行 setFilter()函数后无须调用 select()函数就可以立即刷新记录,若要取消过滤,只需在
setFilter()函数里传递一个空字符串。
void MainWindow::on_radioBtnMan_clicked()
{tabModel->setFilter(" Gender='男' ");showRecordCount();
}void MainWindow::on_radioBtnWoman_clicked()
{tabModel->setFilter(" Gender='女' ");showRecordCount();
}void MainWindow::on_radioBtnBoth_clicked()
{tabModel->setFilter("");showRecordCount();
}
相关文章:
QT数据库SQLite:QsqlTableModel使用总结
数据库连接、数据模型与界面组件所涉及的类之间的关系如下所示: 数据库类 QSqlDatabase 类用于建立与数据库的连接,QSqlDatabase 对象就表示这种连接。QSqlDatabase 类的功能主要分为三大部分: 1、创建数据库连接,即创建 QSqlDat…...
服务器零配件
阵列卡 H3C电池 RAId 卡 内存条位置 HBA卡 MOC卡...
MySQL 学习 之 批量插入数据性能问题
文章目录 现象优化 现象 在使用 kettle 同步大数据的数据到我们的 MySQL 数据库中时发现,数据量大时插入效率很慢,大约在 2000/s 优化 在 MySQL 驱动连接中添加 rewriteBatchedStatementstrue 参数,减少 网络 IO DB IO 耗时 默认关闭指定…...
会话管理和身份验证和授权
Cookie、Session、Token Cookie 简介:[Cookie]是一种小型文本文件,由服务器发送到用户的浏览器并保存在用户的计算机上。其主要作用是识别用户身份、跟踪用户活动、保存用户设置等。Cookie通常由名称、值、域名、路径、过期时间等字段组成,并…...
RK3588 rknpu2/rkllm/rockit/mpp/rga 等源码验证
RK3588 简介 本项目基于rk3588硬件平台,将嵌入式、流媒体、AI等相关的技术验证源码地址 源码说明 buildroot 为buildroot使用方法dk_doc 为rk的文档mpp 在mpp例子上增加推流rga 为rk3588的硬件加速模块,可快速处理视频,提供的API接口与op…...
【CSS in Depth 2 精译_075】12.2 Web 字体简介 + 12.3 谷歌字体的用法
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第四部分 视觉增强技术 ✔️【第 12 章 CSS 排版与间距】 ✔️ 12.1 间距设置 12.1.1 使用 em 还是 px12.1.2 对行高的深入思考12.1.3 行内元素的间距设置 12.2 Web 字体 ✔️12.3 谷歌字体 ✔️12.…...
【数字花园】个人知识库网站搭建:①netlify免费搭建数字花园
目录 [[数字花园]]的构建原理包括三个步骤:五个部署方案教程相关教程使用的平台 步骤信息管理 这里记录的自己搭建数字花园(在线个人知识库)的经历,首先尝试的是网上普遍使用的方法,也就是本篇文章介绍的。 后面会继续…...
访问者模式的理解和实践
在软件开发过程中,设计模式为我们提供了解决常见问题的最佳实践。访问者模式(Visitor Pattern)是行为设计模式之一,它将数据操作与数据结构分离,使得在不修改数据结构的前提下,能够定义作用于这些元素的新的…...
SpringBoot中Selenium详解
文章目录 SpringBoot中Selenium详解一、引言二、集成Selenium1、环境准备1.1、添加依赖 2、编写测试代码2.1、测试主类2.2、页面对象2.3、搜索组件 三、使用示例四、总结 SpringBoot中Selenium详解 一、引言 在现代软件开发中,自动化测试是提高软件质量、减少重复…...
Android 系统应用重名install安装失败分析解决
Android 系统应用重名install安装失败分析解决 文章目录 Android 系统应用重名install安装失败分析解决一、前言1、Android Persistent apps 简单介绍 二、系统 persistent 应用直接安装需求分析解决1、系统应用安装报错返回的信息2、分析解决 三、其他1、persistent系统应用in…...
scala中如何解决乘机排名相关的问题
任务目标: 1.计算每个同学的总分和平均分 2.按总分排名,取前三名 3.按单科排名,取前三名 好的,我们可以用Scala来完成这个任务。下面是一个简单的示例代码,它将演示如何实现这些功能: // 假设我们有一个…...
常用的注解
RequestMapping 用于映射请求路径 可以添加在类或方法上 请求类型 请求类型包括GET、POST、PUT、DELETE等 默认支持GET和POST两种方式 简写:GetMapping、PostMapping、PutMapping、DeleteMapping PostMapping("/buy") 等价 RequestMapping("/buy&quo…...
移动应用渗透测试:确保通过测试的关键安全策略
无论您是为了维持合规性、保护敏感用户数据,还是维护品牌声誉,顺利通过渗透测试(Pen Test)都是至关重要的。为了帮助您轻松应对这一过程,有几个积极的安全措施可以帮助确保您的应用程序更加安全。 通过采用高级安全机…...
【Canvas与光阑】立方体六彩光阑
【成图】 120*120的png图标 大小图: 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>立方体 六彩光阑 Draft2</…...
【ArcGIS微课1000例】0135:自动生成标识码(长度不变,前面自动加0)
文章目录 一、加载实验数据二、BSM计算方法一、加载实验数据 加载专栏《ArcGIS微课实验1000例(附数据)》配套数据中0135.rar中的建筑物数据,如下图所示: 打开属性表,BSM为数据库中要求的字段:以TD_T 1066-2021《不动产登记数据库标准》为例: 计算出来的BSM如下图: 二、B…...
nginx文件上传下载控制
上传大小控制 client_max_body_size 设置最大客户端请求体大小 默认大小1M,可以使用在http, server, location块。 根据不同的请求路径设置不同的大小控制 server {listen 9001;client_max_body_size 2M;location / {root D:\\server\\nginx-1.22.0\\html\\9001;}locat…...
LabelImg使用教程
(yolov5scondaPython3123) D:\PyCharm20240724\20240724PyCharmProject>conda.bat deactivate D:\PyCharm20240724\20240724PyCharmProject>conda activate labelimg_env (labelimg_env) D:\PyCharm20240724\20240724PyCharmProject> labelimg 创建快捷键方式...
运维新手入门——KVM(Beginner‘s Guide to Operations and Maintenance - kvm)
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…...
Android 10.0 WiFi连接默认设置静态IP地址功能实现
1.前言 在10.0的系统rom定制化开发中,在定制化某些功能开发中,在wifi模块中,有产品需要要求设置wifi静态ip功能,而系统中wifi连接 后ip是动态的,每次开机后 连接wifi的ip就是不固定的,所以产品需要采用固定ip,就需要实现静态ip功能 2.WiFi连接默认设置静态IP地址功能实…...
ceph /etc/ceph-csi-config/config.json: no such file or directory
环境 rook-ceph 部署的 ceph。 问题 kubectl describe pod dragonfly-redis-master-0Warning FailedMount 7m59s (x20 over 46m) kubelet MountVolume.MountDevice failed for volume "pvc-c63e159a-c940-4001-bf0d-e6141634cc55" : rpc error: cod…...
windows C#-限制可访问性
属性或索引器的 get 和 set 部分称为访问器。 默认情况下,这些访问器具有与其所属属性或索引器相同的可见性或访问级别。不过,有时限制对其中某个访问器的访问是有益的。 通常,限制 set 访问器的可访问性,同时保持 get 访问器可公…...
Java-22 深入浅出 MyBatis - 手写ORM框架3 手写SqlSession、Executor 工作原理
点一下关注吧!!!非常感谢!!持续更新!!! 大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了: MyBatisÿ…...
【数据分享】1901-2023年我国省市县三级逐年最低气温数据(Shp/Excel格式)
之前我们分享过1901-2023年1km分辨率逐月最低气温栅格数据和Excel和Shp格式的省市县三级逐月最低气温数据,原始的逐月最低气温栅格数据来源于彭守璋学者在国家青藏高原科学数据中心平台上分享的数据!基于逐月栅格数据我们采用求年平均值的方法得到逐年最…...
AlphaPose、yolov8Pose、RTMPose进行对比
一、Alphapose 参考: https://blog.csdn.net/m0_45850873/article/details/123939849...
【Linux】文件系统
文章目录 Group中的组成部分inode tableinode bitmapdata blocksblock bitmapgroup descriptor tablesuper block 文件系统关于inode和blocksinode和block是如何映射的?12个直接映射一级间接索引二级间接索引三级间接索引 为什么访问文件的是inode,但是我…...
希迪智驾持续亏损8.2亿:毛利率下滑,冲刺“自动驾驶矿卡第一股”
《港湾商业观察》黄懿 近日,希迪智驾(湖南)股份有限公司(下称“希迪智驾”)向港交所主板递交上市申请,联席保荐人为中金公司、中信建投国际、中国平安资本(香港)。 资料显示&#…...
Python实现中国象棋
探索中国象棋 Python 代码实现:从规则逻辑到游戏呈现 中国象棋,这款源远流长的棋类游戏,承载着深厚的文化底蕴与策略智慧。如今,借助 Python 与 Pygame 库,我们能够在数字世界中复刻其魅力,深入探究代码背后…...
C++小碗菜之五:GDB调试工具
“程序员不是编写代码的人,而是调试错误的人。” – 约翰本尼斯(John Bennet) 目录 前言 在虚拟机中安装 GDB GDB调试的实战演练 创建示例代码 例子: 使用 GDB 调试 编译代码 启动 GDB 设置断点 运行程序 打印变量值 …...
机器学习干货笔记分享:朴素贝叶斯算法
朴素贝叶斯分类是一种十分简单的分类算法,即对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。 以判定外国友人为例做一个形象的比喻。 若我们走在街上看到一个黑皮肤的外…...
bug:uniapp运行到微信开发者工具 白屏 页面空白
1、没有报错信息 2、预览和真机调试都能正常显示,说明代码没错 3、微信开发者工具版本已经是win7能装的最高版本了,1.05版 链接 不打算回滚旧版本 4、解决:最后改调试基础库为2.25.4解决了,使用更高版本的都会报错,所…...
VBA API 概述 | 宏编程
注:本文为 “VBA API 概述 | 宏编程 | 执行速度慢” 相关文章合辑。 VBA API 详解 Office 二次开发于 2020-12-17 22:27:10 发布 Office 版本变动 在 Office 2010 之前,微软仅提供 32-bit 版本的 Office。而自 Office 2010 起,出现了 32-b…...
《九重紫》逐集分析鉴赏—序言、概览、框架分析
主标题:《九重紫》一起追剧吧副标题:《九重紫》逐集分析鉴赏—序言、概览、框架分析《永夜星河》后,以为要浅尝剧荒,一部《九重紫》突出重围。 看了宣传片感觉不是很差,看了部分剪辑感觉还可以,看了一两集感…...
《Vue进阶教程》第六课:computed()函数详解(上)
往期内容: 《Vue零基础入门教程》合集(完结) 《Vue进阶教程》第一课:什么是组合式API 《Vue进阶教程》第二课:为什么提出组合式API 《Vue进阶教程》第三课:Vue响应式原理 《Vue进阶教程》第四课&#…...
MFC案例:基于对话框的简易阅读器
一、功能目标: 1.阅读txt文件 2.阅读时可以调整字体及字的大小 3.打开曾经阅读过的文件时,能够自动从上次阅读结束的位置开始显示,也就是能够保存和再次使用阅读信息。 4.对于利用剪贴板粘贴来的文字能够存储成txt文件保存。 5.显示…...
Python+OpenCV系列:图像的运算
文章目录 PythonOpenCV系列:图像的加权和、覆盖1. 图像加权和(加权融合)2. 图像覆盖(区域叠加)3. 应用场景4. 总结 PythonOpenCV系列:图像的加权和、覆盖 在图像处理中,图像的加权和与覆盖是两…...
【Python】【Conda 】Conda vs venv:Python开发者的虚拟环境选择指南
目录 引言一、概述1.1 Conda 虚拟环境1.2 Python venv 虚拟环境 二、安装与设置2.1 安装 Conda 虚拟环境2.2 安装 Python venv 虚拟环境 三、依赖管理3.1 Conda 依赖管理3.2 Python venv 依赖管理 四、适用场景五、性能与资源占用5.1 Conda 性能与资源占用5.2 Python venv 性能…...
gitee仓库的使用
1、本地创建文件夹:比如H:\python-study\Djangogitee 2、在gitee上创建一个仓库,比如django-project 3、Git 全局设置: 在第一步创建的文件夹下,打开Git Bash(需要提前下载好Git工具),执行下面命令 git co…...
openjudge_简单英文题_33:Is It a Tree
题目 33:Is It a Tree 总时间限制: 1000ms 内存限制: 65536kB 描述 Given edges of a graph with N nodes. Check whether it is a tree. 输入 First line: one positive integers N (N < 100). Next N lines: an N*N 0/1 matrix A{a[i][j]}, indicating whether there ex…...
MyBatis-Plus 中 IdWorker.getId() 方法
前言 在分布式系统中,生成全局唯一标识符(ID)是一个常见的需求。MyBatis-Plus 提供了多种 ID 生成策略,其中基于 Twitter 的 Snowflake 算法实现的 IdWorker.getId() 方法因其高效性和适应分布式环境的特点而备受青睐。然而&…...
JAVA面试汇总(三)集合(一)
JAVA多线程七篇终于写完了,今天开始了新的JAVA面试汇总,集合部分,这部分其实比多线程有意思多了,这个计划最多五篇,也许不到五篇,这是第一篇,开卷。 1.Collection和Collections 的区别ÿ…...
zookeeper的安装
zookeeper的安装 一.前言 zookeeper开源组件是为分布式应用,提供协调服务的一种解决方案。本文主要是介绍在Centos7的操作系统中,如何以单机,伪集群,集群的方式来安装部署zookeeper服务。zookeeper要求的jdk版本为1.6以上。本文假…...
2025系统架构师(一考就过):选择题基础知识一
考点1:CPU、指令 真题1:CPU 执行算术运算或逻辑运算时,常将源操作数和结果暂存在(累加器(AC))中。 真题2:在程序的执行过程中,Cache与主存的地址映射是由(硬…...
线性dp—acwing
题目:数字三角形 898. 数字三角形 - AcWing题库 看某个点,是从那些路径过来的去分析 分析1: 代码1:(顺序正推,二维dp数组) #include<bits/stdc.h> using namespace std;const int N 5…...
【QT】:QT(介绍、下载安装、认识 QT Creator)
背景 🚀 在我们的互联网中的核心岗位主要有以下几种 开发(程序员)测试运维(管理机器)产品经理(非技术岗位,提出需求) 而我们这里主要关注的是开发方向,开发岗位又分很…...
GPIO在ZYNQ7000中的结构和相关寄存器解析
GPIO MASK DATA LSW和 MASK DATA MSW LSW和MSW分别是LSW (Least Significant Word)和MSW (Most Significant Word)。 因为DATA是u32,所以如果寄存器的基址是XGPIOPS_DATA_LSW_OFFSET,那么32位就能同时让高16位的MASK DATA MSW]31:16和 MASK DATA LSW的bit7同时为…...
Docker学习笔记
目录 1,Docker概述 I,虚拟机技术 虚拟机技术缺点 II,容器化技术 III,比较docker和虚拟机技术不同 Ⅳ,DevOps(开发,运维) 1,应用更快速的交付和部署 2,更编辑的升级和扩缩容 …...
皮带,传送带异物检测识别数据集,2345张图像,yolo,coco,voc标记三种格式的数据集整理
皮带,传送带异物检测识别数据集,2345张图像,yolo,coco,voc标记三种格式的数据集整理 数据集分割 训练组79% 1860图片 有效集14% 318图片 测试集7% 167图片 预处理 自动定向: 已应用 调…...
大模型qiming面试内容整理-技术能力评估
技术能力评估是大模型相关岗位面试中最重要的环节之一,主要考察候选人是否具备处理复杂机器学习问题、设计和优化模型的能力。以下是技术能力评估的具体内容和可能涉及的题目: 机器学习基础 ● 监督学习与无监督学习: ○ 理解基本的机器学习类型和模型:监督学习:如回归(线…...
前端成长之路:HTML(3)
在HTML中,有列表标签。列表最大的特点是整齐、简洁、有序,用列表进行布局会更加自由方便。根据使用的情景不同,可以将列表分为三大类:无序列表、有序列表和自定义列表。 无序列表 在HTML中使用<ul>标签定义一个无序列表&a…...
小程序给元素设置line-height为0引起页面更新无效
问题 在小程序中使用setData更新,数据更新完毕,页面却没有更新值,甚至出现渲染错乱现象; 发现 但当点击相应事件的时候,视图又更新了。 思考 开始认为是没有在dom渲染后进行数据更新产生的问题,换了方法执行…...