找回密码
 注册
搜索
查看: 4051|回复: 1

Linux平台QT数据库编程

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



       在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();

}



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

                        

                           



如果想用QtSql模块的话,还必须在pro文件中加入一条语句:QT  +=  sql

以下是有关Qt对数据库操作的一些类:

         QSqlDatabase   QSqlDriver   QSqlQuery  QSqlError  QSqlQueryModel

         QSqlTableModel     QSqlRelation   QSqlRelationalTableModel



总结:

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

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

http://www.embedhq.org
发表于 2014-1-19 02:52:10 | 显示全部楼层
学习中!学习中!学习中!学习中!学习中!
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-11-23 01:20 , Processed in 0.047087 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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