当前位置: 首页 > article >正文

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")); //学院


http://www.kler.cn/a/226556.html

相关文章:

  • PPT录屏功能在哪?一键快速找到它!
  • 笔记本加装内存条
  • 算法学习——华为机考题库1(HJ1 - HJ10)
  • 07 SB3之@HttpExchange(TBD)
  • 什么是单例模式与饿汉式单例模式的区别是什么?
  • Mac 上如何安装Mysql? 如何配置 Mysql?以及如何开启并使用MySQL
  • C#实现windows系统重启、关机
  • C++函数分文件编写之VScode版
  • 【gcc】webrtc发送侧计算 丢包率
  • Hive collect_set()、collect_list()列转行,并对转换后的行值排序
  • 一键转换MOV至MP3:轻松删除原视频,释放存储空间!
  • git diff查看比对两次不同时间点提交的异同
  • 力扣反转两次的数字
  • C语言第十七弹---指针(一)
  • Ansible概述、Ansible环境准备、Ansibleadhoc临时命令语法、命令模块、文件模块、用户模块、综合练习
  • MySQL之DQL正则表达式
  • Linux系统MySQL重置root密码
  • 如何用Docker+jenkins 运行 python 自动化?
  • 计算机网络——链路层(1)
  • C#验证字符串是否包含汉字:用正则表达式 vs 用ASCII码 vs 用汉字的 Unicode 编码