Qt扫盲-QSqlRelationalTableModel 理论总结

QSqlRelationalTableModel 理论总结

一、概述

QSqlRelationalTableModel的行为类似于QSqlTableModel,但允许将列设置为进入其他数据库表的外键。
在这里插入图片描述

二、使用概述

在上面左边的截图显示了 QTableView 中的普通 QSqlTableModel。外键(city和country)不能解析为人类可读的值。右边的截图显示了一个QSqlRelationalTableModel,外键被解析为人类可读的文本字符串。

下列代码片段展示了如何设置QSqlRelationalTableModel:

model->setTable("employee");

model->setRelation(2, QSqlRelation("city", "id", "name"));
model->setRelation(3, QSqlRelation("country", "id", "name"));

setRelation() 函数调用建立了两个表之间的关系。第一个调用指定表 employee 中的 列2 是一个外键,它与表 city 的字段 id 相映射,并且视图应该向用户显示城市的 name 字段。第二个调用对列3做了类似的处理。这个类还可以设置连接关系,默认是 inner join,我们也可以手动设置为 left join。

如果你使用读写QSqlRelationalTableModel,你可能想在视图上使用QSqlRelationalDelegate。与默认委托不同,QSqlRelationalDelegate 为作为其他表的外键的字段提供了一个组合框。要使用这个类,只需在视图上调用QAbstractItemView::setItemDelegate(),并传入一个QSqlRelationalDelegate的实例,这个QSqlRelationalDelegate 会自动的生成一个Combox 下拉框以便我们修改:

std::unique_ptr<QTableView> view{
    
    new QTableView};
view->setModel(model);
view->setItemDelegate(new QSqlRelationalDelegate(view.get()));

relationaltablemodel示例演示了如何使用QSqlRelationalTableModel和QSqlRelationalDelegate来为表提供外键支持。
在这里插入图片描述
使用这个类的前提是对数据库表是有约束的

注意:

  • 一个表表必须声明一个主键。

  • 一个表的主键不能包含与另一个表的关系。

  • 如果关系表包含引用引用表中不存在行的键,则包含无效键的行将不会通过模型暴露。用户或数据库负责保持引用完整性。

  • 如果一个关系的显示列名在关系表中也用作列名,或者如果它在多个关系中用作显示列名,那么它将是别名。别名是关系的表名、显示列名和一个由下划线连接的唯一id(例如tablename_columnname_id)。QSqlRecord::fieldName()将返回别名列名。当检测到重复的列名时,所有重复的显示列名都会有别名,但在主表中的列名不会有别名。别名不会影响QSqlRelation,因此QSqlRelation::displayColumn()将返回原始的显示列名。

  • 引用表名有别名。别名是单词“relTblAl”和由下划线连接的相关列索引(例如relTblAl_2)。别名可以用来过滤表(例如,setFilter(“relTblAl_2='Oslo’或relTblAl_3=‘USA’”))。

  • 使用setData()时,角色应该始终是Qt::EditRole,使用data()时,角色应该始终是Qt::DisplayRole。
    这个就是一种 model/view 编程的约束条件而已

三、常用

因为这个类是继承至 QSqlTableModel 类的,所以 QSqlTableModel 具有的增删改查的功能是和这个类的完全一致的,去看看QSqlTableModel 是如何使用的变能照猫画虎啦。

猜你喜欢

转载自blog.csdn.net/qq_43680827/article/details/133364765
今日推荐