数据库【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 IDview->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.mzph.cn/news/776574.shtml

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

相关文章

牛客题霸-SQL篇(刷题记录三)

本文基于前段时间学习总结的 MySQL 相关的查询语法,在牛客网找了相应的 MySQL 题目进行练习,以便加强对于 MySQL 查询语法的理解和应用。 由于涉及到的数据库表较多,因此本文不再展示,只提供 MySQL 代码与示例输出。 以下内容是…

git stash代码pop stash后误删找回

如题,git stash了代码,点了pop stash后,revert了改动。是可以找回的。 操作步骤: 使用 git stash pop 其实并没有真正地将文件删掉的,而是删除引用而已,因此我们可以使用 git fsck 命令进行找回&#xff…

可解性和解的结构

文章目录 1. 消元2. 特解 本文的目的是为了求得方程组的解 A X b (1) AXb\tag{1} AXb(1) 关于X的解可以是无解,有唯一解,无数解这几种情况。 1. 消元 假设我们有一个方程组表示如下: x 1 2 x 2 2 x 3 2 x 4 b 1 (2) x_12x_22x_32x_4b…

全量知识系统 详细设计 祖传代码之 翻译器、解释器和编译器 暨 文档规范 之1

文档规范--“祖传代码”的翻译器、解释器和编译器 序 在前面的沟通的文字表达中,总会涉及到如何使用和理解 文字中的各种常规或非常规的符号引用。如果没有一套标准来解释它,会造成不必要的理解偏差。所以,从今天起,我们暂时放…

php 快速入门(一)

一、配置系统环境 1.1 安装软件 1、安装php的开发软件:phpstorm 在这个软件中写代码 2、安装php的运行软件:phpstduy 写好的php程序需要放到phpstduy中,用户才能访问和测试 安装过程注意事项:安装的路径中不能有空格和中文字符&…

彻底理解 IO 多路复用!

在讲解该技术之前,我们需要预习一下文件以及文件描述符。 什么是文件 程序员使用I/O最终都逃不过文件这个概念。 在Linux世界中文件是一个很简单的概念,作为程序员我们只需要将其理解为一个N byte的序列就可以了: b1, b2, b3, b4, ......…

基于视图能力的县域治理视频基座数字化、智慧化解决方案

一、方案背景 县域治理方案是我国地方治理体系的重要组成部分,对于促进县域经济社会发展、维护社会稳定、推进全面深化改革具有重要意义。随着科技的不断进步,视频监管已经成为了现代社会治理的重要手段之一。县域治理视频监管方案是通过视频监控、数据…

C语言中常用的文件操作

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

mybatis动态解析sql示例

下面是一个简化的示例,展示了 MyBatis 如何根据配置文件动态解析和构建 SQL 语句的过程。这个示例并不是 MyBatis 的实际代码,而是模拟 MyBatis 解析过程的伪代码。 java public class MyBatisParser { public String parseDynamicSql(String dynamicSq…

【Java扫盲篇】String、String Buffer和String Builder的区别

你在面试时,面试官让你讲讲String String Buffer String Builder的区别,你是否能流畅的、完整的叙述出他们三者的区别? ✍先说结论 相同点: 他们的底层都是由char数组实现的。不同点: String对象一旦创建,是不能修…

基于STM32温室智能监测控制系统设计

**单片机设计介绍,基于STM32温室智能监测控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于STM32的温室智能监测控制系统设计是一个综合性的项目,旨在实现对温室内环境参数的实时监测和控制…

Centos7.9备份mysql数据库

1. 备份 备份shell脚本 [rootiZoqvrzbtnzd6kZ local]# vi mysql_backup.sh #!/bin/bash #设置MySQL登录信息 MYSQL_USER"root" MYSQL_PASSWORD"**********" MYSQL_DATABASE"ubox" BACKUP_DIR"/usr/local/mysql_backup" MONTH"…

2024年14款国内外主流低代码开发平台对比:总有一款适合您!

低代码开发平台是一种更偏向于赋能技术人员的工具,它允许开发人员通过将可视代码块拖放到工作流中来创建应用程序,从而以最少的手工编码快速设计应用程序。 市场中有非常多的低代码开发平台,令人眼花缭乱。应当选哪个低代码开发平台&#xf…

“数字直角三角形”的循环简化

【题目描述】 给出n(1<n<13)&#xff0c;请输出一个直角边长度是n的数字直角三角形。 【样例输入】 5 【样例输出】 0102030405 06070809 101112 1314 15 【题目来源】 洛谷P5721 【深基4.例6】数字直角三角形 【解析】 本题的样例输出一眼望过去就是像一个矩…

12 完全分布式搭建-SSH免密登录

配置 ssh &#xff08;1&#xff09;基本语法 ssh 另一台电脑的 IP 地址 &#xff08;2&#xff09;ssh 连接时出现 Host key verification failed 的解决方法 [ytmaster~]$ ssh slave01 ➢ 如果出现如下内容 Are you sure you want to continue connecting (yes/no)…

简明 Python 教程(第13章 更多Python的内容)

到目前为止&#xff0c;我们已经学习了绝大多数常用的Python知识。在这一章中&#xff0c;我们将要学习另外一些方面的Python知识&#xff0c;从而使我们对Python的了解更加完整 。 特殊的方法 在类中有一些特殊的方法具有特殊的意义&#xff0c;比如__init__和__del__方法&…

代码随想录算法训练营Day36|LC435 无重叠区间LC763 划分字母区间LC56 合并区间

一句话总结&#xff1a;都是和昨天的用最少箭引爆气球类似的题。 原题链接&#xff1a;435 无重叠区间 计数不重叠的区间的个数&#xff0c;然后用总长度减去这个值即可。 class Solution {public int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals, (a,…

2.4 比较检验 机器学习

目录 常见比较检验方法 总述 2.4.1 假设检验 2.4.2 交叉验证T检验 2.4.3 McNemar 检验 接我们的上一篇《性能度量》&#xff0c;那么我们在某种度量下取得评估结果后&#xff0c;是否可以直接比较以评判优劣呢&#xff1f;实际上是不可以的。因为我们第一&#xff0c;测试…

谭浩强第五版C语言课后习题(编程题)+答案

谭浩强第五版作为初学C语言必读的一本教材&#xff0c;课后习题具有非常大的参考价值&#xff0c;也是很多高校期末考试或者考研的重要参考。在这里我整理了一部分个人认为比较重要的编程题&#xff0c;供大家作参考 1.输入两个数&#xff0c;求他们的最大公约数和最小公倍数&…

区间开关灯模型

P3870 [TJOI2009] 开关 先看一道经典的区间开关灯问题的模型&#xff0c;维护一个lz 每次异或操作就好了 #include<bits/stdc.h> using namespace std; using ll long long; using pii pair<int,int>; const int N 1e510; const int inf 0x3f3f3f3f; const int…