QSqlRelationalTableModel 类

QSqlRelationalTableModel 类提供了一个具有外键支持的、针对单个数据库表的可编辑数据模型。 更多...

头文件 #include <QSqlRelationalTableModel>
CMakefind_package(Qt6 REQUIRED COMPONENTS Sql)
target_link_libraries(mytarget PRIVATE Qt6::Sql)
qmakeQT += sql
继承自 QSqlTableModel

公共类型

枚举JoinMode { InnerJoin, LeftJoin }

公共函数

QSqlRelationalTableModel(QObject *parent = nullptr, const QSqlDatabase &db = QSqlDatabase())
virtual~QSqlRelationalTableModel()
QSqlRelationrelation(int column) const
virtual QSqlTableModel *relationModel(int column) const
voidsetJoinMode(QSqlRelationalTableModel::JoinMode joinMode)
virtual voidsetRelation(int column, const QSqlRelation &relation)

重写的公共函数

virtual voidclear() override
virtual QVariantdata(const QModelIndex &index, int role = Qt::DisplayRole) const override
virtual boolremoveColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override
virtual boolselect() override
virtual boolsetData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override
virtual voidsetTable(const QString &table) override

公共槽函数

virtual voidrevertRow(int row) override

重写的保护函数

virtual boolinsertRowIntoTable(const QSqlRecord &values) override
virtual QStringorderByClause() const override
virtual QStringselectStatement() const override
virtual boolupdateRowInTable(int row, const QSqlRecord &values) override

详细描述

QSqlRelationalTableModel 类表现得像 QSqlTableModel,但允许将列设置为指向其他数据库表的外键。

左侧截图显示了一个普通的 QSqlTableModel,它位于 QTableView 中。外键(citycountry)未解析为可读的值。右侧截图显示了一个QSqlRelationalTableModel,其中外键已被解析为可读的文本字符串。

以下代码片段显示了如何设置QSqlRelationalTableModel

    model->setTable("employee");

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

setRelation() 函数调用在两个表之间建立关系。第一次调用指定在employee 表的列 2 是一个外键,它映射到表 cityid 字段,并且视图应向用户展示 cityname 字段。第二次调用与列 3 执行相似的操作。

如果您使用读写 QSqlRelationalTableModel,可能希望在对视图使用 QSqlRelationalDelegate。与默认的代理不同,QSqlRelationalDelegate 为外键字段提供组合框。要使用该类,只需在视图上调用 QAbstractItemView::setItemDelegate() 方法,并传入一个 QSqlRelationalDelegate 的实例即可。

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

relationaltablemodel 示例说明了如何结合使用 QSqlRelationalDelegate 来使用QSqlRelationalTableModel,以提供具有外键支持的表。

备注

  • 表必须声明主键。
  • 表的主键可能不包含对其他表的引用。
  • 如果关系表中包含引用所引用表中不存在行的键,则包含无效键的行不会通过模型暴露。用户或数据库负责保持引用完整性。
  • 如果关系显示列名称也是关系表中列的名称,或者如果它被用作多个关系中的显示列名称,则它将被别名为。别名是关系表名称、显示列名称和唯一 ID 通过下划线连接(例如,tablename_columnname_id)。QSqlRecord::fieldName() 将返回别名列。当检测到重复的显示列名称时,所有重复的显示列名称都会被别名为,但不对主表中的列名进行别名化。别名化不影响 QSqlRelation,因此 QSqlRelation::displayColumn() 将返回原始显示列名称。
  • 引用表名称被别名为。别名为 "relTblAl" 和关联列索引通过下划线连接(例如,relTblAl_2)。别 danh可以使用来过滤表(例如,设置过滤器 "relTblAl_2='Oslo' OR relTblAl_3='USA'")。
  • 当使用 setData() 时,角色始终应为 Qt::EditRole,当使用 data() 时,角色始终应为 Qt::DisplayRole

另请参阅QSqlRelationQSqlRelationalDelegate关系表模型示例

成员类型文档

枚举QSqlRelationalTableModel::JoinMode

常量描述
QSqlRelationalTableModel::InnerJoin0- 内连接模式,当两个表中有至少一个匹配时返回行。
QSqlRelationalTableModel::LeftJoin1- 左连接模式,返回左表(table_name1)的所有行,即使右表(table_name2)没有匹配。

另请参阅 QSqlRelationalTableModel::setJoinMode(。

成员函数文档

[显式] QSqlRelationalTableModel::QSqlRelationalTableModel(QObject *parent = nullptr, const QSqlDatabase &db = QSqlDatabase())

创建一个空的QSqlRelationalTableModel,并将父对象设置为parent和数据库连接设置为db。如果db无效,将使用默认数据库连接。

[虚拟 noexcept] QSqlRelationalTableModel::~QSqlRelationalTableModel()

销毁对象并释放任何分配的资源。

[重写虚拟] void QSqlRelationalTableModel::clear()

重新实现: QSqlTableModel::clear

[重写虚拟] QVariant QSqlRelationalTableModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const

重新实现: QSqlTableModel::data(const QModelIndex &index, int role) const

另请参阅 setData

[重写虚拟受保护] bool QSqlRelationalTableModel::insertRowIntoTable(const QSqlRecord &values)

重新实现: QSqlTableModel::insertRowIntoTable(const QSqlRecord &values)。

[重写虚拟受保护] QString QSqlRelationalTableModel::orderByClause() const

重新实现: QSqlTableModel::orderByClause() const

QSqlRelation QSqlRelationalTableModel::relation(int column) const

返回列column的关系,如果没有设置关系,则返回一个无效的关系。

另请参阅 setRelationQSqlRelation::isValid

[虚拟] QSqlTableModel *SqlRelationalTableModel::relationModel(int column) const

返回一个QSqlTableModel对象,该对象用于访问外键列column对应的表,如果没有给定column的关系,则返回nullptr

返回的对象由QSqlRelationalTableModel拥有。

另请参阅 setRelationrelation

[重写虚拟] bool QSqlRelationalTableModel::removeColumns(int column, int count, const QModelIndex &parent = QModelIndex())

重新实现: QSqlTableModel::removeColumns(int column, int count, const QModelIndex &parent)。

[重写虚函数槽] void QSqlRelationalTableModel::revertRow(int row)

重写: QSqlTableModel::revertRow(int row).

[重写虚函数] bool QSqlRelationalTableModel::select()

重写: QSqlTableModel::select().

[重写虚保护函数] QString QSqlRelationalTableModel::selectStatement() const

重写: QSqlTableModel::selectStatement() const.

[重写虚函数] bool QSqlRelationalTableModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)

重写: QSqlTableModel::setData(const QModelIndex &index, const QVariant &value, int role).

将指定 index 项中的 role 数据设置为给定的 value。根据编辑策略,该值可能立即应用于数据库,或可能缓存在模型中。

如果值可以设置,则返回 true,或出错时为 false(例如,如果 index 超出范围)。

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

另请参阅editStrategy(),data(),submit() 和 revertRow()。

void QSqlRelationalTableModel::setJoinMode(QSqlRelationalTableModel::JoinMode joinMode)

设置 SQL joinMode 以显示或隐藏具有 NULL 外键的行。在 InnerJoin 模式(默认)下,这些行将不会显示:如果您想显示它们,请使用 LeftJoin 模式。

另请参阅QSqlRelationalTableModel::JoinMode

[虚函数] void QSqlRelationalTableModel::setRelation(int column, const QSqlRelation &relation)

允许指定的 column 成为由 relation 指定的外键。

例子

    model->setTable("employee");

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

setRelation() 调用指定在表 employee 中的第 2 列是外键,与表 city 中的 id 字段相关联,并且视图应向用户呈现 cityname 字段。

注意:表的.primary_key 可能不会包含与另一个表的关联。

另请参阅relation().

[重写虚函数] void QSqlRelationalTableModel::setTable(const QString &table)

重写: QSqlTableModel::setTable(const QString &tableName).

[重载虚拟保护] bool QSqlRelationalTableModel::updateRowInTable(int row, const QSqlRecord &values)

重实现对: QSqlTableModel::updateRowInTable(int row, const QSqlRecord &values).

© 2024 Qt 公司有限公司. 文档贡献版权属于各自所有者。本提供的文档是根据自由软件基金会发布的 GNU 自由文档许可协议版本 1.3 的条款许可。Qt 及其相关标志是芬兰及/或其他国家 Qt 公司的商标。所有其他商标均为其各自所有者的财产。