在上一篇博文中详细介绍了sqltablemodle组件是如何使用的,本篇博文将介绍sqlrelationaltable关联表组件,该组件其实是sqltablemodle组件的扩展类,sqlrelationaltable组件可以关联某个主表中的外键,例如将主表中的某个字段与附加表中的特定字段相关联起来,qsqlrelation(关联表名,关联id,名称)就是用来实现多表之间快速关联的。
首先我们创建两张表,一张student表存储学生名字以及学生课程号,另一张departments存储每个编号所对应的系所名称,运行代码完成创建。
void mainwindow::initsql()
{
qsqldatabase db = qsqldatabase::adddatabase("qsqlite");
db.setdatabasename("./lyshark.db");
if (!db.open())
return;
// 执行sql创建表
db.exec("drop table student");
db.exec("create table student ("
"id integer primary key autoincrement, "
"name varchar(40) not null, "
"departid integer not null)"
);
// 逐条插入数据
db.exec("insert into student(name,departid) values('zhangsan',10)");
db.exec("insert into student(name,departid) values('lisi',20)");
db.exec("insert into student(name,departid) values('wangwu',30)");
db.exec("insert into student(name,departid) values('wangmazi',40)");
db.exec("drop table departments");
db.exec("create table departments("
"departid integer not null,"
"department varchar(40) not null)"
);
db.exec("insert into departments(departid,department) values (10,'数学学院')");
db.exec("insert into departments(departid,department) values (20,'物理学院')");
db.exec("insert into departments(departid,department) values (30,'计算机学院')");
db.commit();
db.close();
}
初始化后将得到两张数据表,这两张表通过departid相关联,如下:
创建完成后,我们在程序的构造函数直接实现绑定即可,这段代码很简单如下:
// https://www.cnblogs.com/lyshark
mainwindow::mainwindow(qwidget *parent): qmainwindow(parent), ui(new ui::mainwindow)
{
ui->setupui(this);
initsql();
// 打开数据库
qsqldatabase db = qsqldatabase::adddatabase("qsqlite");
db.setdatabasename("./lyshark.db");
if (!db.open())
return;
this->setcentralwidget(ui->tableview);
ui->tableview->setselectionbehavior(qabstractitemview::selectitems);
ui->tableview->setselectionmode(qabstractitemview::singleselection);
ui->tableview->setalternatingrowcolors(true);
// 打开数据表
tabmodel=new qsqlrelationaltablemodel(this,db);
tabmodel->settable("student"); // 设置数据表
tabmodel->seteditstrategy(qsqltablemodel::onmanualsubmit); // onmanualsubmit
tabmodel->setsort(0,qt::ascendingorder);
tabmodel->setheaderdata(0,qt::horizontal,"学号");
tabmodel->setheaderdata(1,qt::horizontal,"姓名");
tabmodel->setheaderdata(2,qt::horizontal,"学院");
// 设置代码字段的查询关系数据表
// 打开departments表,关联id和department
tabmodel->setrelation(2,qsqlrelation("departments","departid","department"));
theselection=new qitemselectionmodel(tabmodel);
ui->tableview->setmodel(tabmodel);
ui->tableview->setselectionmodel(theselection);
ui->tableview->setitemdelegate(new qsqlrelationaldelegate(ui->tableview)); // 为关系型字段设置缺省代理组件
tabmodel->select(); // 打开数据表
}
mainwindow::~mainwindow()
{
delete ui;
}
最终绑定效果如下图:
到此这篇关于c/c++ qt数据库sqlrelationaltable关联表详解的文章就介绍到这了,更多相关c++ qt sqlrelationaltable关联表内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!