前言:通常我们操作数据库时,需要使用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(); //显示结果

可以同时进行名字nameid筛选,也可以单独一个字段的筛选;相当于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)相关推荐

  1. 服务器如何新建计算机用户名和密码,服务器上创建本地用户账户的操作步骤

    本地用户账户是工作在本地计算机上的,只有xp系统管理员才能在本地创建用户账户.服务器上创建本地账户lichimhui的操作步骤如下. 1.打开"计算机管理"窗口 执行[开始]丨[管 ...

  2. 如何在RHEL 9上创建本地Yum/DNF存储库

    最近Red Hat发布了其最新的操作系统RHEL 9.RHEL 9满足了混合云的所有要求,它可以安装在物理服务器.虚拟机和容器镜像内部. 当我们没有订阅并且想要安装用于执行POC的软件包时,设置本地y ...

  3. nodejs 本地php服务器,node.js创建本地服务器详解

    本文主要和大家分享node.js创建本地服务器详解,简易上手node.js后,我们就可以在自己电脑上创建本地服务器了.希望能帮助到大家. 一.先上代码.//请求Node.js自带的http模块. va ...

  4. git 创建本地分支及远程分支并且关联分支

    git命令在创建本地分支及远程分支并且关联远程分支 为了便于版本的维护及管理将会不断的在master分支上创建出新的分支 大致分为: 首先切换到在要开的分支上――――>创建本地分支――――> ...

  5. Windows 10 怎么创建本地帐户?

    在Windows 10系统中,您可以在计算机上创建一个本地帐户来执行任何任务.但是,与使用 Microsoft 帐户不同,您的设置.首选项和文件将保留在本地,以获得更安全和私密的体验.下面就给大家带来 ...

  6. git 创建本地仓库、远程仓库,上传项目

    1.在本地想创建git仓库的地方创建本地仓库 首先右键打开 Git Bash Here,如果没有,请先安装git,下载地址:https://git-scm.com/downloads git init ...

  7. vsftpd创建本地yum仓库如何放在有账户密码验证上

    之前在linux系统搭建的本地ftp的yum仓库,是匿名用户使用安装的,因客户检测漏洞说是ftp有弱口令,不让用匿名用户,只好改成有账户密码的验证了 1.修改ftp配置文件,不让匿名用户登录 # vi ...

  8. AIX 如何在 IBM AIX 上配置 YUM 并创建本地存储库

    文章目录 一.如何在 IBM AIX 上配置 YUM 并创建本地存储库 1. 相关基础 1.1 什么是aix系统 2. aix系统上安装yum命令 3. 创建一个本地的 YUM 存储库步骤 二.参考 ...

  9. 「seetaface2」中科院人脸识别引擎seetaface2在Linux Qt上的配置教程

    笔者的最新私人博客网站经过一段时间的努力,已经初期建设完毕,csdn上的博文会逐渐转移过去-- 欢迎访问呀- |=传=送=门=> 多多洛的博客 2016年,中科院山世光老师开源了其研发的seet ...

最新文章

  1. 神了!阿里资深大牛熬夜整理Python学习路线,终于开放了
  2. pytorch中lstm学习
  3. c语言十万以内超级素数,用C语言求素数的优化
  4. Java内存模型深度解析:重排序 --转
  5. YumRepo Error: All mirror URLs are not using问题解决
  6. DOS系统功能调用表(INT 21H)
  7. 【机器学习】XGBoost学习笔记
  8. Eclipse里选择Servlet Run As Server后,自动生成了哪些资源?
  9. mysql常用cmd指令_Mysql cmd 常用命令
  10. Ubuntu 加速安装Opencv 3.4.3
  11. 燕山大学计算机学院官网,燕山大学信息科学与工程学院(专业学位)计算机技术保研夏令营...
  12. linux已使用线程,在Linux中使用线程
  13. Unity3D常用知识点总结
  14. WinDirStat 电脑C盘分析神器
  15. 阿帕奇服务器配置文件,阿帕奇服务器基本参数配置
  16. 中国首位00后CEO惹事了,被指抄袭开源项目,素材图都不换
  17. android创建桌面快捷方式
  18. 【深度学习】计算机视觉(七)——使用GPU进行目标检测详解(上)
  19. 逆袭-2014年中电投篮球赛札记_01【转】
  20. kali2021.1安装pdtools挤牙膏式爬坑日记

热门文章

  1. [转]资深CTO:关于技术团队打造与管理的10问10答
  2. k8s拉取私有仓库镜像:通过config.json文件或命令行来创建secret(docker-registry)
  3. 什么是 Webhook?
  4. Go gin环境搭建
  5. Spark常规性能调优三:并行度调节
  6. hbase集群无法重启的可能原因之一及解决办法
  7. Linux创建文件系统及设置分区卷标
  8. JAVA中如何确保N个线程可以访问N个资源,但同时又不导致死锁?
  9. MySQL索引下推视频讲解
  10. 网络操作系统_全球首个大网级网络操作系统CNOS正式发布