QSqlRelationalTableModel Class
QSqlRelationalTableModel 类为单个数据库表提供可编辑的数据模型,并支持外键。更多
Header: | #include <QSqlRelationalTableModel> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Sql) target_link_libraries(mytarget PRIVATE Qt6::Sql) |
qmake: | QT += sql |
继承: | QSqlTableModel |
- 所有成员(包括继承成员)的列表
- QSqlRelationalTableModel 属于数据库类。
公共类型
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 。外键(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
映射的外键,视图应向用户显示city
的name
字段。第二个调用对列 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::InnerJoin | 0 | - 内连接模式,当两个表中至少有一个匹配时返回记录。 |
QSqlRelationalTableModel::LeftJoin | 1 | - 左连接模式,即使右表(table_name2)中没有匹配项,也会返回左表(table_name1)中的所有记录。 |
成员函数文档
[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
映射的外键,视图应向用户显示city
的name
字段。
注意:表的主键可能不包含与另一个表的关系。
另请参阅 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.