[Qt教程] 数据库(五)SQL表格模型QSqlTableModel

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

环境:Windows Xp + Qt 4.8.4+QtCreator 2.6.2

目录
一、创建数据库
二、修改操作
三、查询操作
四、排序操作
五、删除操作
六、插入操作

正文

一、创建数据库

1.新建Qt Gui应用,项目名称为tableModel,基类QMainWindow,类名MainWindow。

2.完成后打开tableModel.pro文件,将第一行代码更改为:
QT += coregui sql
然后保存文件。

3.向项目中添加新的C++头文件,名称为connection.h。完成后将其内容更改如下:
#ifndef CONNECTION_H
#define CONNECTION_H
#include <QSqlDatabase>
#include <QSqlQuery>
static bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("database.db");
if(!db.open()) return false;
QSqlQuery query;
query.exec(QString(
"create tablestudent (id int primary key, name vchar)"));
query.exec(QString("insert into student values (0,‘刘明‘)"));
query.exec(QString("insert into student values (1,‘陈刚‘)"));
query.exec(QString("insert into student values (2,‘王红‘)"));
return true;
}
#endif // CONNECTION_H
这里因为语句中使用了中文,所以使用了QString()进行编码转换,这个还需要在main()函数中设置编码。

4.下面将main.cpp文件更改如下:
#include "mainwindow.h"
#include <QApplication>
#include "connection.h"
#include <QTextCodec>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec::setCodecForTr(QTextCodec::codecForName("utf8"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
if(!createConnection())
return 1;
MainWindow w;
w.show();

return a.exec();

}
这里的setCodecForCStrings()就是用来设置字符串编码的。

5.下面进入设计模式,向窗口上拖入Label、Push Button、Line Edit和Table View等部件,进行界面设计,效果如下图所示。
25-1.jpg

6.完成后到mainwindow.H w件中,先包含头文件:
#include <QSqlTableModel>
然后添加私有对象声明:
QSqlTableModel *model;

7.到mainwindow.cpp,在构造函数添加如下代码:
model = new QSqlTableModel(this);
model->setTable("student");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select(); //选取整个表的所有行
//不显示name属性列,如果这时添加记录,则该属性的值添加不上
// model->removeColumn(1);
ui->tableView->setModel(model);
//使其不可编辑
//ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);

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

运行程序,效果如下图所示。
25-3.jpg

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

二、修改操作

1.我们进入“提交修改”按钮的单击信号槽,更改如下:
void MainWindow::on_pushButton_3_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 MainWindow::on_pushButton_4_clicked()
{
model->revertAll();
}

3.在mainwindow.cpp文件中包含头文件:
#include <QMessageBox>
#include <QSqlError>

4.现在运行程序,我们将“陈刚”改为“李强”,如果我们点击“撤销修改”,那么它就会重新改为“陈刚”,而当我们点击“提交修改”后它就会保存到数据库,此时再点击“撤销修改”就修改不回来了。
可以看到,这个模型可以将所有修改先保存到model中,只有当我们执行提交修改后,才会真正写入数据库。当然这也是因为我们在最开始设置了它的保存策略:
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
这里的OnManualSubmit表明我们要提交修改才能使其生效。

三、查询操作

1.进入“查询”按钮的单击信号槽,更改如下:
void MainWindow::on_pushButton_clicked()
{
QString name = ui->lineEdit->text();
//根据姓名进行筛选
model->setFilter(QString("name = ‘%1‘").arg(name));
//显示结果
model->select();
}
使用setFilter()函数进行关键字筛选,这个函数是对整个结果集进行查询。

2.进入“显示全表”按钮的单击信号槽,更改如下:
void MainWindow::on_pushButton_2_clicked()
{
model->setTable("student"); //重新关联表
model->select(); //这样才能再次显示整个表的内容
}
为了再次显示整个表的内容,我们需要再次关联这个表。

3.下面运行程序,输入一个姓名,点击“查询”按钮后,就可以显示该记录了。再点击“显示全表”按钮则返回。如下图所示。
25-4.jpg

四、排序操作

分别进入“按id升序排序”和“按id降序排序”按钮的单击信号槽,更改如下:
// 升序
void MainWindow::on_pushButton_7_clicked()
{
model->setSort(0, Qt::AscendingOrder); //id属性即第0列,升序排列
model->select();
}
// 降序
void MainWindow::on_pushButton_8_clicked()
{
model->setSort(0, Qt::DescendingOrder);
model->select();
}
这里使用了setSort()函数进行排序,它有两个参数,第一个参数表示按第几个属性排序,表头从左向右,最左边是第0个属性,这里就是id属性。第二个参数是排序方法,有升序和降序两种。运行程序,效果如下图所示。
25-5.jpg

五、删除操作

我们进入“删除选中行”按钮的单击信号槽,更改如下:
void MainWindow::on_pushButton_6_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()函数后才会真正的在数据库中删除该行。这里我们使用了一个警告框来让用户选择是否真得要删除该行。运行程序,效果如下图所示。
25-6.jpg

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

六、插入操作

   我们进入“添加记录”按钮的单击信号槽,更改如下:

void MainWindow::on_pushButton_5_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()函数进行提交,也可以利用“提交修改”按钮进行提交。运行程序,效果如下图所示。
25-7.jpg

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

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

原文地址:https://blog.51cto.com/14527980/2437473

时间: 2024-08-30 09:58:39

[Qt教程] 数据库(五)SQL表格模型QSqlTableModel的相关文章

[Qt教程] 数据库(六)SQL关系表格模型QSqlRelationalTableMode

导语QSqlRelationalTableModel继承自QSqlTableModel,并且对其进行了扩展,提供了对外键的支持.一个外键就是一个表中的一个属性和其他表中的主键属性之间的一对一的映射.例如,student表中的course属性对应的是course表中的id属性,那么就称属性course是一个外键.因为这里的course属性的值是一些数字,这样的显示很不友好,使用关系表格模型,就可以将它显示为course表中的name属性的值. 环境:Windows Xp + Qt 4.8.4+Qt

Spring Cloud Stream教程(五)编程模型

本节介绍Spring Cloud Stream的编程模型.Spring Cloud Stream提供了许多预定义的注释,用于声明绑定的输入和输出通道,以及如何收听频道. 声明和绑定频道 触发绑定@EnableBinding 您可以将Spring应用程序转换为Spring Cloud Stream应用程序,将@EnableBinding注释应用于应用程序的配置类之一.@EnableBinding注释本身使用@Configuration进行元注释,并触发Spring Cloud Stream基础架构

[Qt教程] 第24篇 数据库(四)SQL查询模型QSqlQueryModel

导语在上一篇的最后我们讲到,Qt中使用了自己的机制来避免使用SQL语句,为我们提供了更简单的数据库操作及数据显示模型,分别是只读的QSqlQueryModel,操作单表的QSqlTableModel和以及可以支持外键的QSqlRelationalTableModel.这次我们先讲解QSqlQueryModel. 环境:Windows Xp + Qt 4.8.4+Qt Creator2.6.2 目录一.简单的查询操作二.QSqlQueryModel常用操作三.创建自定义QSqlQueryModel

atitit.sql server2008导出导入数据库大的表格文件... oracle mysql

atitit.sql server2008导出导入数据库大的表格文件... 1. 超过80M的文件是不能在查询分析器中执行的 1 2. Oracle ,mysql大的文件导入 1 2.1. 使用sql文件 1 2.2. 使用dmp二进制文件(oracle only) 1 2.3. Other 导出txt,excel在导入( 不推荐),常常不能导入 1 3. 本机导入 1 4. 远程导入 2 5. syaolon msg 2 6. 参考 3 1. 超过80M的文件是不能在查询分析器中执行的 imE

QT 操作数据库

整理一下 QT 操作数据库的一些要点,以备以后的查询学习(主要是操作 mysql ). 首先,要查询相关的驱动是否已经装好了,可以用以下的程序进行验证: #include <QtCore/QCoreApplication> #include <QSqlDatabase> #include <QDebug> #include <QStringList> int main(int argc, char *argv[]) { QCoreApplication a(

SqlServer教程:经典SQL语句集锦

SQL分类: DDL-数据定义语言(CREATE,ALTER,DROP,DECLARE) DML-数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL-数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK) 首先,简要介绍基础语句: 1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份sql server --- 创建 备份数据的 deviceUSE

qt 5 数据库操作(mysql)

其实大家都知道,QT5以上的都自带了数据库驱动,所以呢,基本上可以直接使用,于是如果想知道怎么连接数据库,请参考这位大神写的.http://qtdebug.com/DB-AccessMySQL.html 关于数据库操作 QSqlDatabase db = QSqldatabase::addDataBase("QMYSQL"); //博主用的mysql db.setHostName("127.0.0.1");                              

JSP简明教程(五):高级特性

JSP过滤器 过滤器的作用是给web请求增加额外的逻辑,每个页面可以被多个过滤器进行处理.过滤器需要在web.xml文件中进行定义,语法如下.过滤器的执行顺序与filter-mapping的定义顺序相同. <filter> <filter-name>FilterName</filter-name> <filter-class>TestFilter</filter-name> <init-param> <param-name>

Oracle数据库常用Sql语句大全

一,数据控制语句 (DML) 部分 1.INSERT  (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, --) VALUES ( 值1, 值2, --); INSERT INTO 表名(字段名1, 字段名2, --)  SELECT (字段名1, 字段名2, --) FROM 另外的表名; 字符串类型的字段值必须用单引号括起来, 例如: 'GOOD DAY' 如果字段值里包含单引号' 需要进行字符串转换, 我们把它替换成两个单引号''. 字符串类型的字段值超过