QSqlQueryModel类为SQL的结果集提供了一个只读的数据模型,下面我们先利用这个类进行一个最简单的操作。

我们新建Qt4 Gui Application工程,我这里工程名为queryModel ,然后选中QtSql模块,Base class选QWidget。工程建好后,添加C++ Header File ,命名为database.h,更改其内容如下:
1.           #ifndef DATABASE_H  
2.            
3.           #define DATABASE_H  
4.            
5.           #include <QSqlDatabase> 
6.           #include <QSqlQuery> 
7.            
8.           static bool createConnection()  
9.           {  
10.           QSqlDatabase db = QSqlDatabase::addDatabase(“QSQLITE”);  
11.           db.setDatabaseName(“database.db”);  
12.           if(!db.open()) return false;  
13.           QSqlQuery query;  
14.           query.exec(“create table student (id int primary key, name vchar)”);  
15.           query.exec(“insert into student values (0,’yafei0′)”);  
16.           query.exec(“insert into student values (1,’yafei1′)”);  
17.           query.exec(“insert into student values (2,’yafei2′)”);  
18.           return true;  
19.       }  
20.       #endif // DATABASE_H 
这里我们使用了db.setDatabaseName(“database.db”); ,我们没有再使用以前的内存数据库,而是使用了真实的文件,这样后面对数据库进行的操作就能保存下来了。
然后进入main.cpp,将其内容更改如下:
1.           #include <QtGui/QApplication> 
2.           #include “widget.h”  
3.           #include “database.h”  
4.           int main(int argc, char *argv[])  
5.           {  
6.               QApplication a(argc, argv);  
7.               if(!createConnection())  
8.                   return 1;  
9.               Widget w;  
10.           w.show();  
11.           return a.exec();  
12.       } 
下面我们在widget.ui中添加一个显示为“查询”的Push Button,并进入其单击事件槽函数,更改如下:
1.           void Widget::on_pushButton_clicked()  
2.           {  
3.               QSqlQueryModel *model = new QSqlQueryModel;  
4.               model->setQuery(“select * from student”);  
5.               model->setHeaderData(0, Qt::Horizontal, tr(“id”));  
6.               model->setHeaderData(1, Qt::Horizontal, tr(“name”));  
7.               QTableView *view = new QTableView;  
8.               view->setModel(model);  
9.               view->show();  
10.       } 
我们新建了QSqlQueryModel类对象model,并用setQuery()函数执行了SQL语句“(“select * from student”);”用来查询整个student表的内容,可以看到,该类并没有完全避免SQL语句。然后我们设置了表中属性显示时的名字。最后我们建立了一个视图view,并将这个model模型关联到视图中,这样数据库中的数据就能在窗口上的表中显示出来了。
我们在widget.cpp中添加头文件:
1.           #include <QSqlQueryModel> 
2.           #include <QTableView> 
我们运行程序,并按下“查询”按键,效果如下:
  来源:网络
 
我们在工程文件夹下查看数据库文件:
下面我们利用这个模型来操作数据库。
1.我们在void Widget::on_pushButton_clicked()函数中添加如下代码:
1.           int column = model->columnCount(); //获得列数 
2.           int row = model->rowCount();    // 获得行数 
3.           QSqlRecord record = model->record(1); //获得一条记录 
4.           QModelIndex index = model->index(1,1);   //获得一条记录的一个属性的值 
5.           qDebug() << “column num is:” << column << endl 
6.                       << “row num is:” << row << endl 
7.                       <<”the second record is:” << record << endl 
8.                       << “the data of index(1,1) is:”<< index.data(); 
在我们在widget.cpp中添加头文件:
1.           #include <QSqlRecord> 
2.           #include <QModelIndex> 
3.           #include <QDebug> 
此时运行程序,效果如下:
2.当然我们在这里也可以使用前面介绍过的query执行SQL语句。
例如我们在void Widget::on_pushButton_clicked()函数中添加如下代码:
1.           QSqlQuery query = model->query();  
2.           query.exec(“select name from student where id =  “);  
3.           query.next();  
4.           qDebug() << query.value(0).toString(); 
这样就可以输出表中的值了,你可以运行程序测试一下。
3.当我们将函数改为如下。
1.           void Widget::on_pushButton_clicked()  
2.           {  
3.               QSqlQueryModel *model = new QSqlQueryModel;  
4.               model->setQuery(“select * from student”);  
5.               model->setHeaderData(0, Qt::Horizontal, tr(“id”));  
6.               model->setHeaderData(1, Qt::Horizontal, tr(“name”));  
7.               QTableView *view = new QTableView;  
8.               view->setModel(model);  
9.               view->show();  
10.        
11.           QSqlQuery query = model->query();  
12.           query.exec(“insert into student values (10,’yafei10′)”);  
13.           //插入一条记录 
14.       } 
这时我们运行程序,效果如下:
我们发现表格中并没有增加记录,怎么回事呢?
我们关闭程序,再次运行,效果如下:
发现这次新的记录已经添加了。在上面我们执行了添加记录的SQL语句,但是在添加记录之前,就已经进行显示了,所以我们的更新没能动态的显示出来。为了能让其动态地显示我们的更新,我们可以将函数更改如下:
1.           void Widget::on_pushButton_clicked()  
2.           {  
3.               QSqlQueryModel *model = new QSqlQueryModel;  
4.               model->setQuery(“select * from student”);  
5.               model->setHeaderData(0, Qt::Horizontal, tr(“id”));  
6.               model->setHeaderData(1, Qt::Horizontal, tr(“name”));  
7.               QTableView *view = new QTableView;  
8.               view->setModel(model);  
9.               view->show();  
10.           QSqlQuery query = model->query();  
11.           query.exec(“insert into student values (20,’yafei20′)”);  
12.           //插入一条记录 
13.          model->setQuery(“select * from student”); //再次查询整张表 
14.           view->show(); //再次进行显示,这句也可以不写 
15.       } 
这时运行程序,效果如下
可以看到,这时已经将新添的记录显示出来了。

QSqlQueryModel的实例操作的更多相关文章

  1. Qt数据库 QSqlTableModel实例操作(转)

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

  2. [转]使用Xcode 4发布App 实例操作

    使用xcode 4发布app 实例操作是本文介绍的内容,不多说,我们直接进入话题. 1.iOS Provisioning Portal 和iTunes Connect 没有变,下载与安装.mobile ...

  3. Flashback Drop实例操作

    1.Flashback DropFlashback Drop 是从Oracle 10g 开始出现的,用于恢复用户误删除的对象(包括表,索引等), 这个技术依赖于Tablespace Recycle B ...

  4. 058——VUE中vue-router之实例操作新闻列表单页面应用与路由别名的使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 040——VUE中组件之组件间的数据参props的使用实例操作

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 034——VUE中表单控件处理之使用vue控制radio表单的实例操作

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. php5.4以上 mysqli 实例操作mysql 增,删,改,查

    <?php //php5.4以上 mysqli 实例操作mysql header("Content-type:text/html;charset=utf8"); $conn ...

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

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

  9. 每天一个JavaScript实例-操作元素定位元素

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

随机推荐

  1. (二)学习MVC之实现用户注册功能

    学习地址:http://www.cnblogs.com/mzwhj/archive/2012/10/22/2720089.html 本文和学习地址不一样的地方是我自己添加了一些简单的注释和理解. 1. ...

  2. 如何在网页中显示pdf

    用如下的html代码即可(例子): <div class="postBody"> <div id="cnblogs_post_body"> ...

  3. 【Linux.Python】Python进程后台启动

    嗯,比较忧伤. 前几天写了个tornado,启动了,很开心,后来每天要用时都发现it是kill掉的.好吧,是我太蠢啦.百度了下资料 python的启动方式: 1 python yourfile.py ...

  4. Action 操作

    当鼠标移动到图片文件夹的时候,将有一些button显示 当鼠标移开这个文件夹,那些button隐藏了起来 display属性的变化 1.可以使用Js改变属性来操作 暂未验证,待时间. 2.可以使用Ac ...

  5. P、NP及NPC问题

    关于计算理论的一些概念 —判定问题和最优化问题 —归约 —多项式时间 —抽象问题 —形式语言体系 NPC证明 —一个问题转换为判定问题 —说明问题是NP —一个NPC问题规约到这个问题 —只需要规约到 ...

  6. 怎样让你的代码更好的被JVM JIT Inlining

    好书推荐:Effective Java中文版(第2版) JVM JIT编译器优化技术有近100中,其中最最重要的方式就是内联(inlining).方法内联可以省掉方法栈帧的创建,方法内联还使让JIT编 ...

  7. SQL2005查询所有表的大小

    IF NOT EXISTS (SELECT * FROM [tempdb].sys.objects WHERE object_id = OBJECT_ID(N'[tempdb].[dbo].[tabl ...

  8. web.xml(spring/spring mvc/hibernate)

    <?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" ...

  9. 知方可补不足~SQL数据库用户的克隆,SQL集群的用户同步问题

    我们知道在为sqlserver建立功能数据库时,通过会为库再建立一个登陆名,而这个登陆名时,只用来管理这个数据库,这是安全的,正确的.

  10. 剑指OFFER之复杂链表的复制(九度OJ1524)

    题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点). 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一 ...