• Qt SQL:QSqlRelation、QSqlRelationalTableModel、QSqlRelationalDelegate


    QSqlRelation

    一、描述

    QSqlRelation 类存储有关 SQL 外键的信息,是 QSqlRelationalTableModel 的辅助类。

    二、成员函数

    1、QString displayColumn()

    从表 tableName() 返回应该呈现给用户的列,而不是外键。

    2、QString indexColumn()

    从表 tableName() 返回外键引用的索引列。

    3、bool isValid()

    QSqlRelation 对象是否有效。

    4、QString tableName()

    外键引用的表的名称。


    QSqlRelationalTableModel

    一、描述

    QSqlRelationalTableModel 类继承QSqlTableModel,为单个数据库表提供可编辑的数据模型,并允许将列设置为其他数据库表的外键。

    1. #include
    2. #include
    3. static bool createConnection()
    4. {
    5. QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    6. db.setDatabaseName(":memory:");
    7. if (!db.open())
    8. {
    9. return false;
    10. }
    11. QSqlQuery query;
    12. query.exec("create table employee(id int primary key, 姓名 varchar(20), 城市 int, 国家 int)");
    13. query.exec("insert into employee values(1, '张三', 5000, 47)");
    14. query.exec("insert into employee values(2, '李四', 80000, 49)");
    15. query.exec("insert into employee values(3, '王五', 100, 1)");
    16. query.exec("create table city(id int, 城市名称 varchar(20))");
    17. query.exec("insert into city values(100, '北京')");
    18. query.exec("insert into city values(5000, '洛杉矶')");
    19. query.exec("insert into city values(80000, '平壤')");
    20. query.exec("create table country(id int, 国家名称 varchar(20))");
    21. query.exec("insert into country values(1, '中国')");
    22. query.exec("insert into country values(47, '美国')");
    23. query.exec("insert into country values(49, '朝鲜')");
    24. return true;
    25. }
    26. int main(int argc, char *argv[])
    27. {
    28. QApplication app(argc, argv);
    29. if (!createConnection())
    30. return EXIT_FAILURE;
    31. QSqlRelationalTableModel model;
    32. model.setTable("employee");
    33. model.setEditStrategy(QSqlTableModel::OnManualSubmit);
    34. model.setRelation(2, QSqlRelation("city", "id", "城市名称"));
    35. model.setRelation(3, QSqlRelation("country", "id", "国家名称"));
    36. model.setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
    37. model.setHeaderData(1, Qt::Horizontal, QObject::tr("雇员姓名"));
    38. model.setHeaderData(2, Qt::Horizontal, QObject::tr("雇员城市"));
    39. model.setHeaderData(3, Qt::Horizontal, QObject::tr("雇员国家"));
    40. model.select();
    41. QTableView view;
    42. view.setModel(&model);
    43. view.setItemDelegate(new QSqlRelationalDelegate(&view));
    44. view.setWindowTitle(QObject::tr("employee 表中的内容"));
    45. view.show();
    46. return app.exec();
    47. }

    二、成员函数

    1、QSqlRelation relation(int column)

    返回列 column 的关系。

    2、QSqlTableModel * relationModel(int column)

    返回一个 QSqlTableModel 对象,用于访问列是外键的表,如果列 column 没有关系,则返回 nullptr。返回的对象归 QSqlRelationalTableModel 所有。

    3、bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)

    设置 index 的项中角色 role 的数据。根据编辑策略,该值可能会立即应用于数据库,也可能会缓存在模型中。

    对于关系列,value 必须是索引,而不是显示值。索引也必须存在于引用的表中,否则函数返回 false。

    4、void setJoinMode(QSqlRelationalTableModel::JoinMode joinMode)

    设置 SQL 连接模式以显示或隐藏具有 NULL 外键的行。

    enum QSqlRelationalTableModel::JoinMode

    • InnerJoin:内连接模式,当两个表中至少有一个匹配时返回行。
    • LeftJoin:左连接模式,返回左表 (table_name1) 中的所有行,即使右表 (table_name2) 中没有匹配项。

    5、void setRelation(int column, const QSqlRelation &relation)

    让指定的列 column 是由 relation 指定的外部索引。


    QSqlRelationalDelegate

    一、描述

    QSqlRelationalDelegate 类提供了一个委托,用于显示和编辑来自 QSqlRelationalTableModel 的数据。与默认委托不同,QSqlRelationalDelegate 为其他表的外键字段提供了一个下拉框。

  • 相关阅读:
    JSON.JSONObject,JSONArray互相转化
    代码随想录补打卡 121买卖股票的最佳时机 122 买卖股票的最佳时机 二123买卖股票的最佳时机 三
    电脑重装系统后Win11扬声器无插座信息如何解决?
    MySQL无法查看系统默认字符集以及校验规则
    【坐标系】各引擎坐标系
    用HarmonyOS ArkUI来开发一个购物应用程序
    rabiitmq 队列数据丢失问题
    监控指标--监控指标(3)
    linux读取U盘操作
    IntelliJ IDEA远程调试:使用IDEA Remote Debug进行高效调试的指南
  • 原文地址:https://blog.csdn.net/kenfan1647/article/details/126743909