• 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"));
    
    • 1
    • 2
    • 3
    • 4

    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()));
    
    • 1
    • 2
    • 3

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

  • 相关阅读:
    函数及函数操作
    地球主题网页设计题材——大学生网页制作期末作业HTML+CSS+JS
    二、2023.9.28.C++基础end&&C++内存end.2
    线程与进程
    TCP--拥塞控制
    在列表中按照概率抽样choice()
    适合新手拿来练习的springboot+vue前后端分离小Demo
    《深入浅出.NET框架设计与实现》笔记6.3——ASP.NET Core应用程序多种运行模式之三——桌面应用程序
    Java之List.steam().sorted(Comparator.comparing())排序异常解决方案
    java中继承的介绍
  • 原文地址:https://blog.csdn.net/qq_43680827/article/details/133364765