【Qt】数据库实战之QSqlTableModel模型
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模型相关推荐
- Qt数据库练习之QSqlTableModel的使用(MySql数据库示例,含源码+注释)
文章目录 一.操作示例 1.1 修改记录(数据) 1.2 添加记录(数据) 1.3 删除记录(数据) 1.4 取消操作 1.5 排序操作 1.6 查询操作 二.了解QSqlTableModel 三.源 ...
- 【Qt】数据库实战之QSqlRelationalTableModel
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. QSqlRelationalTableModel外键 04. QSqlRelationalDelegate委托类 05. ...
- QT笔记:数据库总结(三)之SQL模型类-QSqlTableModel模型
QSqlTableModel类继承至QSqlQueryModel类,该类提供了一个可读写单张SQL表的可编辑数据模型,功能:修改,插入,删除,查询,和排序 常用函数 QVariant headerDa ...
- 【Qt】数据库实战之QSqlQueryModel
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. QSqlQueryModel查询模型 04. QSqlQueryModel常用操作 05. QSqlQueryModel自 ...
- Qt数据库操作(三) -- 使用SQL模型类
文章目录 Qt数据库操作(三) -- 使用SQL模型类 1.SQL查询模型 2.SQL表格模型 3.关系表格模型 Qt数据库操作(三) – 使用SQL模型类 Qt 提供了3个高级的类来访问数据库,分别 ...
- 【Qt】数据库实战(一)
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 数据库驱动 04. 创建数据库连接 05. 数据库简单操作 06. 附录 01. 概述 Qt中的Qt SQL模块提供了对数 ...
- 【Qt】数据库实战(三)
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 增删改查操作 04. 名字绑定和位置绑定 05. 程序示例 06. 批处理操作 07. 事务操作 08. 附录 01. 概 ...
- 【Qt】数据库实战(二)
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 连接到数据库 04. 操作结果集 06. 附录 01. 概述 SQL即结构化查询语言,是关系数据库的标准语言.前面已经在Q ...
- 深入浅出Qt数据库编程:从基本操作到高级技巧
深入浅出Qt数据库编程:从基本操作到高级技巧 (Demystifying Qt Database Programming: From Basic Operations to Advanced Tech ...
最新文章
- Attention!注意力机制模型最新综述(附下载)
- SQL代码-创建DeskInfo表
- 程序员在囧途之做私活小记
- yii2地址多级联动
- 中小型研发团队架构实践:微服务架构
- 在我的网站上开通了WebPart演示和下载列表。
- jenkins pipeline之如何创建一个流水线
- Java混乱的日志体系(logback)(转)
- Ubuntu下解压缩文件
- 常用linux解压命令(原创)
- java对日期设置时间和对日期加减周
- 如何破解VS2015(使用秘钥)
- Linux系统下载Unity-Tweek-Tool
- windows性能监视器API
- C++ 使用Poco库实现XML的读取和写入
- VScode运行时提示找不到应用程序
- 程序员在上海税前12000的工资,真实发到手能拿到多少?
- HTTP协议状态码的含义
- Java的“小心心”
- 未来人工智能技术的应用领域有哪些?
热门文章
- evernote100个做笔记的好方法
- 顺序容器及其常用函数
- oracle 根据值不同具有不同的搜索条件_在Navicat Premium中执行数据库范围内的搜索...
- httpsrequest java_java如何通过https返回数据
- 每日程序C语言6-判断某范围之间的素数
- web浏览器_vs2019使用webview2开发web浏览器 - 左正
- 手机和工业计算机运算能力对比,手机CPU跟电脑CPU到底差多少?
- 对用户数据进行简单的管理用,C++实现几个字符串的字典序排序
- 关于四金计算和工资对照表
- UVa 208 - Firetruck (回溯)