Qt数据库 QSqlTableModel实例操作
2015-06-16 11:41
615 查看
http://mobile.51cto.com/symbian-271567_all.htm
本文介绍的是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,更改其内容如下:
为了在数据库中能使用中文,我们使用了QObject类的tr()函数。而在下面的main()函数中我们也需要添加相应的代码来支持中文。
然后将main.cpp的文件更改如下:
下面我们打开widget.ui,设计界面如下:
其中的部件有Table View 和 Line Edit,其余是几个按钮部件。
然后在widget.h中加入头文件: #include <QSqlTableModel>
在private中声明对象:QSqlTableModel *model;
因为我们要在不同的函数中使用model对象,所以我们在这里声明它。
我们到widget.cpp文件中的构造函数里添加如下代码:
此时运行程序,效果如下:
可以看到,这个模型已经完全脱离了SQL语句,我们只需要执行select()函数就能查询整张表。上面有两行代码被注释掉了,你可以取消注释,测试一下它们的作用。
第一,修改操作。
1.我们进入“提交修改”按钮的单击事件槽函数,修改如下:
这里用到了事务操作,真正起提交操作的是model->submitAll()一句,它提交所有更改。
2、进入“撤销修改”按钮单击事件槽函数,并更改如下:
它只有简单的一行代码。
我们需要在widget.cpp文件中添加头文件:
此时运行程序,效果如下:
我们将“陈刚”改为“李强”,如果我们点击“撤销修改”,那么它就会重新改为“陈刚”,而当我们点击“提交修改”后它就会保存到数据库,此时再点击“撤销修改”就修改不回来了。
可以看到,这个模型可以将所有修改先保存到model中,只有当我们执行提交修改后,才会真正写入数据库。当然这也是因为我们在最开始设置了它的保存策略:
OnManualSubmit表明我们要提交修改才能使其生效。
第二,查询操作。
1.我们进入“查询”按钮的单击事件槽函数,更改如下:
我们使用setFilter()函数进行关键字筛选,这个函数是对整个结果集进行查询。为了使用变量,我们使用了QObject类的tr()函数。
2.我们进入“返回全表”按钮的单击事件槽函数,更改如下:
为了再次显示整个表的内容,我们需要再次关联这个表。
运行效果如下:
我们输入一个姓名,点击“查询”按钮后,就可以显示该记录了。再点击“返回全表”按钮则返回。
第三,排序操作。
我们分别进入“按id升序排列”和“按id降序排列”按钮的单击事件槽函数,更改如下:
我们这里使用了setSort()函数进行排序,它有两个参数,第一个参数表示按第几个属性排序,表头从左向右,最左边是第0个属性,这里就是id属性。第二个参数是排序方法,有升序和降序两种。
运行程序,效果如下:
这是按下“按id降序排列”按钮后的效果。
第四,删除操作。
我们进入“删除选中行”按钮单击事件槽函数,进行如下更改:
这里删除行的操作会先保存在model中,当我们执行了submitAll()函数后才会真正的在数据库中删除该行。这里我们使用了一个警告框来让用户选择是否真得要删除该行。
运行效果如下:
我们点击第二行,然后单击“删除选中行”按钮,出现了警告框。这时你会发现,表中的第二行前面出现了一个小感叹号,表明该行已经被修改了,但是还没有真正的在数据库中修改,这时的数据有个学名叫脏数据(Dirty Data)。当我们按钮“Yes”按钮后数据库中的数据就会被删除,如果按下“No”,那么更改就会取消。
第五,插入操作。
我们进入“添加记录”按钮的单击事件槽函数,更改如下:
我们在表的最后添加一行,因为在student表中我们设置了id号是主键,所以这里必须使用setData函数给新加的行添加id属性的值,不然添加行就不会成功。这里可以直接调用submitAll()函数进行提交,也可以利用“提交修改”按钮进行提交。
运行程序,效果如下:
按下“添加记录”按钮后,就添加了一行,不过在该行的前面有个星号,如果我们按下“提交修改”按钮,这个星号就会消失。当然,如果我们将上面代码里的提交函数的注释去掉,也就不会有这个星号了。
可以看到这个模型很强大,而且完全脱离了SQL语句,就算你不怎么懂数据库,也可以利用它进行大部分常用的操作。我们也看到了,这个模型提供了缓冲区,可以先将修改保存起来,当我们执行提交函数时,再去真正地修改数据库。当然,这个模型比前面的模型更高级,前面讲的所有操作,在这里都能执行。
本文章原创于www.yafeilinux.com
小结:Qt数据库 QSqlTableModel实例操作的内容介绍完了,希望本文读你有所帮助,耕读资料请参考编辑推荐。
本文介绍的是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文件中添加头文件:
#include <QMessageBox> #include <QSqlError>
此时运行程序,效果如下:
我们将“陈刚”改为“李强”,如果我们点击“撤销修改”,那么它就会重新改为“陈刚”,而当我们点击“提交修改”后它就会保存到数据库,此时再点击“撤销修改”就修改不回来了。
可以看到,这个模型可以将所有修改先保存到model中,只有当我们执行提交修改后,才会真正写入数据库。当然这也是因为我们在最开始设置了它的保存策略:
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实例操作的内容介绍完了,希望本文读你有所帮助,耕读资料请参考编辑推荐。
相关文章推荐
- MQTT IM开发
- Qt QLineEdit 限制输入类型以及大小Int 和double
- VS2010/VS2012/VS2013+QT5编程之开发环境配置
- qt数据库总结
- 如何查看QTP对象的属性列表
- Qt数据库sqlite总结
- ubuntu安装QT4.8.0 和安装QT库
- 读Pyqt4教程,带你入门Pyqt4 _010
- qt 子 widget如果想干净的close 需要先delete wa
- PyQt按钮右键菜单
- 读Pyqt4教程,带你入门Pyqt4 _009
- qml 嵌套到 qt的对话框上
- qt5 QString转char *
- 设置QTP脚本中每个步骤之间的延时时间
- Qt在windowsXp环境的安装和配置
- qt学习笔记001 2015/6/15
- vs2013下qt工程设置exe图标
- tiny4412 tslib ts_test显示界面,但触摸无反应,运行qt4命令触摸有反应
- QT QTableWidget不可编辑
- windows下 qt5&vs2010 在qtCreator下中文乱码