日志
QT数据库编程
2014-12-29 22:16
在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平台下的那下接口麻烦。 |
下一篇: fedora安装QT
上一篇: qt 数据库编程