qt学习笔记(七)之数据库简介

转载 2015年07月09日 15:59:13

笔者最近用Qt写公司的考勤机。本来要求是要基于frameBuffer下用自己开发的easyGUI来进行上层应用开发,但是考虑到easyGUI提供的接口不是很多,就考虑用Qt来开发,顺带练练手。 废话不多说,马上进入主题。


一、QtSql模块

Qt为数据库访问提供的QtSql模块实现了数据库和Qt应用程序的无缝集成,同时为开发人员提供了一套与平台无关和具体所用数据库均无关的调用接口。这使得开发人员只需掌握基本的SQL语句,就能进行简单的数据库应用程序开发。如下表所示,QtSql模块由3部分组成。

层次 描述
驱动层 驱动层实现了特定数据库与SQL接口的底层桥接。
SQL接口层 SQL接口层提供了数据库类的访问
用户接口层 用户接口层提供从数据库数据到用于数据库表示的窗体的映射
笔者有过在linux基于ncurses开发图形界面的经验。那项目要求提供记录查询功能,当时写那个就很费脑。控件都自己封装,Qt的用户接口层仍够完美的展示出数据库信息,这样的话开发人员就不用苦于设计表格控件了。

二、数据库驱动
Qt支持数据库驱动以插件的形式添加,当我们开发的时候,首先必须明确使用哪种数据库。目前Qt支持的数据库类型如下:

我们也可以通过代码来查看本机Qt支持的数据库。

如果想要使用QtSql模块,则必须在工程文件上加入一行:

[plain] view plaincopy
  1. QT += sql  
否则无法包含头文件<QtSql>

  1. qDebug() << "Available drivers:";  
  2. QStringList drivers = QSqlDatabase::drivers();  
  3. qDebug() << drivers;  
运行程序,可以显示现在所有能用的数据库驱动了。

[plain] view plaincopy
  1. Available drivers:  
  2. ("QSQLITE")  
三、简单的应用程序

最近在做考勤机,那么就以这个为例子吧。

  1. <pre name="code" class="cpp">    
  2. if(!QSqlDatabase::drivers().contains("QSQLITE"))  
  3.     {  
  4.         //如果数据库驱动里没有SQLite,则错误警告  
  5.         QMessageBox::critical(this, tr("数据库警告"), tr("系统需添加SQLite数据库驱动"), QMessageBox::Cancel);  
  6.     }  
  7.     QSqlError error = db_Init();  
  8.     if(error.type() != QSqlError::NoError)  
  9.     {  
  10.         showError(error);  
  11.         return;  
  12.     }

  13. 我使用的是SQLite数据库,所以要先确认下系统是否已安装该驱动,错误则出现消息对话框提示。  
  14. 在db_Init() 创建一张表,并且添加了一些数据。 接下来查看数据库数据,验证是否添加正确
  15. <pre name="code" class="cpp"><pre name="code" class="cpp">
  16. QSqlError MainWindow::db_Init()  
  17. {  
  18.     //QSqlDatabase::database("syscfg.dat").close();  
  19.     //QSqlDatabase::removeDatabase("syscfg.dat");  
  20.   
  21.     QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); //添加数据库驱动  
  22.     db.setDatabaseName(":memory:");       //数据库文件名,setDatabaseName(":memory:")指的是内存数据库  
  23.   
  24.     if(!db.open())  
  25.     {  
  26.         //如果打开失败  
  27.         return db.lastError();  
  28.     }  
  29.   
  30.     //创建人员组别表,2个参量 组别ID 和组别名称  
  31.     QSqlQuery query;  
  32.     if(!query.exec("CREATE TABLE table_group(group_id INTEGER PRIMARY KEY, group_name VCHAR(10))"))  
  33.     {  
  34.         return query.lastError();  
  35.     }  
  36.   
  37.     //添加数据  
  38.     query.exec("INSERT INTO table_group VALUES(1, 'teacher')");  
  39.     query.exec("INSERT INTO table_group VALUES(2, 'student')");  
  40.   
  41.     //查看数据库  
  42.     query.exec("SELECT * FROM table_group");  
  43.   
  44.     while(query.next())       
  45.     {  
  46.         int group_id = query.value(0).toInt();  
  47.         QString group_name = query.value(1).toString();  
  48.         qDebug() << "group id=" << group_id;  
  49.         qDebug() << "group name=" << group_name;  
  50.     }  
  51.   
  52.     return QSqlError();  
  53. }
  54. 注释已经很详细了,这里只涉及了简单的SQL语句的使用。
  55. 执行程序后,可以看到我们对数据库的操作是正确的。
  56. </span></span></p><pre name="code" class="plain">
  57. group id= 1   
  58. group name= "teacher"   
  59. group id= 2   
  60. group name= "student" 

最优化学习笔记(十七)——拟牛顿法(3)

秩1修正公式    在秩1修正公式中,修正项为αkz(k)z(k)T,αk∈R,z(k)∈Rn\alpha_k\boldsymbol{z}^{(k)}\boldsymbol{z}^{(k)T}, \a...
  • chunyun0716
  • chunyun0716
  • 2017年01月08日 14:43
  • 466

数据结构实验之排序七:选课名单

数据结构实验之排序七:选课名单 Time Limit: 1000MS Memory limit: 65536K 题目描述 随着学校规模的扩大,学生人数急剧增加...
  • guoqingshuang
  • guoqingshuang
  • 2015年12月22日 22:54
  • 1485

SDUT3404数据结构实验之排序七:选课名单

#include using namespace std; struct node { char name[15]; struct node *next; }; struct node...
  • nar666
  • nar666
  • 2016年08月03日 22:53
  • 878

数据结构实验之排序七:选课名单(卡内存的一道题。。坑)

RE。。。 带更正 #include #include using namespace std; #include #include struct people { char name[1...
  • dreamzuora
  • dreamzuora
  • 2016年11月21日 19:07
  • 423

MySQL系列之七:主从复制

一:实验环境 IP 操作系统 mysql版本号 master 192.168.25.11 CentOS7 5.6.35 slave 192.168.25.10 ...
  • ydyang1126
  • ydyang1126
  • 2017年04月14日 17:09
  • 350

3404 数据结构实验之排序七:选课名单

数据结构实验之排序七:选课名单#include using namespace std; struct node { char name[15]; } pp[2010][3...
  • yue_luo_
  • yue_luo_
  • 2016年12月11日 22:11
  • 195

数据结构实验之查找七:线性之哈希表 151 268

题目描述 根据给定的一系列整数关键字和素数p,用除留余数法定义hash函数H(Key)=Key%p,将关键字映射到长度为p的哈希表中,用线性探测法解决冲突。重复关键字放在hash表中的同一位置。...
  • RIPwangh
  • RIPwangh
  • 2015年12月27日 10:30
  • 735

竹枝词九首之七

刘禹锡  瞿塘嘈嘈十二滩,人言道路古来难. 长恨人心不如水,等闲平地起波澜. 这是《竹枝词九首》的第七首.诗从瞿塘峡的艰险借景起兴,引出对世态人情的感慨. 瞿塘峡是长江三峡之一...
  • kepa520
  • kepa520
  • 2016年06月23日 13:51
  • 277

QT学习笔记之七 FindFileDialog

好久没写,最近东搞搞西搞搞都没怎么看Qt,惭愧...... 这里主要练习Qt控件的布局问题,用了三种布局方式写了个FindFile 操作系统:Ubuntu 9.04Qt版本:4.5 FindFile1...
  • killua_hzl
  • killua_hzl
  • 2009年05月29日 12:16
  • 890

3334-数据结构实验之栈与队列七:出栈序列判定

#include using namespace std; typedef int ElemType;class Stack{ private: ElemType *up; ElemT...
  • ywj_justdoit
  • ywj_justdoit
  • 2017年10月19日 19:49
  • 59
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:qt学习笔记(七)之数据库简介
举报原因:
原因补充:

(最多只允许输入30个字)