数据库【QSqlTableModel】

【QSqlTableModel】数据库的高级API

描述

QSqlTableModel是用于从单个表读取和写入数据库记录的高级接口。它构建在较低级别的QSqlQuery之上,可用于为视图类(如QTableView)提供数据。例如:

    QSqlTableModel *model = new QSqlTableModel;
    model->setTable("employee");
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    model->select();
    model->setHeaderData(0, Qt::Horizontal, tr("Name"));
    model->setHeaderData(1, Qt::Horizontal, tr("Salary"));

    QTableView *view = new QTableView;
    view->setModel(model);
    view->hideColumn(0); // don't show the ID
    view->show();

我们设置SQL表的名称和编辑策略,然后设置显示在视图标题中的标签。编辑策略规定了用户在视图中所做的更改实际应用于数据库的时间。可能的值有OnFieldChange、OnRowChange和OnManualSubmit。
QSqlTableModel也可以用于以编程方式访问数据库,而无需将其绑定到视图:

QSqlTableModel model;
    model.setTable("employee");
    model.select();
    int salary = model.record(4).value("salary").toInt();

上面的代码片段从来自employee的查询SELECT* 的结果集中的记录4中提取了salary字段。
可以使用setFilter()设置筛选器,也可以使用setSort()修改排序顺序。最后,您必须调用select()来用数据填充模型。
QSqlTableModel不直接支持外键。如果要解析foreign key,请使用QSqlRelationalTableModel和QSqlRelationalDelegate。
注:foreign key就是表与表之间的某种约定的关系,由于这种关系的存在,能够让表与表之间的数据,更加的完整,关联性更强。

tablemodel示例说明了如何使用QSqlTableModel作为QTableView的数据源。
实例如下:

成员类型的文档

enum QSqlTableModel::EditStrategy

枚举类型描述了当在数据库中编辑值时的选择策略。

目录Value描述
QSqlTableModel::OnFieldChange0模型所有的改变都立即应用到数据库中
QSqlTableModel::OnRowChange1当用户选择一个不同的行,行的更改将被应用
QSqlTableModel::OnManualSubmit2所有更改都将缓存在模型中,直到调用submitAll()或revertAll()为止。

为了防止在数据库中只插入部分初始化的行,对于新插入的行,OnFieldChange的行为将类似于OnRowChange。

成员函数

信号(signal)

QSqlTableModel::QSqlTableModel(QObject *parent = nullptr, QSqlDatabase db = QSqlDatabase())
//创建一个空的QSqlTableModel,并将父对象设置为父对象,将数据库连接设置为db。如果数据库无效,将使用默认的数据库连接。默认的编辑方法是OnRowChange.
void QSqlTableModel::beforeDelete(int row)
//在从当前活动的数据库表中删除行之前,deleteRowFromTable()会发出他的信号。
void QSqlTableModel::beforeInsert(QSqlRecord &record)
//在将新行插入当前活动的数据库表之前,insertRowIntoTable()会发出此信号。将要插入的值存储在记录中,并且可以在插入之前进行修改。
void QSqlTableModel::beforeUpdate(int row, QSqlRecord &record)
//在使用记录中的值更新当前活动数据库表中的行之前,updateRowInTable()会发出此信号。
//请注意,只有标记为已生成的值才会更新。生成的标志可以用QSqlRecord::setGenerated()设置,也可以用QSqlRecord::isGenerated()检查。
void QSqlTableModel::primeInsert(int row, QSqlRecord &record)
//当在当前活动数据库表的给定行中启动插入时,insertRows()会发出此信号。记录参数可以写入(因为它是一个引用),例如用默认值填充一些字段,并设置字段的生成标志。在处理此信号时,不要试图通过其他方式(如setData()或setRecord())编辑记录。
void QSqlTableModel::revert()重载虚函数
//当用户取消编辑当前行时,项代理将调用此重新实现的槽。
//如果模型的策略设置为OnRowChange或OnFieldChange,则还原更改。对OnManualSubmit策略没有任何作用。
//使用revertAll()恢复OnManualSubmit策略的所有挂起更改,或使用revertRow()恢复特定行。
void QSqlTableModel::revertAll()
//恢复所有挂起的更改。
bool QSqlTableModel::select()
//使用指定的筛选器和排序条件,使用通过setTable()设置的表中的数据填充模型,如果成功,则返回true;否则返回false。
bool QSqlTableModel::selectRow(int row)
//使用与主键值匹配的数据库表行中的值刷新模型中的行。如果没有主键,则所有列值都必须匹配。如果没有找到匹配的行,则模型将显示一个空行。如果成功,则返回true;否则返回false。
bool QSqlTableModel::submit()
//当用户停止编辑当前行时,项代理将调用此重新实现的槽。
//如果模型的策略设置为OnRowChange或OnFieldChange,则提交当前编辑的行。对OnManualSubmit策略没有任何作用。
//使用submitAll()提交OnManualSubmit策略的所有挂起的更改。
//成功时返回true;否则返回false。使用lastError()查询详细的错误信息。
//不会自动重新填充模型。提交的行在成功时从数据库中刷新。
bool QSqlTableModel::submitAll()
//提交所有挂起的更改,并在成功时返回true。错误时返回false,可以使用lastError()获取详细的错误信息。
//在OnManualSubmit中,成功后将重新填充模型。任何呈现它的视图都将丢失其选择。
//注意:在OnManualSubmit模式下,submitAll()失败时,不会从缓存中清除已提交的更改。这允许在不丢失数据的情况下回滚和重新提交事务。
void QSqlTableModel::clear() == void QSqlQueryModel::clear()
//清除模型并释放所有获取的资源
QVariant QSqlTableModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const
//返回特定的值,对于index和role,如果错误或者index溢出,返回无效的QVariant.
QSqlDatabase QSqlTableModel::database() const
//返回数据库的连接
bool QSqlTableModel::deleteRowFromTable(int row)
//从当前数据库表中删除给定的行
//这是一个直接在数据库上操作的低级方法,不应直接调用。使用removeRow()或removeRows()删除值。模型将根据其编辑策略决定何时修改数据库。
//如果行被删掉,返回true,其他返回false
QSqlTableModel::EditStrategy QSqlTableModel::editStrategy() const
//返回当前的编辑策略
int QSqlTableModel::fieldIndex(const QString &fieldName) const
//返回字段fileName的索引,如果模型中不存在相应的字段,则返回-1.
QString QSqlTableModel::filter() const
//返回当前设置的筛选器
Qt::ItemFlags QSqlTableModel::flags(const QModelIndex &index) const
//返回指定索引的项标志

QVariant QSqlTableModel::headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const
//返回标头中指定方向部分中给定角色的标头数据。
QModelIndex QSqlTableModel::indexInQuery(const QModelIndex &item) const
//返回模型中给定项的数据库结果集中值的索引。
//如果没有插入、删除或移动任何列或行,则返回值与item相同。
//如果item超出边界或item没有指向结果集中的值,则返回无效的模型索引。
bool QSqlTableModel::insertRecord(int row, const QSqlRecord &record)
//在位置行插入记录。如果row为负数,则将该记录追加到末尾。
//内部调用insertRows()和setRecord()。如果记录可以插入,则返回true,否则返回false。

bool QSqlTableModel::insertRowIntoTable(const QSqlRecord &values)
//将值插入到当前活动的数据库表中。这是一个直接在数据库上操作的低级方法,不应该直接调用。
//使用insertRow()和setdata)来插入值。模型将根据其编辑策略决定何时修改数据库。
//如果值可以插入,则返回true,否则返回false。可以使用lastError()检索错误信息。

bool QSqlTableModel::insertRows(int row, int count, const QModelIndex &parent = QModelIndex())
//插入行
bool QSqlTableModel::isDirty(const QModelIndex &index) const
//脏数据是数据表中存在错误、不一致或无效的数据行。会导致数据查询、分析和处理的不准确性和不稳定性。
//数据是否为脏数据
QString QSqlTableModel::orderByClause() const
//根据当前设置的排列顺序返回SQL ORDDER BY子句。
QSqlIndex QSqlTableModel::primaryKey() const
//返回当前表的主键,如果没有设置主键,则返回空QSQLIndex。
QSqlRecord QSqlTableModel::primaryValues(int row) const
//返回一条记录,该记录包含主键中表示的字段,并设置为第一行的值,如果没有定义主键,返回的记录将包含所有字段
QSqlRecord QSqlTableModel::record() const
//检索记录的字段名
QSqlRecord QSqlTableModel::record(int row)
//返回模型中第一行的记录,如果row是有效行的索引,则将使用该行的值填充记录
bool QSqlTableModel::removeColumns(int column, int count, const QModelIndex &parent = QModelIndex())
//从父模型中删除计数列,从索引列开始。返回列是否已成功删除;否则返回false。
bool QSqlTableModel::removeRows(int row, int count, const QModelIndex &parent = QModelIndex())
//移除行,从row开始的Count行
void QSqlTableModel::revertRow(int row)
//还原指定行的所有更改。
int QSqlTableModel::rowCount(const QModelIndex &parent = QModelIndex()) const
//返回行数
bool QSqlTableModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)
void QSqlTableModel::setEditStrategy(QSqlTableModel::EditStrategy strategy)
//将编辑数据库中值的策略设置为策略。这将恢复任何挂起的更改。

void QSqlTableModel::setFilter(const QString &filter)
//将当前过滤器设置为过滤。
//筛选器是一个不带关键字WHERE的SQL WHERE子句(例如,name='Josephine')。
//如果模型已经用数据库中的数据填充,则模型会使用新的过滤器重新选择它。否则,下次调用select()时将应用该筛选器。
void QSqlTableModel::setPrimaryKey(const QSqlIndex &key)
//受保护的方法,允许子类将主键设置为键。
//通常,无论何时调用setTable(),都会自动设置主索引。
void QSqlTableModel::setQuery(const QSqlQuery &query)

bool QSqlTableModel::setRecord(int row, const QSqlRecord &values)
//将值应用于模型中的行。源字段和目标字段是按字段名称映射的,而不是按记录中的位置映射的。
//请注意,值中生成的标志将被保留,以确定在将更改提交到数据库时是否使用相应的字段。默认情况下,对于QSqlRecord中的所有字段,它都设置为true。必须对值中的任何值使用setGenerated(false)将标志设置为false,才能将更改保存回数据库。
//对于编辑策略OnFieldChange和OnRowChange,只有当没有其他行具有缓存的更改时,行才能接收到更改。更改将立即提交。提交的更改在失败时不会恢复。
//如果可以设置所有值,则返回true;否则返回false。

void QSqlTableModel::setSort(int column, Qt::SortOrder order)
//设置要排序的列的排序顺序。这不会影响当前数据,要使用新的排序顺序刷新数据,请调用select()。
void QSqlTableModel::setTable(const QString &tableName)
//将模型操作的数据库表设置为tableName。不从表中选择数据,而是获取其字段信息。
//要用表的数据填充模型,请调用select()。
//可以使用lastError()检索错误信息。
void QSqlTableModel::sort(int column, Qt::SortOrder order)
//按照排序顺序按列对数据进行排序。这将立即选择数据,使用setSort()设置排序顺序,而不使用数据填充模型。

QString QSqlTableModel::tableName() 
//返回当前所选表的名称。
bool QSqlTableModel::updateRowInTable(int row, const QSqlRecord &values)
//使用指定的值更新当前活动数据库表中的给定行。如果成功,则返回true;否则返回false。
//这是一个直接在数据库上操作的低级方法,不应直接调用。使用setData()更新值。模型将根据其编辑策略决定何时修改数据库。
//请注意,只有设置了生成标志的值才会更新。
//生成的标志可以用QSqlRecord::setGenerated()设置,也可以用QSqlRecord::isGenerated(()测试。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言中常用的文件操作

本文将介绍常用的关于文件操作函数,如fopen,fclose,fread,fwrite,feek,ftell,rewind以及feof和ferror等文件操作操作函数,还介绍一些用于所有输入输出流的函数如fgetc,fputc,fgets,fputs,fprintf,fscanf等函数,还介绍了sscanf,sprintf函数,fe…

【C++初阶】之类和对象(中)

【C初阶】之类和对象(中) ✍ 类的六个默认成员函数✍ 构造函数🏄 为什么需要构造函数🏄 默认构造函数🏄 为什么编译器能自动调用默认构造函数🏄 自己写的构造函数🏄 构造函数的特性 ✍ 拷贝构造…

原型链-(前端面试 2024 版)

来讲一讲原型链 原型链只存在于函数之中 四个规则 1、引用类型,都具有对象特性,即可自由扩展属性。 2、引用类型,都有一个隐式原型 __proto__ 属性,属性值是一个普通的对象。 3、引用类型,隐式原型 __proto__ 的属…

Java官网64位下载:获取高效、安全的Java平台

Java官网64位下载:获取高效、安全的Java平台 Java是一种广泛应用于软件开发和跨平台应用程序的编程语言。无论是开发桌面应用程序、移动应用程序还是大型企业级系统,Java都是一种可靠且强大的选择。为了确保你获取到高效、安全的Java平台,本文…

supervision CV视觉可视化辅助工具

参考: https://supervision.roboflow.com/latest/ https://github.com/roboflow/supervision/tree/develop/examples 版本: pip install -U supervisionultralytics-8.1.35 (大于8.1才行,不然可能会有错误AttributeError: ‘Res…

第5章.零、单例与小样本提示词的编写之道

零提示、单个提示和小样本提示是用于从ChatGPT中生成文本的技术。在数据匮乏或任务全新、定义模糊之时,我们用微妙的提示,让ChatGPT从无到有,生成文本。 面对任务,空无一例:模型凭借对任务的广泛理解,独辟…

贝锐蒲公英虚拟DMZ:工业设备异地组网,解决网段冲突难题

虚拟DMZ 产品/技术的原理传统DMZ: DMZ中文名称为“隔离区”,也称“非军事化区”;它是为解决安装防火墙后外部网络不能访问内部网络服务器的问题。网关DMZ功能开启后, 将内网的一台服务器完全暴露在外网(内网某个IP绑…

在CentOS7上部署Nginx并测试指南

Nginx部署测试 Nginx简介 Nginx是俄罗斯人Igor Sysoev编写的一款高性能的HTTP和反向代理服务器。 Nginx选择了epoll和kqueue作为网络I/O模型,在高连接并发的情况下,内存、CPU等系统资源消耗非常低,运行稳定。 正向代理与反向代理 正向代…

Swift 周报 第四十八期

文章目录 前言新闻和社区苹果突然不造车了,雷军:非常震惊!分析师:马斯克或是最大赢家你会爱上的开发者活动 提案通过的提案正在审查的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组自主整理周报的第四十八期…

【MySQL】16.事务管理(重点) -- 2

1. 事务隔离级别 如何理解隔离性1 MySQL服务可能会同时被多个客户端进程(线程)访问,访问的方式以事务方式进行一个事务可能由多条SQL构成,也就意味着,任何一个事务,都有执行前,执行中,执行后的阶段。而所…

基于Echarts的超市销售可视化分析系统(数据+程序+论文)

本论文旨在研究Python技术和ECharts可视化技术在超市销售数据分析系统中的应用。本系统通过对超市销售数据进行分析和可视化展示,帮助决策层更好地了解销售情况和趋势,进而做出更有针对性的决策。本系统主要包括数据处理、数据可视化和系统测试三个模块。…

基于随机森林与LSTM神经网络的住宅用电比较分析及预测 代码+论文 完整毕设

摘要 本文旨在探讨基于随机森林(Random Forest)与长短期记忆神经网络(Long Short-Term Memory, LSTM)的住宅用电比较分析及预测方法。随机森林是一种集成学习方法,通过构建多个决策树进行预测,具有较强的鲁…

FL Studio21.2.3.4004音乐制作及里程碑及功能介绍

**FL Studio 21.2.3.4004:音乐制作的新里程碑** 随着数字音乐制作技术的不断发展,音乐制作软件也在不断迭代升级。今天,我们将聚焦于一款广受欢迎的音乐制作软件——FL Studio 21.2.3.4004,探讨它如何成为音乐制作领域的新里程碑…

【技巧】如何设置和解除PDF的“打开密码”?

在工作中,我们经常会接触到PDF文件,对于重要的文件,往往还会设置密码保护,那PDF的“打开密码”如何设置和解除呢?下面小编分享两种方法,一起来看看吧! 方法一:使用PDF编辑器 大部分…

基于连续深度编解码器网络的医学图像鲁棒边界分割

基于连续深度编解码器网络的医学图像鲁棒边界分割 摘要引言相关工作方法-----III. PROPOSED METHOD Robust_Boundary_Segmentation_in_Medical_Images_Using_a_Consecutive_Deep_Encoder-Decoder_Network 摘要 图像分割通常用于定位目标和边界。它在许多临床应用中是必不可少的…

一步一步搭建,功能最全的权限管理系统之动态路由菜单

一、前言 这是一篇搭建权限管理系统的系列文章。 随着网络的发展,信息安全对应任何企业来说都越发的重要,而本系列文章将和大家一起一步一步搭建一个全新的权限管理系统。 说明:由于搭建一个全新的项目过于繁琐,所有作者将挑选核心…

1320亿参数,性能超LLaMA2、Grok-1!开源大模型DBRX

3月28日,著名数据和AI平台Databricks在官网正式开源大模型——DBRX。 DBRX是一个专家混合模型(MoE)有1320亿参数,能生成文本/代码、数学推理等,有基础和微调两种模型。 根据DBRX在MMLU、HumanEval和 GSM8K公布的测试…

蓝牙双模音频模块支持串口AT指令控制介绍

目录 一、BT401蓝牙音频模块简介 蓝牙音频模块支持串口AT指令控制介绍,这里推荐BT401蓝牙模块,功能简介如下: BT401模块是一款支持蓝牙、U盘、TF卡播放的5合1的解决方案。模组的亮点在支持无损音乐的播放,以及简单明了的串口控制…

婴儿专用洗衣机哪个牌子好?四大爆款婴儿洗衣机合集安利

婴儿的衣物需要特别的护理,因为婴儿的皮肤非常娇嫩,需要一个无菌,没有刺激性的洗涤环境,于是婴儿洗衣机应运而生。如果你非常注重婴儿衣物的卫生问题,那么婴儿洗衣机则是非常理想的选择。毕竟,在婴儿吃奶或…

文件上传失败原因分析与解决

图片文件上传失败 问题描述&#xff1a;在前端开发时&#xff0c;需要通过表单元素上传图片或其他文本&#xff0c;但是上传不成功&#xff0c;后端接口也没问题 html <!--onChange用来绑定数据 handleUpload用来提交数据--><form onSubmit{handleUpload}><…
最新文章