本文介绍的是Qt数据库 QSqlTableModel实例操作,详细操作请先来看内容。与上篇内容衔接着,不顾本文也有关于上篇内容的链接。

Qt数据库 QSqlTableModel实例操作是本文所介绍的内容,我们先来看内容。在上一篇我们讲到只读的QSqlQueryModel也可以使其可编辑,但是很麻烦。Qt提供了操作单表的QSqlTableModel,如果我们需要对表的内容进行修改,那么我们就可以直接使用这个类。

相关联文章:

Qt数据库 QSqlQueryModel实例操作 上篇

Qt数据库 QSqlQueryModel实例操作 下篇

QSqlTableModel,该类提供了一个可读写单张SQL表的可编辑数据模型。我们下面就对其的几个常用功能进行介绍,分别是修改,插入,删除,查询,和排序。

在开始讲之前,我们还是新建Qt4 Gui Application工程,我这里工程名为tableModel ,然后选中QtSql模块,Base class选QWidget。工程建好后,添加C++ Header File ,命名为database.h,更改其内容如下:

 
#ifndef DATABASE_H  
#define DATABASE_H   #include <QSqlDatabase> 
#include <QSqlQuery> 
#include <QObject> 
static bool createConnection()  
{  
    QSqlDatabase db = QSqlDatabase::addDatabase(“QSQLITE”);  
    db.setDatabaseName(“database.db”);  
    if(!db.open()) return false;  
    QSqlQuery query;  
    query.exec(QObject::tr(“create table student (id int primary key, name vchar)”));  
    query.exec(QObject::tr(“insert into student values (0,’刘明’)”));  
    query.exec(QObject::tr(“insert into student values (1,’陈刚’)”));  
    query.exec(QObject::tr(“insert into student values (2,’王红’)”));  
    return true;  
}  
#endif // DATABASE_H 

为了在数据库中能使用中文,我们使用了QObject类的tr()函数。而在下面的main()函数中我们也需要添加相应的代码来支持中文。

然后将main.cpp的文件更改如下:

#include <QtGui/QApplication> 
#include “widget.h”  
#include “database.h”  
#include <QTextCodec> 
int main(int argc, char *argv[])  
{  
    QApplication a(argc, argv);  
    QTextCodec::setCodecForTr(QTextCodec::codecForLocale());  
    if(!createConnection())  
        return 1;  
    Widget w;  
    w.show();  
    return a.exec();  

下面我们打开widget.ui,设计界面如下:

其中的部件有Table View 和 Line Edit,其余是几个按钮部件。

然后在widget.h中加入头文件: #include <QSqlTableModel>

在private中声明对象:QSqlTableModel *model;

因为我们要在不同的函数中使用model对象,所以我们在这里声明它。

我们到widget.cpp文件中的构造函数里添加如下代码:

 
model = new QSqlTableModel(this);  
model->setTable(“student”);  
model->setEditStrategy(QSqlTableModel::OnManualSubmit);  
model->select(); //选取整个表的所有行  
// model->removeColumn(1); //不显示name属性列,如果这时添加记录,则该属性的值添加不上  
ui->tableView->setModel(model);  
// ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);   //使其不可编辑 

此时运行程序,效果如下:

可以看到,这个模型已经完全脱离了SQL语句,我们只需要执行select()函数就能查询整张表。上面有两行代码被注释掉了,你可以取消注释,测试一下它们的作用。

第一,修改操作。

1.我们进入“提交修改”按钮的单击事件槽函数,修改如下:

 
void Widget::on_pushButton_clicked() //提交修改  
{  
    model->database().transaction(); //开始事务操作  
    if (model->submitAll()) {  
        model->database().commit(); //提交  
    } else {  
        model->database().rollback(); //回滚  
        QMessageBox::warning(this, tr(“tableModel”),  
                             tr(“数据库错误: %1″)  
                             .arg(model->lastError().text()));  
    }  

这里用到了事务操作,真正起提交操作的是model->submitAll()一句,它提交所有更改。

2、进入“撤销修改”按钮单击事件槽函数,并更改如下:

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

它只有简单的一行代码。

我们需要在widget.cpp文件中添加头文件:

 
  1. #include <QMessageBox>
  2. #include <QSqlError>

此时运行程序,效果如下:

我们将“陈刚”改为“李强”,如果我们点击“撤销修改”,那么它就会重新改为“陈刚”,而当我们点击“提交修改”后它就会保存到数据库,此时再点击“撤销修改”就修改不回来了。

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

 
  1. model->setEditStrategy(QSqlTableModel::OnManualSubmit);

OnManualSubmit表明我们要提交修改才能使其生效。

第二,查询操作。

1.我们进入“查询”按钮的单击事件槽函数,更改如下:

 
void Widget::on_pushButton_7_clicked() //查询  
{  
    QString name = ui->lineEdit->text();  
    model->setFilter(QObject::tr(“name = ‘%1′”).arg(name)); //根据姓名进行筛选  
    model->select(); //显示结果  

我们使用setFilter()函数进行关键字筛选,这个函数是对整个结果集进行查询。为了使用变量,我们使用了QObject类的tr()函数。

2.我们进入“返回全表”按钮的单击事件槽函数,更改如下:

 
void Widget::on_pushButton_8_clicked() //返回全表  
{  
    model->setTable(“student”);   //重新关联表  
    model->select();   //这样才能再次显示整个表的内容  

为了再次显示整个表的内容,我们需要再次关联这个表。

运行效果如下:

我们输入一个姓名,点击“查询”按钮后,就可以显示该记录了。再点击“返回全表”按钮则返回。

第三,排序操作。

我们分别进入“按id升序排列”和“按id降序排列”按钮的单击事件槽函数,更改如下:

 
void Widget::on_pushButton_5_clicked() //升序  
{  
    model->setSort(0,Qt::AscendingOrder); //id属性,即第0列,升序排列  
    model->select();  
}  
void Widget::on_pushButton_6_clicked() //降序  
{  
    model->setSort(0,Qt::DescendingOrder);  
    model->select();  

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

运行程序,效果如下:

这是按下“按id降序排列”按钮后的效果。

第四,删除操作。

我们进入“删除选中行”按钮单击事件槽函数,进行如下更改:

 
void Widget::on_pushButton_4_clicked() //删除当前行  
{  
    int curRow = ui->tableView->currentIndex().row();  
    //获取选中的行  
    model->removeRow(curRow);  
    //删除该行  
    int ok = QMessageBox::warning(this,tr(“删除当前行!”),tr(“你确定”  
                                                           “删除当前行吗?”),  
                         QMessageBox::Yes,QMessageBox::No);  
    if(ok == QMessageBox::No)  
    {  
       model->revertAll(); //如果不删除,则撤销  
    }  
    else model->submitAll(); //否则提交,在数据库中删除该行  

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

运行效果如下:

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

第五,插入操作。

我们进入“添加记录”按钮的单击事件槽函数,更改如下:

 
void Widget::on_pushButton_3_clicked() //插入记录  

{  

    int rowNum = model->rowCount(); //获得表的行数  

   int id = 10;  

    model->insertRow(rowNum); //添加一行  

  model->setData(model->index(rowNum,0),id);  

   //model->submitAll(); //可以直接提交  

} 

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

运行程序,效果如下:

按下“添加记录”按钮后,就添加了一行,不过在该行的前面有个星号,如果我们按下“提交修改”按钮,这个星号就会消失。当然,如果我们将上面代码里的提交函数的注释去掉,也就不会有这个星号了。

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

本文章原创于www.yafeilinux.com

小结:Qt数据库 QSqlTableModel实例操作的内容介绍完了,希望本文读你有所帮助,耕读资料请参考编辑推荐。

Qt数据库 QSqlTableModel实例操作(转)的更多相关文章

  1. qt 数据库操作总结

    #include <QtSql>QT += sql QSqlDatabase类实现了数据库连接的操作QSqlQuery类用来执行SQL语句QSqlRecord类 封装数据库所有记录 第一: ...

  2. Qt实用技巧:使用QTableView、QSqlTableMode与QSqlDatabase对数据库数据进行操作

    本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78615800 Qt实用技巧:使用QTableView.QSqlTableMode与Q ...

  3. python操作mysql数据库的相关操作实例

    python操作mysql数据库的相关操作实例 # -*- coding: utf-8 -*- #python operate mysql database import MySQLdb #数据库名称 ...

  4. C#操作VFP的dbf数据库文件实例

    C#操作VFP的dbf数据库文件实例 新一篇: js获取网站跟路径 实例中分别使用Oledb和Odbc操作vfp数据库dbf文件,操作包括:读取,增删改. 已测试可直接使用,使用方法:下面代码分两个部 ...

  5. 创建WRAPPER时, SQL20076N 未对指定的操作启用数据库的实例。

    您可以通过运行DB2 UPDATE DBM CFG USING FEDERATED YES来设置这个参数.修改这个参数后,必须重新启动实例才会生效(DB2STOP/DB2START).所以你会出现你的 ...

  6. [Sqlite]--&gt;嵌入式数据库事务理解以及实例操作

    引子: 1. Sqlite在Windows.Linux 和 Mac OS X 上的安装过程 2,嵌入式数据库的安装.建库.建表.更新表结构以及数据导入导出等等具体过程记录 SQLite 事务(Tran ...

  7. 使用spring框架的JdbcTemplate实现对Oracle数据库的简单操作实例

    最近实现了一个小功能,针对Oracle数据库两张关联表进行查询和修改,因为比较简单,所以选择了spring框架里的JdbcTemplate.JdbcTemplate算是老古董了,是当年spring为了 ...

  8. 【转】Qt数据库总结

    转自:http://blog.chinaunix.net/uid-25201977-id-3014100.html #include <QtSql>QT += sql QSqlDataba ...

  9. Qt数据库(sqlite) — 总结

    #include <QtSql>QT += sql QSqlDatabase类实现了数据库连接的操作QSqlQuery类用来执行SQL语句QSqlRecord类 封装数据库所有记录 第一: ...

随机推荐

  1. java 数据结构(十二):Collections工具类的使用

    Collections工具类1.作用:操作Collection和Map的工具类 2.常用方法:reverse(List):反转 List 中元素的顺序shuffle(List):对 List 集合元素 ...

  2. Django -MD5密码加密与登录

    直接贴代码 login_reg.py from django.shortcuts import render, redirect from web.forms.login_reg import Reg ...

  3. 汇总我在IDEA中使用Maven导包遇到的问题

    看吐了吗?我是真吐了 真正遇到这些问题的朋友看到这,是不是有种找到知音的感觉,别怕,你不是在一个人战斗,苦逼的日子里,还有个我陪你一起苦逼,吐了吐了,这问题不知道耗费了我多久的时间,百度好多也解决不了 ...

  4. [并发编程] -- 内存模型(针对JSR-133内存模型)篇

    并发编程模型 1.两个关键问题 1)线程之间如何通信 共享内存程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信 消息传递程之间没有公共状态,线程之间必须通过发送消息来显式进行通信 2) ...

  5. .Net、ASP.Net、C#、VisualStudio之间的关系是什么

    .Net一般指的是.NetFramework,提供了基础的.Net类,这些类可以被任何一种.Net编程语言调 用,.NetFramework还提供了 CLR.JIT.GC等基础功能. ASP.Net是 ...

  6. Pollard-Rho

    \(code:\) ll pri[12]={2,3,5,7,11,13,17,19}; ll mul(ll x,ll y,ll mod) { ll c=(long double)x*y/mod+0.5 ...

  7. Netty 学习笔记(2) ------ 数据传输载体ByteBuf

    Netty中读写以ByteBuf为载体进行交互 ByteBuf的结构 ByteBuf以readerIndex和writerIndex划分为三块区域,废弃字节,可读字节,可写字节.每次从ByteBuf读 ...

  8. Python快速入门PDF高清完整版免费下载|百度云盘

    百度云盘:Python快速入门PDF高清完整版免费下载 提取码:w5y8 内容简介 这是一本Python快速入门书,基于Python 3.6编写.本书分为4部分,第一部分讲解Python的基础知识,对 ...

  9. 想理解JVM看了这篇文章,就知道了!

    前言 ​ 本章节属于Java进阶系列,前面关于设计模式讲解完了,有兴趣的童鞋可以翻看之前的博文,后面会讲解JVM的优化,整个系列会完整的讲解整个java体系与生态相关的中间件知识.本次将对jvm有更深 ...

  10. VIM的常用快捷方式(尽量简洁,删去能组合实现的且不易记的)

    vi可以分为三种状态,分别是一般模式.编辑模式和命令行模式 1一般模式:以vi打开一个文件就直接进入一般模式了(这是默认的模式).在这个模式中, 你可以使用上下左右按键来移动光标,你可以使用删除字符或 ...