QSqlRelationalTableModel 关系表格模型

一、

1.1  QSqlRelationalTableModel继承自QSqlTableModel,并且对其进行了扩展,提供了对外键的支持。一个外键就是一个表中的一个字段 和 其他表中的主键字段之间的一对一的映射。例如,“studInfo”表中的departID字段对应的是“departments”表中的departID字段,那么就称字段departID是一个外键。因为这里的departID字段的值是一些数字,这样的显示很不友好,使用关系表格模型,就可以将它显示为“departments”表中的department字段的值。

1.2 使用“代码字段”的意义

1)major和department 字段,都是“汉字”:不仅 存储空间占用多,而且 “汉字可能会被修改”
2)如果使用“代码字段”标识:

            不仅占用空间小,而且 修改汉字,并不影响对应的 数值标识departID。
            如果不使用数值标识,每个表中都使用department的汉字。那么,每个表中的department汉字都要修改!

1.3

1)departments\majors表:专业代码字段departID\majorID 对应的数据表;
     studInfo表:具有(包含)代码字段departID\majorID的数据表;

2)QSqlRelationalTableModel类:专门用来编辑这种具有代码字段的数据表。(使用数值代码:标识汉字文字的字段)
使用QSqlRelationalTableModel作为tableView的数据源,显示和编辑studInfo数据表(具有代码字段);

二、

//打开数据表
    tabModel= new QSqlRelationalTableModel(this, DB);
    tabModel->setTable("studInfo"); //设置数据表studInfo
    tabModel->setEditStrategy(QSqlTableModel::OnManualSubmit);  //OnManualSubmit , OnRowChange
    tabModel->setSort(0,Qt::AscendingOrder);

    tabModel->setHeaderData(0,Qt::Horizontal,"学号");
    tabModel->setHeaderData(1,Qt::Horizontal,"姓名");
    tabModel->setHeaderData(2,Qt::Horizontal,"性别");
    tabModel->setHeaderData(3,Qt::Horizontal,"学院");
    tabModel->setHeaderData(4,Qt::Horizontal,"专业");

	//列号索引:从0开始,且不算隐藏列rowid列!

	//setRelation:在2个表之间建立关系!
    //设置代码字段的查询关系数据表
	//指定表"studInfo"的第3列是一个外键,将它映射为表"departments"的"departID"字段,并且视图应该在第3列显示"department"字段;
    tabModel->setRelation(3, QSqlRelation("departments","departID","department")); //学院
	//setRelation:在“studInfo”表 和 “majors”表之间建立关系
	//指定表"studInfo"的第4列是一个外键,将它和表"majors"的"majorID"字段建立映射关系,并且视图应该在第4列显示"major"字段
    tabModel->setRelation(4, QSqlRelation("majors","majorID","major"));//专业

    theSelection= new QItemSelectionModel(tabModel);
    connect(theSelection,SIGNAL(currentChanged(QModelIndex,QModelIndex)),
            this,SLOT(on_currentChanged(QModelIndex,QModelIndex)));

    ui->tableView->setModel(tabModel);//设置模型
    ui->tableView->setSelectionModel(theSelection);//设置选择模型
    ui->tableView->setItemDelegate(new QSqlRelationalDelegate(ui->tableView)); //为关系型字段设置缺省代理组件

//setRelation:在2个表之间建立关系!设置代码字段的查询关系数据表;
//指定表"studInfo"的第3列(departID)是一个外键,将它映射为表"departments"的"departID"字段,并且视图应该在第3列显示"department"字段;

 tabModel->setRelation(3, QSqlRelation("departments","departID","department")); //学院

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值