00. 目录

文章目录

  • 00. 目录
  • 01. 概述
  • 02. 开发环境
  • 03. QSqlTableModel基本操作
  • 04. QSqlTableModel修改操作
  • 05. QSqlTableModel查询操作
  • 06. QSqlTableModel排序操作
  • 07. QSqlTableModel删除操作
  • 08. QSqlTableModel插入操作
  • 09. QSqlTableModel总结
  • 10. 附录

01. 概述

只读的QSqlQueryModel模型其实也可以实现编辑功能的,但是实现起来很麻烦。而QSqlTableModel提供了一个一次只能操作单个SQL表的读写模型,它是QSqlQuery的更高层次的替代品,可以浏览和修改独立的SQL表,并且只需编写很少的代码,而且不需要了解SQL语法。

02. 开发环境

Windows系统:Windows10

Qt版本:Qt5.15或者Qt6

03. QSqlTableModel基本操作

3.1 新建Qt Widgets应用,项目名称为16SQL,基类为QMainWindow,类名MainWindow。

3.2 在16SQL.pro文件中添加一下模块

QT       += sql

3.3 向项目中添加新的C++头文件,名称为connection.h。

#ifndef CONNECTION_H
#define CONNECTION_H#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>static bool createConnection()
{QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("test.db");if (!db.open()){return false;}QSqlQuery query;query.exec("create table student(id int primary key, name varchar(20))");query.exec("insert into student values(1, ' 王鹏')");query.exec("insert into student values(2, '李刚')");query.exec("insert into student values(3, '李强')");query.exec("insert into student values(4, '王强')");query.exec("insert into student values(5, '黎明朗')");return true;
}#endif // CONNECTION_H

3.4 main.cpp文件更改如下

#include "mainwindow.h"#include <QApplication>
#include "connection.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);if (!createConnection()){return 1;}MainWindow w;w.show();return a.exec();
}

3.5 进行界面设计,界面设计如下

3.6 mainwindow.h文件中,先包含头文件和私有对象

#include <QSqlTableModel>private:QSqlTableModel *model;

3.7 在构造函数添加如下代码

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);model = new QSqlTableModel(this);model->setTable("student");model->setEditStrategy(QSqlTableModel::OnManualSubmit);//不显示第二列//model->removeColumn(1);//查询整张表model->select();ui->tableView->setModel(model);//设置视图不可编辑//ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
}

这里创建一个QSqlTableModel后,只需使用setTable()来为其指定数据表,然后使用select()函数进行查询,调用这两个函数就等价于执行了“select * from student”这个SQL语句。这里还可以使用setFilter()来指定查询时的条件,在后面会看到这个函数的使用。在使用该模型以前,一般还要设置其编辑策略,它由QSqlTableModel::EditStrategy枚举类型定义,一共有三个值,如下图所示。用来说明当数据库中的值被编辑后,什么情况下提交修改。

执行结果如下:

04. QSqlTableModel修改操作

4.1 “提交修改”按钮的单击信号槽,更改如下:

//提交修改
void MainWindow::on_pushButton_clicked()
{//开启事务model->database().transaction();if (model->submitAll()){//提交事务model->database().commit();}else{//回滚事务model->database().rollback();QMessageBox::warning(this, tr("TableView"), tr("数据库错误: %1").arg(model->lastError().text()));}
}

model->submitAll()提交所有更改。

4.2 撤销修改按钮槽函数

//撤销修改
void MainWindow::on_pushButton_2_clicked()
{model->revertAll();
}

现在运行程序,我们将“third”改为“three”,如果我们点击“撤销修改”,那么它就会重新改为“陈third”,而当我们点击“提交修改”后它就会保存到数据库,此时再点击“撤销修改”就修改不回来了。

​ 可以看到,这个模型可以将所有修改先保存到model中,只有当我们执行提交修改后,才会真正写入数据库。当然这也是因为我们在最开始设置了它的保存策略:

//OnManualSubmit表明我们要提交修改才能使其生效。
model->setEditStrategy(QSqlTableModel::OnManualSubmit);

05. QSqlTableModel查询操作

5.1 查询按钮槽函数

//查询按钮
void MainWindow::on_pushButton_5_clicked()
{QString name = ui->lineEdit->text();//根据姓名进行筛选model->setFilter(QString("name = %1").arg(name));//显示结果model->select();
}

使用setFilter()函数进行关键字筛选,这个函数是对整个结果集进行查询。

5.2 显示全表按钮槽函数

//显示全表按钮槽函数
void MainWindow::on_pushButton_6_clicked()
{//设置要查询的表model->setTable("student");//执行查询操作model->select();
}

06. QSqlTableModel排序操作

按ID升序排序按钮槽函数

//根据ID进行升序排序操作
void MainWindow::on_pushButton_7_clicked()
{model->setSort(0, Qt::AscendingOrder);model->select();
}

按ID降序排序按钮槽函数

//根据ID进行降序排序操作
void MainWindow::on_pushButton_8_clicked()
{model->setSort(0, Qt::DescendingOrder);model->select();
}

setSort()函数进行排序,它有两个参数,第一个参数表示按第几个字段排序,表头从左向右,最左边是第0个字段,这里就是id字段。第二个参数是排序方法,有升序和降序两种。

07. QSqlTableModel删除操作

删除选中行按钮槽函数实现如下

//删除选中行
void MainWindow::on_pushButton_4_clicked()
{//获取选中的行int curRow = ui->tableView->currentIndex().row();//删除该行model->removeRow(curRow);int ret = QMessageBox::warning(this, tr("删除当前行"), tr("你确定要删除该行吗"), QMessageBox::Yes | QMessageBox::No);if (ret == QMessageBox::Yes){//删除该行 提交到数据库model->submitAll();}else{//不删除  撤销操作model->revertAll();}
}

删除行的操作会先保存在model中,当我们执行了submitAll()函数后才会真正的在数据库中删除该行。这里我们使用了一个警告框来让用户选择是否真得要删除该行。执行程序效果如下:

我们单击第三行,然后单击“删除选中行”按钮,出现了警告框。这时你会发现,表中的第三行前面出现了一个小感叹号,表明该行已经被修改了,但是还没有真正在数据库中修改,这时的数据有个学名叫脏数据(Dirty Data)。当我们按钮“Yes”按钮后数据库中的数据就会被删除,如果按下“No”,那么更改就会取消。

08. QSqlTableModel插入操作

添加记录槽函数实现如下

//添加记录
void MainWindow::on_pushButton_3_clicked()
{//获取表的行数int row = model->rowCount();int id = 18;//添加一行model->insertRow(row);model->setData(model->index(row, 0), id);model->setData(model->index(row, 1), tr("李华"));//提交//model->submitAll();
}

在表的最后添加一行,因为在student表中我们设置了id号是主键,所以这里必须使用setData()函数给新加的行添加id字段的值,不然添加行就不会成功。这里可以直接调用submitAll()函数进行提交,也可以利用“提交修改”按钮进行提交。

09. QSqlTableModel总结

QSqlTableModel模型很强大,而且完全脱离了SQL语句,就算你不怎么懂数据库知识,也可以利用它进行大部分常用的操作。我们也看到了,这个模型提供了缓冲区,可以先将修改保存起来,当我们执行提交函数时,再去真正地修改数据库。

10. 附录

10.1 Qt教程汇总
网址:https://dengjin.blog.csdn.net/article/details/115174639

10.2 源码下载
网址:【Qt】数据库实战之QSqlTableModel模型.rar

【Qt】数据库实战之QSqlTableModel模型相关推荐

  1. Qt数据库练习之QSqlTableModel的使用(MySql数据库示例,含源码+注释)

    文章目录 一.操作示例 1.1 修改记录(数据) 1.2 添加记录(数据) 1.3 删除记录(数据) 1.4 取消操作 1.5 排序操作 1.6 查询操作 二.了解QSqlTableModel 三.源 ...

  2. 【Qt】数据库实战之QSqlRelationalTableModel

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. QSqlRelationalTableModel外键 04. QSqlRelationalDelegate委托类 05. ...

  3. QT笔记:数据库总结(三)之SQL模型类-QSqlTableModel模型

    QSqlTableModel类继承至QSqlQueryModel类,该类提供了一个可读写单张SQL表的可编辑数据模型,功能:修改,插入,删除,查询,和排序 常用函数 QVariant headerDa ...

  4. 【Qt】数据库实战之QSqlQueryModel

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. QSqlQueryModel查询模型 04. QSqlQueryModel常用操作 05. QSqlQueryModel自 ...

  5. Qt数据库操作(三) -- 使用SQL模型类

    文章目录 Qt数据库操作(三) -- 使用SQL模型类 1.SQL查询模型 2.SQL表格模型 3.关系表格模型 Qt数据库操作(三) – 使用SQL模型类 Qt 提供了3个高级的类来访问数据库,分别 ...

  6. 【Qt】数据库实战(一)

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 数据库驱动 04. 创建数据库连接 05. 数据库简单操作 06. 附录 01. 概述 Qt中的Qt SQL模块提供了对数 ...

  7. 【Qt】数据库实战(三)

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 增删改查操作 04. 名字绑定和位置绑定 05. 程序示例 06. 批处理操作 07. 事务操作 08. 附录 01. 概 ...

  8. 【Qt】数据库实战(二)

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 连接到数据库 04. 操作结果集 06. 附录 01. 概述 SQL即结构化查询语言,是关系数据库的标准语言.前面已经在Q ...

  9. 深入浅出Qt数据库编程:从基本操作到高级技巧

    深入浅出Qt数据库编程:从基本操作到高级技巧 (Demystifying Qt Database Programming: From Basic Operations to Advanced Tech ...

最新文章

  1. Attention!注意力机制模型最新综述(附下载)
  2. SQL代码-创建DeskInfo表
  3. 程序员在囧途之做私活小记
  4. yii2地址多级联动
  5. 中小型研发团队架构实践:微服务架构
  6. 在我的网站上开通了WebPart演示和下载列表。
  7. jenkins pipeline之如何创建一个流水线
  8. Java混乱的日志体系(logback)(转)
  9. Ubuntu下解压缩文件
  10. 常用linux解压命令(原创)
  11. java对日期设置时间和对日期加减周
  12. 如何破解VS2015(使用秘钥)
  13. Linux系统下载Unity-Tweek-Tool
  14. windows性能监视器API
  15. C++ 使用Poco库实现XML的读取和写入
  16. VScode运行时提示找不到应用程序
  17. 程序员在上海税前12000的工资,真实发到手能拿到多少?
  18. HTTP协议状态码的含义
  19. Java的“小心心”
  20. 未来人工智能技术的应用领域有哪些?

热门文章

  1. evernote100个做笔记的好方法
  2. 顺序容器及其常用函数
  3. oracle 根据值不同具有不同的搜索条件_在Navicat Premium中执行数据库范围内的搜索...
  4. httpsrequest java_java如何通过https返回数据
  5. 每日程序C语言6-判断某范围之间的素数
  6. web浏览器_vs2019使用webview2开发web浏览器 - 左正
  7. 手机和工业计算机运算能力对比,手机CPU跟电脑CPU到底差多少?
  8. 对用户数据进行简单的管理用,C++实现几个字符串的字典序排序
  9. 关于四金计算和工资对照表
  10. UVa 208 - Firetruck (回溯)