qt之qtcustomplotsqlmodel是个什么类

中国领先的IT技术网站
51CTO旗下网站
Qt数据库 QSqlTableModel实例操作
本文介绍的是Qt数据库 QSqlTableModel实例操作,详细操作请先来看内容。与上篇内容衔接着,不顾本文也有关于上篇内容的链接。
作者:佚名来源:互联网| 14:01
Qt数据库 QSqlTableModel实例操作是本文所介绍的内容,我们先来看内容。在上一篇我们讲到只读的QSqlQueryModel也可以使其可编辑,但是很麻烦。Qt提供了操作单表的QSqlTableModel,如果我们需要对表的内容进行修改,那么我们就可以直接使用这个类。
相关联文章:
QSqlTableModel,该类提供了一个可读写单张SQL表的可编辑数据模型。我们下面就对其的几个常用功能进行介绍,分别是修改,插入,删除,查询,和排序。
在开始讲之前,我们还是新建Qt4 Gui Application工程,我这里工程名为tableModel ,然后选中QtSql模块,Base class选QWidget。工程建好后,添加C++ Header File ,命名为database.h,更改其内容如下:
#ifndef&DATABASE_H &#define&DATABASE_H &&#include&&#include&&#include&&static&bool&createConnection() &{ &&&&&QSqlDatabase&db&=&QSqlDatabase::addDatabase(&QSQLITE&); &&&&&db.setDatabaseName(&database.db&); &&&&&if(!db.open())&return& &&&&&QSqlQuery& &&&&&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& &} &#endif&//&DATABASE_H&
为了在数据库中能使用中文,我们使用了QObject类的tr()函数。而在下面的main()函数中我们也需要添加相应的代码来支持中文。
然后将main.cpp的文件更改如下:
#include&/QApplication&#include&&widget.h& &#include&&database.h& &#include&&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对象,所以我们在这里声明它。
我们到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&P) &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.arg(model-lastError().text())); &&&&&} &}&
这里用到了事务操作,真正起提交操作的是model-&submitAll()一句,它提交所有更改。
2、进入&撤销修改&按钮单击事件槽函数,并更改如下:
void&Widget::on_pushButton_2_clicked()&//撤销修改 &{ &&&&&&model-revertAll(); &}&
它只有简单的一行代码。
我们需要在widget.cpp文件中添加头文件:
#include&&#include&&
此时运行程序,效果如下:
我们将&陈刚&改为&李强&,如果我们点击&撤销修改&,那么它就会重新改为&陈刚&,而当我们点击&提交修改&后它就会保存到数据库,此时再点击&撤销修改&就修改不回来了。
可以看到,这个模型可以将所有修改先保存到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语句,就算你不怎么懂数据库,也可以利用它进行大部分常用的操作。我们也看到了,这个模型提供了缓冲区,可以先将修改保存起来,当我们执行提交函数时,再去真正地修改数据库。当然,这个模型比前面的模型更高级,前面讲的所有操作,在这里都能执行。
本文章原创于
小结:Qt数据库 QSqlTableModel实例操作的内容介绍完了,希望本文读你有所帮助,耕读资料请参考编辑推荐。
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
热点热点热点关注热点
24H热文一周话题本月最赞
讲师:90327人学习过
讲师:30681人学习过
讲师:27428人学习过
精选博文论坛热帖下载排行
本书全面介绍了Ubuntu Linux的相关知识,内容详实,论述清晰。主要内容包括Ubuntu介绍、文件系统管理、进程管理、压缩与查询系统、Shel...
订阅51CTO邮刊 上传我的文档
 下载
 收藏
粉丝量:134
JAVA工程师,擅长软件开发,软件测试等。
 下载此文档
如何创建一个Qt_Creator工程模板或类模板
下载积分:500
内容提示:如何创建一个Qt_Creator工程模板或类模板
文档格式:DOCX|
浏览次数:168|
上传日期: 14:58:38|
文档星级:
全文阅读已结束,如果下载本文需要使用
 500 积分
下载此文档
该用户还上传了这些文档
如何创建一个Qt_Creator工程模板或类模板
关注微信公众号网站已改版,请使用新地址访问:
sql QT数据库程序设计
用QT类库实现的SQL 。 Linux-Unix program 240万源代码下载-
&文件名称: sql
& & & & &&]
&&所属分类:
&&开发工具: C++
&&文件大小: 1258 KB
&&上传时间:
&&下载次数: 183
&&提 供 者:
&详细说明:QT数据库程序设计
用QT类库实现的SQL程序。-QT Programming with QT database class library to achieve the SQL procedure.
文件列表(日期:~)(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&sql&&...\cachedtable&&...\...........\&&...\...........\&&...\...........\release&&...\...........\&&...\...........\&&...\...........\tmp&&...\...........\...\obj&&...\...........\...\...\release_shared&&...\...........\...\...\..............\cachedtable.intermediate.manifest&&...\&&...\drilldown&&...\.........\&&...\.........\&&...\.........\&&...\.........\&&...\.........\images&&&&&&&&&&&&...\.........\......\redwood.png&&...\.........\&&...\.........\&&&&...\.........\&&...\.........\release&&...\.........\tmp&&...\.........\...\obj&&...\.........\...\...\release_shared&&...\.........\...\...\..............\drilldown.intermediate.manifest&&...\.........\&&...\.........\&&...\masterdetail&&...\............\albumdetails.xml&&...\............\&&...\............\&&...\............\&&...\............\images&&&&&&...\............\&&...\............\&&...\............\&&...\............\&&...\............\masterdetail.qrc&&...\............\release&&...\............\tmp&&...\............\...\obj&&...\............\...\...\release_shared&&...\............\...\...\..............\masterdetail.intermediate.manifest&&...\querymodel&&...\..........\&&...\..........\&&...\..........\&&...\..........\&&...\..........\&&...\..........\&&...\..........\release&&...\..........\tmp&&...\..........\...\obj&&...\..........\...\...\release_shared&&...\..........\...\...\..............\querymodel.intermediate.manifest&&...\&&...\relationaltablemodel&&...\....................\&&...\....................\&&...\....................\release&&...\....................\tmp&&...\....................\...\obj&&...\....................\...\...\release_shared&&...\....................\...\...\..............\relationaltablemodel.intermediate.manifest&&...\&&...\tablemodel&&...\..........\release&&...\..........\&&...\..........\&&...\..........\tmp&&...\..........\...\obj&&...\..........\...\...\release_shared&&...\..........\...\...\..............\tablemodel.intermediate.manifest
&近期下载过的用户:
&相关搜索:
&输入关键字,在本站240万海量源码库中尽情搜索:
&[] - linux下的FFT 频谱分析,带源码,可以实现很多功能
&[] - Qt SQL Browse是一个简单的、泛化GUI数据库浏览器前端。该工具是一个非常简单的Qt数据库类的汇集器。数据库抽象由Qt数据库驱动程序提供
&[] - linux下网络通信套接字编程,可完成两机通信
&[] - 使用Qt与MySQL C API开发MySQL查询器
&[] - Renderer filter that displays sound data as waveforms.
&[] - microsoft公司的视频会议系统程序源码,非常的复杂,功能十分强大.
&[] - C++ GUI Programming with Qt 4中文版
&[] - 使用 C++ 写的人事管理系统,界面部分和数据库操作都是使用 Qt 来制作
&[] - Linux环境下的Modbus驱动程序源码,里面还有一个小例子(This is a Linux kernel driver (2.2.19+ 2.4+) for the Modicon SA85 ISA and PCI-85 cards. It is written in C and include
&[] - 一款基于QT开发的太空模拟设计游戏,空格键发射子弹,上下左右移动。附带完整源码。如何使用QSqlTableModel执行多表查询??【qt吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:36,366贴子:
如何使用QSqlTableModel执行多表查询??收藏
有没有做过的,话说小吧们都去哪儿了,又有QT语音的帖子了
阿里云云市场提供功能丰富的发者必备软件,帮助用户快速简便的操作和管理云主机服务器以及虚拟主机的管理系统
searchModel-&setTable("isbn_tab, book_info_tab"); searchModel-&setFilter(QObject::tr("isbn_tab.id = book_info_tab.ISBN_id AND isbn_tab.name = '%1'").arg(search_bookName));searchModel-&select();这是代码, 错误显示无法执行的主键列表马上要检查了,拖延症真是伤不起,先做其他部分吧
原来QSqlTableModel没有设置select的功能
想到了,每个表对应一个model,tableview里面数据显示在第列是可以自己设置的
model = new QSqlTableModel();
model-&setQuery(&SELECT tmp.id, table.book FROM tmp, table WHERE tmp.id=table.id&); ui-&tableView-&setModel(model);
登录百度帐号推荐应用Qt 数据库之 QSqlRelationalTableModel - 百友ABC的博客 - CSDN博客
Qt 数据库之 QSqlRelationalTableModel
QSqlRelationalTableModel *model;
&model-&setTable(&employee&);
//设置操作的表
model-&setEditStrategy(QSqlTableModel::OnManualSubmit);&
&//QSqlTableModel::OnManualSubmit是枚举类型,在这里的意思是:模型中的所有更改将被缓存,直到submitAll()或revertAll()!
model-&setRelation(2, QSqlRelation(&city&, &id&, &name&));&
//2表示employee表中第2个段中成员将使用热键,city在这里是表名(即热键将使用city这个表,id是索引,name是热键显示的内容)。
model-&setRelation(3, QSqlRelation(&country&, &id&, &name&));
model-&setHeaderData(0, Qt::Horizontal, QObject::tr(&ID&)); & //设置employee表第一个段的别名
&model-&setHeaderData(1, Qt::Horizontal, QObject::tr(&Name&)); &//第二个段的别名
&model-&setHeaderData(2, Qt::Horizontal, QObject::tr(&City&));//第三个段的别名
&model-&setHeaderData(3, Qt::Horizontal, QObject::tr(&Country&));//第四个段的段的别名
& model-&select();
//往表中填充内容
看到这里可知一共有三个表,分别是employee,city,country,这三个表的创建过程如下如下:
//创建表emlpoyee,有id,name,city,country这几个段
query.exec(&create table employee(id int primary key, name varchar(20), city int, country int)&);
query.exec(&insert into employee values(1, 'Espen', <span style="color:#00, <span style="color:#)&);
query.exec(&insert into employee values(2, 'Harald', <span style="color:#000, <span style="color:#)&);
query.exec(&insert into employee values(3, 'Sam', <span style="color:#0, <span style="color:#)&);
// 创建表city
query.exec(&create table city(id int, name varchar(20))&);
query.exec(&insert into city values(100, 'San Jose')&);
query.exec(&insert into city values(5000, 'Oslo')&);
query.exec(&insert into city values(80000, 'Munich')&);
//创建表country
query.exec(&create table country(id int, name varchar(20))&);
query.exec(&insert into country values(1, 'USA')&);
query.exec(&insert into country values(47, 'Norway')&);
query.exec(&insert into country values(49, 'Germany')&);程序输出结果如下:
在employee中id为1的项city&#20540;为5000,而它在表中对应默认的city为“Oslo”,“Oslo”对应的id为5000,这里说明id作为一个索引&#20540;,employee中的city段应该个city表中的id是一一对应的。
相关文章推荐

我要回帖

更多关于 qt sqltablemodel 的文章

 

随机推荐