【Qt之QSqlTableModel】介绍及使用

【Qt之QSqlTableModel】介绍及使用

      • 描述
      • 常用方法
      • 槽函数
      • 信号
      • 示例

描述

QSqlTableModel类为单个数据库表提供可编辑的数据模型。

QSqlTableModel是一个高级接口,用于从单个表中读写数据库记录。
它建立在较低级别的QSqlQuery之上,可用于向QTableView等视图类提供数据。
例如:

   QSqlTableModel *model = new QSqlTableModel(parentObject, database);// 设置表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 nameview->show();

以上代码:

  • 设置SQL表的名称和编辑策略
  • 然后设置视图头中显示的标签
  • 编辑策略指示用户在视图中所做的更改何时实际应用于数据库,取值为OnFieldChange、OnRowChange、OnManualSubmit。

QSqlTableModel也可以用编程方式访问数据库,而不需要绑定到视图:

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

以上代码:

  • 代码片段从employee查询SELECT *的结果集中的记录4中提取工资字段
  • 可以使用setFilter()设置过滤器,或者使用setSort()修改排序顺序
  • 最后,必须调用select()来用数据填充模型。

表模型示例说明了如何使用QSqlTableModel作为QTableView的数据源。

QSqlTableModel不直接支持外键。
如果要解析外键,请使用QSqlRelationalTableModelQSqlRelationalDelegate

常用方法

  1. 枚举:QSqlTableModel::EditStrategy
    此枚举类型描述在编辑数据库中的值时选择的策略。
常量描述解释
QSqlTableModel::OnFieldChange0All changes to the model will be applied immediately to the database.对模型的所有更改将立即应用于数据库。
QSqlTableModel::OnRowChange1Changes to a row will be applied when the user selects a different row.当用户选择另一行时,将应用对一行的更改。
QSqlTableModel::OnManualSubmit2All changes will be cached in the model until either submitAll() or revertAll() is called.在调用submitAll()或revertAll()之前,所有更改都将缓存在模型中。

注意:为了防止只将部分初始化的行插入数据库,OnFieldChange的行为将像OnRowChange一样用于新插入的行。
因此,一般设置为手动刷新:

   pTableModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
  1. QSqlDatabase database() const
    获取模型连接的数据库对象。

  2. EditStrategy editStrategy() const
    返回当前的编辑策略。

  3. int fieldIndex(const QString &fieldName) const
    返回字段的索引,返回-1表示此模型内没有该字段。

    qDebug().noquote() << "当前字段索引 :" << pTableModel->fieldIndex("name");
  1. QString filter() const
    获取当前设置的过滤。

  2. bool insertRecord(int row, const QSqlRecord &record)
    在位置行插入记录。如果row为负数,则将该记录追加到末尾。内部调用insertRows()setRecord()
    如果记录可以插入,则返回true,否则返回false
    更改立即提交OnFieldChangeOnRowChange。失败不会在模型中留下新行。

    QSqlRecord record = pTableModel->record();qDebug().noquote() << "获取字段 :" << record.fieldName(0) << record.fieldName(1) << record.fieldName(2) << record.fieldName(3);record.setValue("field0", "666");record.setValue("field1", "666");record.setValue("field2", 666);record.setValue("field3", "666");// 插入记录// -1 表示在表的末尾插入新记录qDebug().noquote() << "插入 :" << pTableModel->insertRecord(pTableModel->rowCount(), record);
  1. bool isDirty(const QModelIndex &index) const
    如果索引index处的值是被改的,则返回true,否则返回false。脏值是在模型中被修改但尚未写入数据库的值。
    如果index无效或指向不存在的行,则返回false。
    此函数还有重载:bool isDirty() const
    意思就是:
    这是一个重载函数。
    如果模型包含未提交给数据库的修改值,则返回true,否则返回false。

  2. QSqlIndex primaryKey() const
    返回当前表的主键,如果表未设置或没有主键,则返回空QSqlIndex

  3. QSqlRecord record(int row) const
    返回模型中第一行的记录。
    如果row是有效行的索引,则将使用该行的值填充记录。
    如果模型没有初始化,将返回一个空记录。
    此函数还有重载:QSqlRecord record() const
    意思就是:
    这是一个重载函数。
    返回一个空记录,只有字段名称;此函数可用于检索记录的字段名。

  4. void revertRow(int row)
    恢复指定行的所有改变。

  5. void setFilter(const QString &filter)
    将当前过滤器设置为filter
    过滤器是一个不带关键字WHERESQL WHERE子句(例如,name='Josephine')。
    如果已经用数据库中的数据填充了模型,则模型将使用新的过滤器重新选择它。否则,过滤器将在下次调用select()时应用。

    QSqlTableModel* pTableModel = new QSqlTableModel(ui->tableView, db);pTableModel->setEditStrategy(QSqlTableModel::OnManualSubmit);pTableModel->setTable("\"tableTest\"");// 未选择pTableModel->setFilter("name = '666'");// 执行setFilter操作pTableModel->select();if (pTableModel->lastError().isValid()) {qDebug() << "Error:" << pTableModel->lastError();}ui->tableView->setModel(pTableModel);// 当前字段索引qDebug().noquote() << "当前字段索引 :" << pTableModel->fieldIndex("name");// 重新选择pTableModel->setFilter("name = '22'"); 
  1. bool setRecord(int row, const QSqlRecord &values)
    将值应用于模型中的行。源字段和目标字段按字段名映射,而不是按记录中的位置映射。
    请注意,将保留值中生成的标志,并确定在将更改提交给数据库时是否使用相应的字段。调用者应该记得将数据库提供值的字段(比如自动增加的ID)的生成标志设置为FALSE。
    对于编辑策略OnFieldChangeOnRowChange,只有当其他行没有缓存更改时,一行才可能接收到更改。更改会立即提交。提交的更改在失败时不会恢复。
    如果所有值都可以设置,则返回true;否则返回false

  2. void setSort(int column, Qt::SortOrder order)
    将列的排序顺序设置为order。这不会影响当前数据,要使用新的排序顺序刷新数据,请调用select()。

  3. void setTable(const QString &tableName)
    将模型操作的数据库表设置为tableName。不从表中选择数据,但获取其字段信息。
    要用表的数据填充模型,请调用select()
    可以使用lastError()检索错误信息。

    pTableModel->setTable("\"tableTest\"");
  1. QString tableName() const
    获取当前选择的表名

槽函数

  1. bool submit()
    QAbstractItemModel::submit()重新实现。
    当用户停止编辑当前行时,项委托调用这个重新实现的槽。
    如果模型的策略设置为OnRowChangeOnFieldChange,则提交当前编辑的行。对OnManualSubmit策略不做任何操作。
    使用submitAll()OnManualSubmit策略提交所有挂起的更改。
    成功时返回true;否则返回false。使用lastError()查询详细的错误信息。
    不会自动重新填充模型。提交的行在成功时从数据库中刷新。

  2. bool submitAll()
    提交所有挂起的更改,并在成功时返回true。错误时返回false,详细的错误信息可以通过lastError()获得。
    OnManualSubmit中,一旦成功,模型将被重新填充。任何呈现它的视图都将失去其选择。
    注意:在OnManualSubmit模式下,当submitAll()失败时,已经提交的更改不会从缓存中清除。这允许事务回滚并重新提交,而不会丢失数据。

  3. void revert()
    QAbstractItemModel::revert()重新实现。
    当用户取消编辑当前行时,项目委托调用这个重新实现的槽。
    如果模型的策略设置为OnRowChangeOnFieldChange,则恢复更改。对OnManualSubmit策略不做任何操作。 使用revertAll()来恢复OnManualSubmit策略的所有挂起的更改,或者使用revertRow()`来恢复特定的行。

  4. void revertAll()
    重置所有缓存操作。

  5. bool select()
    使用通过setTable()设置的表中的数据填充模型,使用指定的筛选和排序条件,如果成功则返回true;否则返回false。
    注意:调用select()将恢复所有未提交的更改并删除所有插入的列。

  6. bool selectRow(int row)
    使用与主键值匹配的数据库表行中的值刷新模型中的行。如果没有主键,所有列值必须匹配。如果没有找到匹配的行,模型将显示空行。
    如果成功返回true;否则返回false。

信号

  1. void beforeDelete(int row)
    该信号由deleteRowFromTable()在从当前活动的数据库表中删除行之前发出。
  2. void beforeInsert(QSqlRecord &record)
    该信号由insertRowIntoTable()在将新行插入当前活动的数据库表之前发出。要插入的值存储在记录中,可以在插入之前进行修改。
  3. void beforeUpdate(int row, QSqlRecord &record)
    在使用record中的值更新当前活动数据库表中的行之前,updateRowInTable()会发出这个信号。
    注意,只有标记为生成的值才会被更新。生成标志可以用QSqlRecord::setGenerated()设置,用QSqlRecord::isGenerated()检查。
  4. void primeInsert(int row, QSqlRecord &record)
    当在当前活动的数据库表的给定行中发起插入时,该信号由insertRows()发出。record参数可以写入(因为它是一个引用),例如用默认值填充一些字段,并设置字段的生成标志。在处理此信号时,不要尝试通过setData()或setRecord()等其他方法编辑记录。

示例

在.pro中添加QT += sql
包含头文件

        #include <QDebug>#include <QSqlTableModel>#include <QSqlDatabase>#include <QSqlRecord>#include <QSqlError>

初始化

            QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("xxx/xxx/xxx.db");bool ok = db.open();QSqlTableModel* pTableModel = new QSqlTableModel(ui->tableView, db);pTableModel->setEditStrategy(QSqlTableModel::OnManualSubmit);pTableModel->setTable("\"tableTest\"");pTableModel->setFilter("name = '666'");pTableModel->select();if (pTableModel->lastError().isValid()) {qDebug() << "Error:" << pTableModel->lastError();}ui->tableView->setModel(pTableModel);// 当前字段索引qDebug().noquote() << "当前字段索引 :" << pTableModel->fieldIndex("name");pTableModel->setFilter("name = '666'");         

插入

            QSqlTableModel* pTableModel = (QSqlTableModel*)ui->tableView->model();// 实现以下代码,插入空行后进行数据插入,会插入失败。//pTableModel->insertRow(pTableModel->rowCount());QSqlRecord record = pTableModel->record();qDebug().noquote() << "获取字段 :" << record.fieldName(0) << record.fieldName(1) << record.fieldName(2) << record.fieldName(3);record.setValue("field0", "66");record.setValue("field1", "66");record.setValue("field2", 66);record.setValue("field3", "66");// 插入记录qDebug().noquote() << "插入 :" << pTableModel->insertRecord(pTableModel->rowCount(), record); // -1 表示在表的末尾插入新记录

提交

            QSqlTableModel* pTableModel = (QSqlTableModel*)ui->tableView->model();pTableModel->submitAll();                   

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

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

相关文章

智安网络|探索云安全合规要求:等保2.0时代的新趋势解析

随着信息技术的不断发展和应用的广泛普及&#xff0c;信息安全问题日益凸显&#xff0c;特别是在云计算时代&#xff0c;企业对于云平台的安全保障需求更为迫切。等级保护&#xff08;等保&#xff09;作为我国信息安全的基本要求&#xff0c;已经进入了2.0时代&#xff0c;对于…

TS-函数

函数类型的定义 一般函数需要定义它的参数类型和返回值类型作为回调函数(函数类型表达式) function fn(cb: (msg: string) >void) {}可以作为对象调用的函数&#xff08;调用签名&#xff09; type DescribeFunction {msg: string(n: number): void }作为构造函数&#…

1087 All Roads Lead to Rome(最短路求最大权值,最短路路径条数,节点个数,回溯路径)

&#xff08;这题基本上把最短路能求的都求了个遍&#xff0c;除了麻烦一点&#xff0c;难度其实还好&#xff09; &#xff08;卡题原因&#xff1a;dijks漏了对路径条数的初始化。&#xff09; #include<bits/stdc.h> using namespace std; #define int long long i…

深入Android S (12.0) 探索Framework之输入系统IMS的构成与启动

文章目录 前言一、输入系统的基本组成部分二、输入系统相关源码分析1、IMS 构建1.1、SystemServer # startOtherServices()1.2、InputManagerService1.3、NativeInputManager # nativeInit()1.4、NativeInputManager1.5、InputManager1.6、InputDispatcher1.7、InputReader1.8、…

Filament引擎分析--command抽象设备API

1. 前言 Filament中使用了FrameGraph来管理渲染管线&#xff0c;需要准备两点&#xff1a; 设备接口抽象&#xff1a;设备API抽象为Command资源抽象&#xff1a;使用虚拟资源&#xff0c;在实际用到时再创建&#xff0c;方便剔除无用资源 下面就围绕Filament中设备API抽象为…

网络安全小白自学

一、网络安全应该怎么学&#xff1f; 1.计算机基础需要过关 这一步跟网安关系暂时不大&#xff0c;是进入it行业每个人都必须掌握的基础能力。 计算机网络计算机操作系统算法与数据架构数据库 Tips:不用非要钻研至非常精通&#xff0c;可以与学习其他课程同步进行。 2.渗透技…

2015年五一杯数学建模C题生态文明建设评价问题解题全过程文档及程序

2015年五一杯数学建模 C题 生态文明建设评价问题 原题再现 随着我国经济的迅速发展&#xff0c;生态文明越来越重要&#xff0c;生态文明建设被提到了一个前所未有的高度。党的十八大报告明确提出要大力推进生态文明建设&#xff0c;报告指出“建设生态文明&#xff0c;是关系…

目标检测YOLO系列从入门到精通技术详解100篇-【图像处理】图像分割(补充篇)

目录 前言 知识储备 图像分割-行为检测 算法原理 什么是图像分割?

NOI / 1.7编程基础之字符串 30:字符环 c语言 两次遍历解决循环

描述 有两个由字符构成的环。请写一个程序&#xff0c;计算这两个字符环上最长连续公共字符串的长度。例如&#xff0c;字符串“ABCEFAGADEGKABUVKLM”的首尾连在一起&#xff0c;构成一个环&#xff1b;字符串“MADJKLUVKL”的首尾连在一起&#xff0c;构成一个另一个环&…

【Python】torch.exp()和 torch.sigmoid()函数详解和示例

本文对torch.exp&#xff08;&#xff09;和 torch.sigmoid&#xff08;&#xff09;函数进行原理和示例讲解&#xff0c;以帮助大家理解和使用。 目录 torch.exp函数原理运行示例 torch.sigmoid&#xff08;&#xff09;函数原理运行示例torch.sigmoid相关知识 结合运行 torc…

2023网络安全产业图谱

1. 前言 2023年7月10日&#xff0c;嘶吼安全产业研究院联合国家网络安全产业园区&#xff08;通州园&#xff09;正式发布《嘶吼2023网络安全产业图谱》。 嘶吼安全产业研究院根据当前网络安全发展规划与趋势发布《嘶吼2023网络安全产业图谱》调研&#xff0c;旨在进一步了解…

Python与设计模式--命令模式

23种计模式之 前言 &#xff08;5&#xff09;单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、&#xff08;11&#xff09;策略模式、责任链模式、命令模式、中介者模…

Net6.0或Net7.0项目升级到Net8.0 并 消除.Net8中SqlSugar的警告

本文基于NetCore3.1或Net6.0项目升级到Net7.0&#xff0c;参考连接&#xff1a;NetCore3.1或Net6.0项目升级到Net7.0-CSDN博客 所有项目按照此步骤操作一遍&#xff0c;完成后再将所有引用的包&#xff08;即 *.dll&#xff09;更新升级到最新版&#xff08;注意&#xff1a;有…

在 CentOS 7 上安装 MySQL 8

在 CentOS 7 上安装 MySQL 8 步骤 1: 添加 MySQL Yum 存储库 首先&#xff0c;我们需要添加 MySQL Yum 存储库。打开终端并执行以下命令&#xff1a; sudo yum install -y https://repo.mysql.com/mysql80-community-release-el7-3.noarch.rpm步骤 2: 导入 MySQL GPG 公钥 …

python-爬虫(可直接使用)

爬虫&#xff08;Web Scraping&#xff09;是指通过编程自动化地获取互联网上的信息的过程。爬虫的目的通常是从网页中抓取数据&#xff0c;进行数据分析、处理或展示。以下是爬虫的基本流程和一些重要的概念&#xff1a; 爬虫基本流程&#xff1a; 确定目标&#xff1a; 确定要…

【Rust】快速教程——自定义类型、数字转枚举、Cargo运行

前言 超过一定的年龄之后&#xff0c;所谓人生&#xff0c;无非是一个不断丧失的过程而已。宝贵的东西&#xff0c;会像梳子豁了齿一样从手中滑落下去。你所爱的人会一个接着一个&#xff0c;从身旁悄然消逝。——《1Q84》 \;\\\;\\\; 目录 前言自定义类型数字转枚举Cargo.tom…

CorelDRAW Graphics Suite2023破解版含2024最新注册机下载

CorelDRAW Graphics Suite2023是Corel公司的平面设计软件&#xff1b;该软件是Corel出品的矢量图形制作工具软件&#xff0c;这个图形工具给设计师提供了矢量动画、页面设计、网站制作、位图编辑和网页动画等多种功能。在日常科研绘图中&#xff0c;若较为轻量&#xff0c;通常…

处理器及微控制器:XCZU15EG-2FFVC900I 可编程单元

XCZU15EG-2FFVC900I参数&#xff1a; Zynq UltraScale™ MPSoC 系列基于 Xilinx UltraScale™ MPSoC 架构。该 Zynq UltraScale™ MPSoC 器件集成了功能丰富的 64 位四核或双核 Arm Cortex-A53 和双核 Arm Cortex-R5F 处理系统&#xff08;基于 Xilinx UltraScale™ MPSoC 架…

六、Lua运算符

文章目录 一、Lua 运算符&#xff08;一&#xff09;算术运算符&#xff08;二&#xff09;关系运算符&#xff08;三&#xff09;逻辑运算符&#xff08;四&#xff09;其他运算符 二、运算符优先级 一、Lua 运算符 运算符是一个特殊的符号&#xff0c;用于告诉解释器执行特定…

443. 压缩字符串

这篇文章会收录到 : 算法通关村第十二关-黄金挑战字符串冲刺题-CSDN博客 压缩字符串 描述 : 给你一个字符数组 chars &#xff0c;请使用下述算法压缩&#xff1a; 从一个空字符串 s 开始。对于 chars 中的每组 连续重复字符 &#xff1a; 如果这一组长度为 1 &#xff0c;…