qt读写sqlite数据库的三种方式-kb88凯时官网登录

来自:网络
时间:2024-06-09
阅读:
免费资源网,https://freexyz.cn/

qt对一些基本的数据库的访问封装,可谓是极大的方便的我们开发人员,现在我们就来说下qt对sqlite这个数据库的读写,sqlite是一个比较小型的本地数据库,对于保存一些软件配置参数或量不是很大的数据是相当的方便,qt本身已经自带了sqlite的驱动,直接使用相关的类库即可,这篇我们主要来说明qt访问sqlite数据库的三种方式(即使用三种类库去访问),分别为qsqlquery、qsqlquerymodel、qsqltablemodel,对于这三种类库,可看为一个比一个上层,也就是封装的更厉害,甚至第三种qsqltablemodel,根本就不需要开发者懂sql语言,也能操作sqlite数据库。

1、首先使用qsqlquery来访问

我们先要在工程中包含与数据库相关的几个头文件#include 、#include 、#include
访问的数据库内容结构为:

qt读写sqlite数据库的三种方式

#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

编译输出:

qt读写sqlite数据库的三种方式

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

编译运行一下:

qt读写sqlite数据库的三种方式

3、最后使用qsqltablemodel来访问

最后我们来说说使用qsqltablemodel这个类去操作sqlite数据库,这个类比上两个封装的更彻底,即使我们不懂sql语言,也能实现对sqlite数据库的操作,并且这个类也可以通过视图来显示修改数据库内容,这里我就拿这个类做了个用户管理模块,其实也可以通用与其他任何一个模块,只要在生成对象时传入sqlite的数据库名及要操作的表名即可。

在这个例子中,我实现了一个ksdemodlg类,其实是一个对话框类,里边包含了sqlite数据库的显示、修改等等功能,首先来看下效果(常规的增删改查功能都有):

qt读写sqlite数据库的三种方式

当我们点击增加、修改时,右边的编辑框便为可编辑状态(说明下,右边的编辑框是随着加载的数据库表变化而变化的,简而言之就是可以不做修改就能操作别的sqlite数据库),完毕确定后便写进数据库,同时也在左边的表格中显示

qt读写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; icolumncount(); 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; iaddrow( 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; isetenabled(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; isetenabled(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; isetenabled(true);
    	m_infoeditlist[i]->settext(recode.value(i).tostring());
    }
}
 
/**************************************************************************
 * 函数名称:onokbuttonclicked
 * 函数功能:okbutton点击槽函数,确定修改数据库
 * 输入参数:无
 * 输出参数:无
 * 返回数值:void
 * 创建人员:
 * 创建时间:2017-11-15
 * 修改人员:
 * 修改时间:
 **************************************************************************/
void ksdemodlg::onokbuttonclicked()
{
    for (int i=0; itext().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; isetdata(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; isetdata(m_model->index(currentrow, i), m_infoeditlist[i]->text());
    			}
 
    			m_model->submitall();	//提交修改
    		}
    	}
    	break;
    default:
    	break;
    }
 
    for (int i=0; isettext("");
    	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; isettext("");
    	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数据库的三种方式的详细内容,更多关于qt读写sqlite数据库的资料请关注其它相关文章!

免费资源网,https://freexyz.cn/
返回顶部
顶部
网站地图