欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C/C++ Qt数据库SqlRelationalTable关联表详解

程序员文章站 2022-03-02 23:10:50
在上一篇博文中详细介绍了sqltablemodle组件是如何使用的,本篇博文将介绍sqlrelationaltable关联表组件,该组件其实是sqltablemodle组件的扩展类,sqlrelati...

在上一篇博文中详细介绍了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相关联,如下:

C/C++ Qt数据库SqlRelationalTable关联表详解

创建完成后,我们在程序的构造函数直接实现绑定即可,这段代码很简单如下:

// 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/c++ qt数据库sqlrelationaltable关联表详解的文章就介绍到这了,更多相关c++ qt sqlrelationaltable关联表内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!