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 是如何使用的变能照猫画虎啦。