QSqlRelationalTableModel Class

QSqlRelationalTableModel 类为单个数据库表提供可编辑的数据模型,并支持外键。更多

Header: #include <QSqlRelationalTableModel>
CMake: find_package(Qt6 REQUIRED COMPONENTS Sql)
target_link_libraries(mytarget PRIVATE Qt6::Sql)
qmake: QT += sql
继承: QSqlTableModel

公共类型

enum JoinMode { InnerJoin, LeftJoin }

公共函数

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

重新实现的公共函数

virtual void clear() override
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override
virtual bool removeColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override
virtual bool select() override
virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override
virtual void setTable(const QString &table) override

公共槽

virtual void revertRow(int row) override

重新实现的保护函数

virtual bool insertRowIntoTable(const QSqlRecord &values) override
virtual QString orderByClause() const override
virtual QString selectStatement() const override
virtual bool updateRowInTable(int row, const QSqlRecord &values) override

详细说明

QSqlRelationalTableModel 与QSqlTableModel 类似,但允许将列设置为其他数据库表的外键。

左侧截图显示的是QTableView 中的普通QSqlTableModel 。外键(citycountry )没有解析为人类可读的值。右边的截图显示的是 QSqlRelationalTableModel,外键已解析为人类可读的文本字符串。

下面的代码片段显示了 QSqlRelationalTableModel 的设置过程:

    model->setTable("employee");

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

setRelation() 函数调用在两个表之间建立了关系。第一次调用指定表employee 中的列 2 是与表city 的字段id 映射的外键,视图应向用户显示cityname 字段。第二个调用对列 3 执行类似操作。

如果您使用的是读写 QSqlRelationalTableModel,您可能希望在视图中使用QSqlRelationalDelegate 。与默认委托不同,QSqlRelationalDelegate 为作为其他表外键的字段提供了一个组合框。要使用该类,只需在视图中使用QSqlRelationalDelegate 的实例调用QAbstractItemView::setItemDelegate() 即可:

    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' OR relTblAl_3='USA'"))。
  • 使用setData() 时,角色应始终为Qt::EditRole ,使用data() 时,角色应始终为Qt::DisplayRole

另请参阅 QSqlRelation,QSqlRelationalDelegate关系表模型示例

成员类型文档

enum QSqlRelationalTableModel::JoinMode

常数说明
QSqlRelationalTableModel::InnerJoin0- 内连接模式,当两个表中至少有一个匹配时返回记录。
QSqlRelationalTableModel::LeftJoin1- 左连接模式,即使右表(table_name2)中没有匹配项,也会返回左表(table_name1)中的所有记录。

另请参阅 QSqlRelationalTableModel::setJoinMode() 。

成员函数文档

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

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

[virtual noexcept] QSqlRelationalTableModel::~QSqlRelationalTableModel()

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

[override virtual] void QSqlRelationalTableModel::clear()

重新实现:QSqlTableModel::clear().

[override virtual] QVariant QSqlRelationalTableModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const

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

另请参阅 setData().

[override virtual protected] bool QSqlRelationalTableModel::insertRowIntoTable(const QSqlRecord &values)

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

[override virtual protected] QString QSqlRelationalTableModel::orderByClause() const

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

QSqlRelation QSqlRelationalTableModel::relation(int column) const

返回column 列的关系式,如果未设置关系式,则返回无效关系式。

另请参阅 setRelation() 和QSqlRelation::isValid()。

[virtual] QSqlTableModel *QSqlRelationalTableModel::relationModel(int column) const

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

返回的对象归QSqlRelationalTableModel 所有。

另请参阅 setRelation() 和relation()。

[override virtual] bool QSqlRelationalTableModel::removeColumns(int column, int count, const QModelIndex &parent = QModelIndex())

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

[override virtual slot] void QSqlRelationalTableModel::revertRow(int row)

重实现:QSqlTableModel::revertRow(int row)。

[override virtual] bool QSqlRelationalTableModel::select()

重新实现:QSqlTableModel::select().

[override virtual protected] QString QSqlRelationalTableModel::selectStatement() const

重实现:QSqlTableModel::selectStatement() const.

[override virtual] 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 ;如果出错(例如index 越界),则返回 false。

对于关系列,value 必须是索引,而不是显示值。如果给定了索引,该索引也必须存在于引用的表中,否则函数返回false 。如果传递的是 QVariant() 而不是索引,索引将被清除。

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

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

设置 SQLjoinMode 以显示或隐藏带有 NULL 外键的记录。在InnerJoin 模式(默认)下,不会显示这些记录:如果要显示,请使用LeftJoin 模式。

另请参阅 QSqlRelationalTableModel::JoinMode

[virtual] 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 字段。

注意:表的主键可能不包含与另一个表的关系。

另请参阅 relation() 。

[override virtual] void QSqlRelationalTableModel::setTable(const QString &table)

重实现:QSqlTableModel::setTable(const QString &tableName).

[override virtual protected] bool QSqlRelationalTableModel::updateRowInTable(int row, const QSqlRecord &values)

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

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.