在上一篇博文《c/c++ qt 数据库qsql增删改查组件应用》
介绍了qt中如何使用sql操作函数,并实现了对数据库的增删改查等基本功能,从本篇开始将实现数据库与view组件的绑定,通过数据库与组件关联可实现动态展示数据库中的表记录。
我们先以treeview
组件为例,简单介绍一下如何实现组件与数据的绑定,首先我们需要创建一个表并插入几条测试记录,运行如下代码实现建库建表.
#include <qsqldatabase>
#include <qsqlerror>
#include <qsqlquery>
#include <qsqlrecord>
#include <iostream>
#include <qstringlist>
#include <qstring>
#include <qvariant>
#include <qdatawidgetmapper>
#include <qtsql>
void init()
{
qsqldatabase db = qsqldatabase::adddatabase("qsqlite");
db.setdatabasename("./lyshark.db");
if (!db.open())
{
std::cout << db.lasterror().text().tostdstring()<< std::endl;
return;
}
// 执行sql创建表
db.exec("drop table lyshark");
db.exec("create table lyshark ("
"id integer primary key autoincrement, "
"name varchar(40) not null, "
"age integer not null)"
);
// 逐条插入
db.exec("insert into lyshark(name,age) values('admin',22)");
db.exec("insert into lyshark(name,age) values('lyshark',25)");
db.exec("insert into lyshark(name,age) values('zhangsan',22)");
db.exec("insert into lyshark(name,age) values('wangwu',22)");
db.commit();
}
mainwindow::mainwindow(qwidget *parent) :qmainwindow(parent),ui(new ui::mainwindow)
{
ui->setupui(this);
init();
}
执行建库建表后,数据库内记录如下:
有了数据表以后,接着就需要将数据表中的记录与view组件进行绑定,绑定组件首先需要调用qsqlquerymodel
查询数据表中的记录,当查询到记录以后,调用qitemselectionmodel()
将该记录绑定到对应的模型中,最后调用ui->treeview->setmodel(qrymodel);
以及ui->treeview->setselectionmodel(theselection);
将该模型显示在treeview
组件内,这段代码如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <qsqldatabase>
#include <qsqlerror>
#include <qsqlquery>
#include <qsqlrecord>
#include <iostream>
#include <qstringlist>
#include <qstring>
#include <qvariant>
#include <qdatawidgetmapper>
#include <qtsql>
#include <qstandarditem>
#include <qstringlist>
#include <qstringlistmodel>
// 定义数据模型指针
qsqlquerymodel *qrymodel; // 数据模型
qitemselectionmodel *theselection; // 选择模型
qdatawidgetmapper *datamapper; // 数据界面映射
mainwindow::mainwindow(qwidget *parent) :qmainwindow(parent),ui(new ui::mainwindow)
{
ui->setupui(this);
qsqldatabase db = qsqldatabase::adddatabase("qsqlite");
db.setdatabasename("./lyshark.db");
if (!db.open())
{
std::cout << db.lasterror().text().tostdstring()<< std::endl;
return;
}
// 查询数据表中记录
qrymodel=new qsqlquerymodel(this);
qrymodel->setquery("select * from lyshark order by id");
if (qrymodel->lasterror().isvalid())
{
return;
}
// 设置tableview表头数据
qrymodel->setheaderdata(0,qt::horizontal,"id");
qrymodel->setheaderdata(1,qt::horizontal,"name");
qrymodel->setheaderdata(2,qt::horizontal,"age");
// 将数据绑定到模型上
theselection=new qitemselectionmodel(qrymodel);
ui->treeview->setmodel(qrymodel);
ui->treeview->setselectionmodel(theselection);
ui->treeview->setselectionbehavior(qabstractitemview::selectrows);
}
mainwindow::~mainwindow()
{
delete ui;
}
运行代码后,程序会从数据库内取出结果并输出到treeview
组件上: