qt对一些基本的数据库的访问封装,可谓是极大的方便的我们开发人员,现在我们就来说下qt对sqlite这个数据库的读写,sqlite是一个比较小型的本地数据库,对于保存一些软件配置参数或量不是很大的数据是相当的方便,qt本身已经自带了sqlite的驱动,直接使用相关的类库即可,这篇我们主要来说明qt访问sqlite数据库的三种方式(即使用三种类库去访问),分别为qsqlquery、qsqlquerymodel、qsqltablemodel,对于这三种类库,可看为一个比一个上层,也就是封装的更厉害,甚至第三种qsqltablemodel,根本就不需要开发者懂sql语言,也能操作sqlite数据库。
1、首先使用qsqlquery来访问
我们先要在工程中包含与数据库相关的几个头文件#include
访问的数据库内容结构为:
#include#include #include #include #include #include typedef struct _testinfo //假定数据库存储内容 { qstring usrename; qstring ip; qstring port; qstring password; qstring type; }testinfo; int main(int argc, char *argv[]) { qapplication a(argc, argv); qvector infovect; //testinfo向量,用于存储数据库查询到的数据 qsqldatabase db = qsqldatabase::adddatabase("qsqlite"); db.setdatabasename(qapplication::applicationdirpath() "/config/" "config.db"); if (!db.open()) { return 0; } /**************************使用qsqlquery操作数据库**************************/ qsqlquery query; //执行操作类对象 //查询数据 query.prepare("select * from t_user_manage"); query.exec(); //执行 qsqlrecord recode = query.record(); //recode保存查询到一些内容信息,如表头、列数等等 int column = recode.count(); //获取读取结果的列数 qstring s1 = recode.fieldname(0); //获取第0列的列名 while (query.next()) { testinfo tmp; tmp.usrename = query.value("usrename").tostring(); tmp.ip = query.value("ip").tostring(); tmp.port = query.value("port").tostring(); tmp.password = query.value("password").tostring(); tmp.type = query.value("type").tostring(); infovect.push_back(tmp); //将查询到的内容存到testinfo向量中 } for (int i=0; i 编译输出:
2、使用qsqlquerymodel来访问
qsqlquerymodel类带有model字样,相信你已经猜到我们可以用他来关联试图,就能把数据库的内容显示到视图上,当然,常规的操作也是可以的,但是我们只说说怎么用这个类来把数据库中的内容显示到是视图中,这里我们选择的视图类为qtableview,直接上代码吧
#include#include #include #include #include #include #include int main(int argc, char *argv[]) { qapplication a(argc, argv); qsqldatabase db = qsqldatabase::adddatabase("qsqlite"); db.setdatabasename(qapplication::applicationdirpath() "/config/" "config.db"); if (!db.open()) { return 0; } qsqlquerymodel *model = new qsqlquerymodel; model->setquery("select * from t_user_manage", db); //从给定的数据库db执行sql操作, db需预先制定并打开 int column = model->columncount(); //获取列数 int row = model->rowcount(); //获取行数 model->setheaderdata(0, qt::horizontal, qstringliteral("用户名")); //设置表头,如不设置则使用数据库中的默认表头 model->setheaderdata(1, qt::horizontal, qstringliteral("ip地址")); model->setheaderdata(2, qt::horizontal, qstringliteral("端口")); model->setheaderdata(3, qt::horizontal, qstringliteral("密码")); model->setheaderdata(4, qt::horizontal, qstringliteral("用户类型")); qtableview *view = new qtableview; //定义视图,只能用于显示,不能修改数据库 view->setfixedsize(500, 200); view->setmodel(model); view->show(); return a.exec(); } 编译运行一下:
3、最后使用qsqltablemodel来访问
最后我们来说说使用qsqltablemodel这个类去操作sqlite数据库,这个类比上两个封装的更彻底,即使我们不懂sql语言,也能实现对sqlite数据库的操作,并且这个类也可以通过视图来显示修改数据库内容,这里我就拿这个类做了个用户管理模块,其实也可以通用与其他任何一个模块,只要在生成对象时传入sqlite的数据库名及要操作的表名即可。
在这个例子中,我实现了一个ksdemodlg类,其实是一个对话框类,里边包含了sqlite数据库的显示、修改等等功能,首先来看下效果(常规的增删改查功能都有):
当我们点击增加、修改时,右边的编辑框便为可编辑状态(说明下,右边的编辑框是随着加载的数据库表变化而变化的,简而言之就是可以不做修改就能操作别的sqlite数据库),完毕确定后便写进数据库,同时也在左边的表格中显示
头文件:
#ifndef __ksdemodlg_h__ #define __ksdemodlg_h__ #include#include #include #include #include #include #include #include #include class ksdemodlg : public qdialog { q_object enum {update, insert}; int m_operator; public: explicit ksdemodlg(qstring databasename, qstring datatablename, qwidget *parent = 0 ); ~ksdemodlg(); private: void uiinit(); protected slots: void onnewbuttonclicked(); void onquerybuttonclicked(); void onupdatebuttonclicked(); void ondeletebuttonclicked(); void onprimarykeylineeditempty(const qstring & text); void oncurrenttableviewclicked(const qmodelindex & index); void onokbuttonclicked(); void oncancelbuttonclicked(); private: qsqldatabase m_db; qstring m_dbname; qstring m_dbtablename; private: qtableview* m_tabview; qsqltablemodel* m_model; private: qlist m_infoeditlist; qlist m_infolabellist; qpushbutton m_okbutton; qpushbutton m_cancelbutton; private: /*所有用户信息容器组*/ qgroupbox m_group; qlabel m_primarykeylabel; qlineedit m_primarykeylineedit; qpushbutton m_querybutton; qpushbutton m_newbutton; qpushbutton m_updatebutton; qpushbutton m_deletebutton; /*所选择用户信息容器组*/ qgroupbox m_selectgroup; }; #endif // __ksdemodlg_h__ .cpp文件
#include#include #include #include #include #include #include #include #include #include "ksdemodlg.h" /************************************************************************** * 函数名称:ksdemodlg * 函数功能:用户管理对话框构造函数 * 输入参数:无 * 输出参数:无 * 返回数值:void * 创建人员: * 创建时间:2017-11-15 * 修改人员: * 修改时间: **************************************************************************/ ksdemodlg::ksdemodlg(qstring databasename, qstring datatablename, qwidget *parent):qdialog(parent, qt::windowclosebuttonhint | qt::windowminmaxbuttonshint | qt::windowstaysontophint), m_group(this), m_primarykeylabel(this), m_primarykeylineedit(this), m_querybutton(this), m_newbutton(this), m_updatebutton(this), m_deletebutton(this), m_tabview(null),m_model(null), m_okbutton(this),m_cancelbutton(this), m_dbname(databasename), m_dbtablename(datatablename), m_operator(-1) { //打开数据库 m_db = qsqldatabase::adddatabase("qsqlite"); m_db.setdatabasename(qapplication::applicationdirpath() "/config/" databasename); if (!m_db.open()) { m_dbname = ""; m_dbtablename = ""; } m_model = new qsqltablemodel(this, m_db); m_model->settable(m_dbtablename); m_model->seteditstrategy(qsqltablemodel::onmanualsubmit); //手动提交后才修改 m_model->select(); m_tabview = new qtableview(this); m_tabview->setedittriggers(qabstractitemview::noedittriggers); //设置内容不可编辑 /*************关联槽函数*********************/ connect(&m_newbutton, signal(clicked()), this, slot(onnewbuttonclicked())); connect(&m_querybutton, signal(clicked()), this, slot(onquerybuttonclicked())); connect(&m_updatebutton, signal(clicked()), this, slot(onupdatebuttonclicked())); connect(&m_deletebutton, signal(clicked()), this, slot(ondeletebuttonclicked())); connect(&m_primarykeylineedit, signal(textchanged(const qstring &)), this, slot(onprimarykeylineeditempty(const qstring &))); connect(m_tabview, signal(clicked(const qmodelindex &)), this, slot(oncurrenttableviewclicked(const qmodelindex &))); connect(&m_okbutton, signal(clicked()), this, slot(onokbuttonclicked())); connect(&m_cancelbutton, signal(clicked()), this, slot(oncancelbuttonclicked())); /*************模型关联视图*******************/ m_tabview->setmodel(m_model); /*************选中行为为整行选中*************/ m_tabview->setselectionbehavior(qabstractitemview::selectrows); /*************对话框窗体初始化***************/ uiinit(); /*************对话框窗体初始化***************/ setfixedsize(600, 400); setwindowtitle(qstringliteral("用户管理")); } /************************************************************************** * 函数名称:uiinit * 函数功能:用户管理对话框界面初始化 * 输入参数:无 * 输出参数:无 * 返回数值:void * 创建人员: * 创建时间:2017-11-15 * 修改人员: * 修改时间: **************************************************************************/ void ksdemodlg::uiinit() { m_primarykeylabel.settext(m_model->headerdata(0, qt::horizontal).tostring()); m_newbutton.settext(qstringliteral("增加")); m_querybutton.settext(qstringliteral("查询")); m_updatebutton.settext(qstringliteral("修改")); m_deletebutton.settext(qstringliteral("删除")); m_updatebutton.setenabled(true); m_okbutton.settext(qstringliteral("确定")); m_cancelbutton.settext(qstringliteral("取消")); /**************灵活增加界面右侧数据显示形式******************/ for(int i=0; i columncount(); i ) { m_infolabellist.append(new qlabel(this)); m_infolabellist[i]->settext(m_model->headerdata(i, qt::horizontal).tostring()); m_infoeditlist.append(new qlineedit(this)); m_infoeditlist[i]->setenabled(false); } m_okbutton.setenabled(false); m_cancelbutton.setenabled(false); /**************灵活增加界面右侧数据显示形式 end******************/ qhboxlayout *totalhboxlayout = new qhboxlayout(); qvboxlayout *totalvboxlayout = new qvboxlayout(); qvboxlayout *usergroupvboxlayout = new qvboxlayout(); qhboxlayout *useredithboxlayout = new qhboxlayout(); qhboxlayout *userbuttonhboxlayout = new qhboxlayout(); qformlayout *userprimarykeyformlayout = new qformlayout(); qformlayout *userselectformlayout = new qformlayout(); qhboxlayout *userselecthboxlayout = new qhboxlayout(); qvboxlayout *userselectvboxlayout = new qvboxlayout(); /*****************界面右侧group布局******************/ for (int i=0; i addrow( m_infolabellist[i], m_infoeditlist[i]); } userselecthboxlayout->addwidget(&m_okbutton); userselecthboxlayout->addwidget(&m_cancelbutton); userselectvboxlayout->addlayout(userselectformlayout); userselectvboxlayout->addlayout(userselecthboxlayout); userselectvboxlayout->addstretch(); /*****************界面右侧group布局 end******************/ userprimarykeyformlayout->addrow(&m_primarykeylabel, &m_primarykeylineedit); useredithboxlayout->addlayout(userprimarykeyformlayout); useredithboxlayout->addwidget(&m_querybutton); useredithboxlayout->addstretch(); userbuttonhboxlayout->addwidget(&m_newbutton); userbuttonhboxlayout->addwidget(&m_updatebutton); userbuttonhboxlayout->addwidget(&m_deletebutton); usergroupvboxlayout->addlayout(useredithboxlayout); usergroupvboxlayout->addlayout(userbuttonhboxlayout); m_group.setlayout(usergroupvboxlayout); totalvboxlayout->addwidget(&m_group); totalvboxlayout->addwidget(m_tabview); totalhboxlayout->addlayout(totalvboxlayout, 3); totalhboxlayout->addlayout(userselectvboxlayout, 1); setlayout(totalhboxlayout); } /************************************************************************** * 函数名称:onnewuserbuttonclick * 函数功能:用户管理对话框界新增用户按钮槽函数 * 输入参数:无 * 输出参数:无 * 返回数值:void * 创建人员: * 创建时间:2017-11-15 * 修改人员: * 修改时间: **************************************************************************/ void ksdemodlg::onnewbuttonclicked() { for (int i=0; i setenabled(true); } m_operator = insert; m_okbutton.setenabled(true); m_cancelbutton.setenabled(true); } /************************************************************************** * 函数名称:onqueryuserbuttonclick * 函数功能:用户管理对话框界查询用户按钮槽函数 * 输入参数:无 * 输出参数:无 * 返回数值:void * 创建人员: * 创建时间:2017-11-15 * 修改人员: * 修改时间: **************************************************************************/ void ksdemodlg::onquerybuttonclicked() { qstring tofind = m_primarykeylineedit.text(); qstring id = m_model->headerdata(0, qt::horizontal).tostring(); m_model->setfilter(id "=\'" tofind "'"); m_model->select(); } /************************************************************************** * 函数名称:onupdatebuttonclicked * 函数功能:用户管理对话框界修改用户按钮槽函数 * 输入参数:无 * 输出参数:无 * 返回数值:void * 创建人员: * 创建时间:2017-11-15 * 修改人员: * 修改时间: **************************************************************************/ void ksdemodlg::onupdatebuttonclicked() { int toupdate = m_tabview->currentindex().row(); qsqlrecord recode = m_model->record(toupdate); for (int i=0; i setenabled(true); m_infoeditlist[i]->settext(recode.value(i).tostring()); } m_operator = update; m_okbutton.setenabled(true); m_cancelbutton.setenabled(true); } /************************************************************************** * 函数名称:ondeletebuttonclicked * 函数功能:用户管理对话框界删除用户按钮槽函数 * 输入参数:无 * 输出参数:无 * 返回数值:void * 创建人员: * 创建时间:2017-11-15 * 修改人员: * 修改时间: **************************************************************************/ void ksdemodlg::ondeletebuttonclicked() { int todelrow = m_tabview->currentindex().row(); if (qmessagebox::ok == qmessagebox::warning(this, qstringliteral("提示"), qstringliteral("确定要删除") m_model->data(m_model->index(todelrow, 0)).tostring() qstringliteral("吗?"), qmessagebox::ok|qmessagebox::no)) { m_model->removerow(todelrow); m_model->submitall(); } m_model->select(); } /************************************************************************** * 函数名称:onusernameeditempty * 函数功能:当m_usernameedit编辑框为空时,显示所有用户 * 输入参数:无 * 输出参数:无 * 返回数值:void * 创建人员: * 创建时间:2017-11-15 * 修改人员: * 修改时间: **************************************************************************/ void ksdemodlg::onprimarykeylineeditempty(const qstring & text) { if (text.isempty()) { m_model->settable(m_dbtablename); //重新关联数据库表,这样才能查询整个表 m_model->select(); } } /************************************************************************** * 函数名称:oncurrenttableviewactived * 函数功能:m_tableview视图选取当前行槽函数,内容映射到右侧用户编辑中 * 输入参数:无 * 输出参数:无 * 返回数值:void * 创建人员: * 创建时间:2017-11-15 * 修改人员: * 修改时间: **************************************************************************/ void ksdemodlg::oncurrenttableviewclicked(const qmodelindex & index) { if (!m_okbutton.isenabled() || (insert == m_operator)) //只有可编辑并且操作为修改操作时才映射内容 { return; } int currentrow = index.row(); qsqlrecord recode = m_model->record(currentrow); for (int i=0; i setenabled(true); m_infoeditlist[i]->settext(recode.value(i).tostring()); } } /************************************************************************** * 函数名称:onokbuttonclicked * 函数功能:okbutton点击槽函数,确定修改数据库 * 输入参数:无 * 输出参数:无 * 返回数值:void * 创建人员: * 创建时间:2017-11-15 * 修改人员: * 修改时间: **************************************************************************/ void ksdemodlg::onokbuttonclicked() { for (int i=0; i text().isempty()) { qmessagebox::warning(this, qstringliteral("提示"), qstringliteral("请将内容填写完整"), qmessagebox::ok); return; } } switch (m_operator) { case insert: { if (qmessagebox::ok == qmessagebox::warning(this, qstringliteral("提示"), qstringliteral("请确定是否增加"), qmessagebox::ok|qmessagebox::no)) { int col = m_model->columncount(); int row = m_model->rowcount(); m_model->insertrow(row); for (int i=0; i setdata(m_model->index(row, i), m_infoeditlist[i]->text()); } m_model->submitall(); //提交修改 } } break; case update: { if (qmessagebox::ok == qmessagebox::warning(this, qstringliteral("提示"), qstringliteral("请确定是否修改"), qmessagebox::ok|qmessagebox::no)) { int col = m_model->columncount(); int currentrow = m_tabview->currentindex().row(); for (int i=0; i setdata(m_model->index(currentrow, i), m_infoeditlist[i]->text()); } m_model->submitall(); //提交修改 } } break; default: break; } for (int i=0; i settext(""); m_infoeditlist[i]->setenabled(false); } m_model->select(); m_okbutton.setenabled(false); m_cancelbutton.setenabled(false); } /************************************************************************** * 函数名称:oncancelbuttonclicked * 函数功能:okbutton点击槽函数,不操作 * 输入参数:无 * 输出参数:无 * 返回数值:void * 创建人员: * 创建时间:2017-11-15 * 修改人员: * 修改时间: **************************************************************************/ void ksdemodlg::oncancelbuttonclicked() { for (int i=0; i settext(""); m_infoeditlist[i]->setenabled(false); } m_okbutton.setenabled(false); m_cancelbutton.setenabled(false); } /************************************************************************** * 函数名称:~ksusermanagedlg * 函数功能:用户管理对话框析构函数 * 输入参数:无 * 输出参数:无 * 返回数值:void * 创建人员: * 创建时间:2017-11-15 * 修改人员: * 修改时间: **************************************************************************/ ksdemodlg::~ksdemodlg() { qdebug() << "ksdemodlg::~ksdemodlg()"; m_db.close(); } main函数
#include "kstestdemo.h" #include#include #include "ksdemodlg.h" int main(int argc, char *argv[]) { qapplication a(argc, argv); ksdemodlg dlg("config.db", "t_user_manage"); //这里我们在生成ksdemodlg类的时候,在构造函数中传入sqlite数据库名config.db和想要操作的表t_user_manage dlg.show(); //显示一下就ok return a.exec(); } 上边的 ksdemodlg dlg("config.db", "t_user_manage");数据库名跟表也可以换成其他的,代码通用。
以上就是qt读写sqlite数据库的三种方式的详细内容,更多关于qt读写sqlite数据库的资料请关注其它相关文章!