QSqlRelationalTableModel 类
QSqlRelationalTableModel 类提供了一个具有外键支持的、针对单个数据库表的可编辑数据模型。 更多...
头文件 | #include <QSqlRelationalTableModel> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Sql) target_link_libraries(mytarget PRIVATE Qt6::Sql) |
qmake | QT += sql |
继承自 | QSqlTableModel |
- 包括继承成员在内的所有成员列表
- QSqlRelationalTableModel 是数据库类的一部分 Database Classes.
公共类型
枚举 | 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,但允许将列设置为指向其他数据库表的外键。
左侧截图显示了一个普通的 QSqlTableModel,它位于 QTableView 中。外键(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 为外键字段提供组合框。要使用该类,只需在视图上调用 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。
另请参阅QSqlRelation,QSqlRelationalDelegate 和 关系表模型示例。
成员类型文档
枚举QSqlRelationalTableModel::JoinMode
常量 | 值 | 描述 |
---|---|---|
QSqlRelationalTableModel::InnerJoin | 0 | - 内连接模式,当两个表中有至少一个匹配时返回行。 |
QSqlRelationalTableModel::LeftJoin | 1 | - 左连接模式,返回左表(table_name1)的所有行,即使右表(table_name2)没有匹配。 |
成员函数文档
[显式]
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的关系,如果没有设置关系,则返回一个无效的关系。
另请参阅 setRelation和QSqlRelation::isValid。
[虚拟]
QSqlTableModel *SqlRelationalTableModel::relationModel(int column) const
返回一个QSqlTableModel对象,该对象用于访问外键列column对应的表,如果没有给定column的关系,则返回nullptr
。
返回的对象由QSqlRelationalTableModel拥有。
另请参阅 setRelation和relation。
[重写虚拟]
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
字段相关联,并且视图应向用户呈现 city
的 name
字段。
注意:表的.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 公司的商标。所有其他商标均为其各自所有者的财产。