关于QSqlTableModel的使用说明(QT上创建本地SQL)
前言:通常我们操作数据库时,需要使用sql语句;在qt开发环境中提供了QSqlTableModel类,它可以通过简单的接口去操作数据库,即使不熟悉sql语句也可以对数据库进行大部分的操作,而且该模型还具有数据缓存功能,在修改数据后并不是立刻同步到数据库中,允许用户进行数据撤回,如果已经提交到数据库的数据就不能进行撤回了;QSqlTableModel还有一个非常方便的操作就是它可以将数据库的所有记录显示到QTableView控件上,并可以直接通过QTableView控件对数据库任意位置的数据进行修改。下面就QSqlTableModel类的使用进行举例说明。
Qt 5.14完整源码下载,下载链接;源码附带详细注释,十分具有参考意义。
效果图预览:
1.创建本地数据库
/*设置使用的数据库驱动*/QSqlDatabase sqldb = QSqlDatabase::addDatabase("QSQLITE");/*打开指定文件下的数据库文件,如果不存在则创建*/sqldb.setDatabaseName("./test.db");if(sqldb.open()){qDebug() <<"[test.db]数据库打开成功。";}else{qDebug() <<"[test.db]数据库打开失败。";}
本地数据库可体现为一个文件,解读这个文件需要特定的数据库驱动,不同的数据库类型需要对应的数据库驱动。我上面采用的数据库驱动是QSQLITE,可通过下面的命令查看当前环境支持的数据库类型:
/*获取当前环境支持哪些数据库类型*/qDebug() <<"支持的数据库类型:" <<QSqlDatabase::drivers();
执行后的结果是:
支持的数据库类型: ("QSQLITE", "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7")
使用QSqlQuery类执行sql语句,对数据库插入一条记录:
/*用来执行sql语句的对象*/QSqlQuery query(sqldb);/*创建一个数据表*/query.exec(QObject::tr("create table student (id int primary key, name vchar ,age int)"));/*插入一条记录*/query.exec(QObject::tr("insert into student values (0,'李小明',18)"));
上面的语句在数据库sqldb创建了一个名为student的数据表,数据表里面包含了三个字段id、name、age,类型分别为int、vchar、int。数据库可以有多个数据表,数据表之间可有一对多的关系;数据表中的字段表示数据表中记录的内容项,如一个学生的id、name、age。数据库 > 数据表 > 记录 > 字段。
使用QSqlTableModel类绑定数据库,并将数据库里的内容显示在tableview控件上:
sqlmodel = new QSqlTableModel(this,sqldb);/*选择一个数据库里的其中一个数据表*/sqlmodel->setTable("student");/*设置修改tableview时是否立刻同步到数据库文件里*/sqlmodel->setEditStrategy(QSqlTableModel::OnManualSubmit);//使用submitAll() or revertAll() 手动同步/*选取整个表的所有行*/sqlmodel->select();ui->tableView->setModel(sqlmodel);ui->tableView->setContextMenuPolicy(Qt::CustomContextMenu);
实例化一个QSqlTableModel绑定了上面我们新建的数据库sqldb,然后需要选择数据库里面其中一个数据表,如果数据表不存在则会返回失败;使用sqlmodel->setEditStrategy可以设置编辑策略,修改是否立刻同步到数据库文;ui->tableView->setModel(sqlmodel)之后数据库sql里的数据表student所有的内容将在tableview上显示出来。
2.使用QSqlTableModel类的接口对数据库进行操作
1.新增记录
/*在表的最后添加一行*/sqlmodel->insertRow(rowCnt);/*设置新行的第0列的值*/sqlmodel->setData(sqlmodel->index(rowCnt,0),id);
rowCnt是所插入的行位置,id是新记录字段"id"的值;setData还可以对已存在的数据项进行修改。
2.删除记录
/*获取当前选中的行*/int curRow = ui->tableView->currentIndex().row();if( QMessageBox::critical(0 , tr("警告") ,tr("确认删除?"),QMessageBox::Yes,QMessageBox::No, 0) == QMessageBox::Yes){sqlmodel->removeRow(curRow);}
curRow是通过鼠标在tableview选中的行号,删除操作时弹框再次确认是否删除,确认后不会马上消失在tableview里,在它的前面的序号会出现一个叹号,如果点击撤就会恢复这条记录,如果点击提交才会真正在数据库里删除这条记录。
3.查询记录
if(!name.isEmpty() && id != -1){sqlmodel->setFilter(QObject::tr("name = '%1' id = '%2").arg(name).arg(id));}else if(!name.isEmpty()){sqlmodel->setFilter(QObject::tr("name = '%1'").arg(name));}else if(id != -1){sqlmodel->setFilter(QObject::tr("id = '%1'").arg(id));}sqlmodel->select(); //显示结果
可以同时进行名字name和id筛选,也可以单独一个字段的筛选;相当于SQL语句的:SELECT * FROM student WHERE name = "名字"。
4.排序
void MainWindow::AscendingButton(void)
{/*获取当前选中列*/int curCol = ui->tableView->currentIndex().column();sqlmodel->setSort(curCol,Qt::AscendingOrder);/*显示整个表的内容*/sqlmodel->select();
}void MainWindow::DescendingButton(void)
{/*获取当前选中列*/int curCol = ui->tableView->currentIndex().column();sqlmodel->setSort(curCol,Qt::DescendingOrder);/*显示整个表的内容*/sqlmodel->select();
}
curCol是鼠标当前选中的列,setSort需要两个参数(列号,升序/降序)。
5.其他操作
model->submitAll();//提交修改
model->revertAll(); //撤销修改
model->setEditStrategy(QSqlTableModel::OnManualSubmit);model->lastError();//获取最后一次的错误信息
OnManualSubmit表明需要submitAll()提交修改才能生效,没有提交之前可以revertAll()撤销修改,提交之后就不能进行撤销了;在操作数据库时,可能会出现条件不满足导致操作失败,我们可以通过lastError获取错误信息,进行错误定位。
关于QSqlTableModel的使用说明(QT上创建本地SQL)相关推荐
- 服务器如何新建计算机用户名和密码,服务器上创建本地用户账户的操作步骤
本地用户账户是工作在本地计算机上的,只有xp系统管理员才能在本地创建用户账户.服务器上创建本地账户lichimhui的操作步骤如下. 1.打开"计算机管理"窗口 执行[开始]丨[管 ...
- 如何在RHEL 9上创建本地Yum/DNF存储库
最近Red Hat发布了其最新的操作系统RHEL 9.RHEL 9满足了混合云的所有要求,它可以安装在物理服务器.虚拟机和容器镜像内部. 当我们没有订阅并且想要安装用于执行POC的软件包时,设置本地y ...
- nodejs 本地php服务器,node.js创建本地服务器详解
本文主要和大家分享node.js创建本地服务器详解,简易上手node.js后,我们就可以在自己电脑上创建本地服务器了.希望能帮助到大家. 一.先上代码.//请求Node.js自带的http模块. va ...
- git 创建本地分支及远程分支并且关联分支
git命令在创建本地分支及远程分支并且关联远程分支 为了便于版本的维护及管理将会不断的在master分支上创建出新的分支 大致分为: 首先切换到在要开的分支上――――>创建本地分支――――> ...
- Windows 10 怎么创建本地帐户?
在Windows 10系统中,您可以在计算机上创建一个本地帐户来执行任何任务.但是,与使用 Microsoft 帐户不同,您的设置.首选项和文件将保留在本地,以获得更安全和私密的体验.下面就给大家带来 ...
- git 创建本地仓库、远程仓库,上传项目
1.在本地想创建git仓库的地方创建本地仓库 首先右键打开 Git Bash Here,如果没有,请先安装git,下载地址:https://git-scm.com/downloads git init ...
- vsftpd创建本地yum仓库如何放在有账户密码验证上
之前在linux系统搭建的本地ftp的yum仓库,是匿名用户使用安装的,因客户检测漏洞说是ftp有弱口令,不让用匿名用户,只好改成有账户密码的验证了 1.修改ftp配置文件,不让匿名用户登录 # vi ...
- AIX 如何在 IBM AIX 上配置 YUM 并创建本地存储库
文章目录 一.如何在 IBM AIX 上配置 YUM 并创建本地存储库 1. 相关基础 1.1 什么是aix系统 2. aix系统上安装yum命令 3. 创建一个本地的 YUM 存储库步骤 二.参考 ...
- 「seetaface2」中科院人脸识别引擎seetaface2在Linux Qt上的配置教程
笔者的最新私人博客网站经过一段时间的努力,已经初期建设完毕,csdn上的博文会逐渐转移过去-- 欢迎访问呀- |=传=送=门=> 多多洛的博客 2016年,中科院山世光老师开源了其研发的seet ...
最新文章
- 神了!阿里资深大牛熬夜整理Python学习路线,终于开放了
- pytorch中lstm学习
- c语言十万以内超级素数,用C语言求素数的优化
- Java内存模型深度解析:重排序 --转
- YumRepo Error: All mirror URLs are not using问题解决
- DOS系统功能调用表(INT 21H)
- 【机器学习】XGBoost学习笔记
- Eclipse里选择Servlet Run As Server后,自动生成了哪些资源?
- mysql常用cmd指令_Mysql cmd 常用命令
- Ubuntu 加速安装Opencv 3.4.3
- 燕山大学计算机学院官网,燕山大学信息科学与工程学院(专业学位)计算机技术保研夏令营...
- linux已使用线程,在Linux中使用线程
- Unity3D常用知识点总结
- WinDirStat 电脑C盘分析神器
- 阿帕奇服务器配置文件,阿帕奇服务器基本参数配置
- 中国首位00后CEO惹事了,被指抄袭开源项目,素材图都不换
- android创建桌面快捷方式
- 【深度学习】计算机视觉(七)——使用GPU进行目标检测详解(上)
- 逆袭-2014年中电投篮球赛札记_01【转】
- kali2021.1安装pdtools挤牙膏式爬坑日记