天嵌 ARM开发社区

 找回密码
 注册
查看: 2814|回复: 6

Linux平台QT数据库编程

[复制链接]
embedhq 发表于 2011-12-20 14:47:41 | 显示全部楼层 |阅读模式
作者:武汉华嵌技术部

       在linux平台使用qt来编写GUI程序,在进行数据库编程的时候,有两种选择方式,分别是:基于linux平台的数据库接口函数编程,另一种是使用qt自带的有关数据库类。那在这里我分别来讲一下这两种方式的实现。

一、使用linux平台的数据库接口编程:
在这里我使用的是一款免费的数据库sqlite,从网络上下一个sqlite-3.0.8.tar.gz源码包,然后进行安装,安装好后就可以使用它提供的函数接口。接下来我们用安装好的sqlite提供的函数接口,在QT中使用的,代码片段示例如下:
这是一个槽函数,在这个槽函数实现了对数据库的操作,使用的是刚才自已安装好的sqlite数据库提供的API函数。
void Qt1::open_data()
{
         int ret;
         char *zErrMsg;
         //打开数据库,如果这个数据库文件不存在,就创建它
         ret = sqlite3_open("student.db",&db);
         if(ret)
         {
                   fprintf(stderr,"cannot open database:%s\n",sqlite3_errmsg(db));
                   sqlite3_close(db);
                   exit(-1);
         }
         else
         {
                   printf("you are right\n");
         }

         //SQL语句
         char *sql = (char *)"CREATE TABLE StudentData(\
                                     ID INTEGER PRIMARY KEY,\
                                     SID TNTEGER,\
                                     Name VARCHAR(20),\
                                     Score INTEGER\
                                     );";

         //通过C接口来执行上面的一个SQL语句,创建一个表
         sqlite3_exec(db,sql,0,0,&zErrMsg);        
}

这里只是给了一个简单的实例,通过那些SQL语句,然后搭配上SQLITE提供的操作接口函数,我们就可以对数据库进行增、删、改、查等这一系列的操作。当然在编译的时候要注意的是一定要去连接这样的一个sqlite数据库的动态库,否则是编译不过的。

二、使用qt自带的数据库编程的类:
在qt中,提供了一个QtSql这样的一个模块,QtSql这个模块提供了与平台以及数据库种类无关的访问SQL数据库的接口,这个接口由利用Qt的模型/视图结构将数据库与用户界面集成的一套类来支持。QSqlDatabase对象表征了数据库的关联,Qt使用驱动程序与各种数据库的应用编程接口进行通信。QT支持多种数据库,但大部分数据库是收费的,QT提供内置的数据库,那就是SQLITE。
那么如下我们将会使用QT提供的操作接口,来对数据库的操作,代码示例如下:
头文件data.h
#ifndef _DATA_
#define _DATA_
#include <QDialog>
#include <QString>
#include <QSqlQuery>
#include <QSqlDatabase>
#include "ui_data.h"
class Data: public QDialog, public Ui_Data
{
         Q_OBJECT
public:
         Data(QWidget *parent = 0);
         void creatData();
public slots:
         void dataInsert();
         void dataSelete();
private:
         QSqlDatabase db;   //内置一个QSqlDatabase对象,通过它来和数据库进行关联
         QSqlQuery *query;  // QSqlQuery提供了很多可以用来处理数据源的接口
};

#endif

/****************************************************************/
         实现文件data.cpp
/****************************************************************/

#include <QDebug>
#include <QSqlError>
#include <QStringList>
#include <QTableWidgetItem>
#include "data.h"

Data::Data(QWidget *parent):QDialog(parent)
{
         setupUi(this);
         creatData(); //创建数据库文件
         connect(pbInsert, SIGNAL(clicked()), this, SLOT(dataInsert()));
         connect(pbSelete, SIGNAL(clicked()), this, SLOT(dataSelete()));
         connect(pbQuit, SIGNAL(clicked()), this, SLOT(close()));
}

void Data::creatData()
{
         //创建一个QSqlDatabase对象,addDatabase函数第一个参数指定了Qt
//必须使用哪一个数据库驱动程序来访问这个数据库
        db = QSqlDatabase::addDatabase("QSQLITE");
         db.setHostName("linux");
         //设置数据库文件的名字
         db.setDatabaseName("database");
         //设置用户名
         db.setUserName("steve");
         //设置密码
         db.setPassword("steve");
         //打开数据库文件
         bool ok = db.open("steve", "steve");
         if(ok)
         {
                   qDebug()<<"you are right";
         }

         //指定db为query的父类
         query = new QSqlQuery(db);
         //创建一个表
         query->exec("CREATE TABLE data (\
                   ID INTEGER PRIMARY KEY AUTOINCREMENT,\
                   name VARCHAR(6) NOT NULL,\
                   score VARCHAR(20) NOT NULL);");

         query->clear();
}

void Data::dataInsert()
{
         QString name = leName->text();
         QString score = leScore->text();
         qDebug()<<name<<":"<<score;
    /*  Prepares the SQL query query for execution. Returns true if the query is prepared successfully; otherwise returns false.*/
    //使用prepare()来指定一个包含占位符的查询,
//然后赋值绑定想插入的数据
         query->prepare("INSERT INTO data(name, score) VALUES (:name, :score)");
         query->bindValue(":name", name.toLocal8Bit().data());
         query->bindValue(":score", score.toLocal8Bit().data());
         query->exec();   //执行SQL语句
         query->clear();
}

void Data::dataSelete()
{
         tableWidget->setRowCount(10);
         tableWidget->setColumnCount(2);
         tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("Name"));
         tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem("Score"));
         query->exec("SELECT * FROM data");
         int i = 1;
         int j = 0;
         //只要调用next()第一次,就可以把这个QSqlQuery定位到结果集中的第一条记录,
         //随后再调用next(),每次都会把记录指针前移一条记录,直到到达结尾时返回false。
         while (query->next())
         {
                   //value(i)把字段值作为QVariant返回。
                   QString name = query->value(i++).toString();
                   tableWidget->setItem(j, i-2, new QTableWidgetItem(name));
                   QString score = query->value(i).toString();
                   tableWidget->setItem(j++, i-1, new QTableWidgetItem(score));
                   i = 1;
         }

         query->clear();
}

通过以上的代码,实现的效果如下:

                            file:///C:/DOCUME~1/jack/LOCALS~1/Temp/msohtml1/01/clip_image001.jpg

如果想用QtSql模块的话,还必须在pro文件中加入一条语句:QT  +=  sql
以下是有关Qt对数据库操作的一些类:
         QSqlDatabase   QSqlDriver   QSqlQuery  QSqlError  QSqlQueryModel
         QSqlTableModel     QSqlRelation   QSqlRelationalTableModel

总结:
         在用Qt做GUI编程时,如果是对数据库的操作的话,那么可以使用两种方法,但是对Qt本身来说,还是使用Qt自带的QtSql模块来操作还是比较好,通过Qt自己的一些类来操作这些数据库,没有使用linux平台下的那下接口麻烦。

更多技术文章敬请关注:武汉华嵌-嵌入式培训专家,国内领先的嵌入式服务机构,
http://www.embedhq.org

raominping 发表于 2011-12-20 17:01:02 | 显示全部楼层
楼主辛苦了…………
vvb9137 发表于 2012-2-14 22:31:15 | 显示全部楼层
请问为什么我编译时说没有这两个文件啊#include <QSqlQuery>
#include <QSqlDatabase>
不言DXH 发表于 2012-2-25 11:19:39 | 显示全部楼层
vvb9137 发表于 2012-2-14 22:31
请问为什么我编译时说没有这两个文件啊#include
#include

呵呵,我刚刚也遇到过这种问题,要再工程文件中加上 QT += sql
不言DXH 发表于 2012-2-25 11:24:09 | 显示全部楼层
另外,非常感谢楼主,我的毕业设计就是基于ARM-LINUX的SQLITE的应用~~~
vvb9137 发表于 2012-2-25 12:55:23 | 显示全部楼层
不言DXH 发表于 2012-2-25 11:19
呵呵,我刚刚也遇到过这种问题,要再工程文件中加上 QT += sql

非常感谢:handshake    我之前是有加,可是也不行。      现在看一下居然没有了, 加上就可以了!:handshake
lpdpzc 发表于 2012-6-14 06:36:59 | 显示全部楼层
呵呵,正想学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-4 13:36 , Processed in 1.046875 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表