详细描述
QSqlRelationalTableModel 为单一库表提供一个支持外键的可编辑的数据模型。
上面左边屏幕截图显示了
QTableView中一个简单的
QSqlTableModel 。外键(city和country)没有被解析为人类可读的值。右边屏幕的截图显示了(
QTableView中一个简单的)
QSqlRelationalTableModel,通过外键解析成人类可读的文本字符串。
下面的代码片段显示了如何建立(设置)一个
QSqlRelationalTableModel:
model->setTable("employee");
model->setRelation(2, QSqlRelation("city", "id", "name"));
model->setRelation(3, QSqlRelation("country", "id", "name"));
以上两个selRelation()函数调用在两张表之间建立联系。第一个调用(即:
model->setRelation(2,
QSqlRelation
("city", "id", "name"));)指定employee(员工)表的第二列(字段)是映射到city(城市)表id字段的一个外键,并且视图应该呈现city表的name(名称)字段给用户。第二个调用(即:
model->setRelation(3,
QSqlRelation
("country", "id", "name"));)对于第3列(字段)的行为和第一个调用类似(即:员工表的第三列是映射到country(国家)表id字段的一个外键,并且视图应该呈现country表的name字段给用户)。
如果你使用一个读写
QSqlRelationalTableModel ,你可能要在视图中使用
QSqlRelationalDelegate 委托。不像默认的委托,
QSqlRelationalDelegate 对关联到其他表的外键(的)字段提供了一个组合框(下拉列表框)。使用这个类,在视图中简单地以一个
QSqlRelationalDelegate 实例调用
QAbstractItemView::setItemDelegate() 即可。
示例:
QTableView *view = new QTableView;
view->setModel(model);
view->setItemDelegate(new QSqlRelationalDelegate(view));
Relational Table Model Example例子(可在Qt帮助文档搜索)演示了怎么结合
QSqlRelationalDelegate 来使用
QSqlRelationalTableModel 以提供带有外键支持的表。
以下是例子运行的截图:
注意:
*该表必须有一个主键声明。
*该表的主键可能不包含与另一张表的关系。
*如果关系表包含指向引用表不存在行的键,包含无效键的行不会通过模型暴露(展现)。用户和数据库负责保持引用的完整性。
*如果关系的显示列名称也被用作关系表的列(字段)名称,或者如果在多个关系中使用它作为显示列名,它将会是个别名。这个别名是用下划线连接关联表名,显示列名和唯一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。
相关成员
enum QSqlRelationalTableModel::JoinMode
枚举常量 | 值 | 描述 |
QSqlRelationalTableModel::InnerJoin | 0 | 内连接模式,在两个表中至少有一个匹配时返回行 |
QSqlRelationalTableModel::LeftJoin | 1 | 左连接模式,从左表(table_name1)返回所有 的行,即使右表(table_name2)没有一个匹配 |
相关API
QSqlRelationalTableModel::QSqlRelationalTableModel(QObject *parent = Q_NULLPTR, QSqlDatabase db = QSqlDatabase())
构造一个空的
QSqlRelationalTableModel 并设置父对象为parent,设置数据库连接为db。如果db无效,将会使用默认连接。
[virtual] QSqlRelationalTableModel::~QSqlRelationalTableModel()
销毁对象并释放任何已经分配的资源。
[virtual] void QSqlRelationalTableModel::clear()
重新实现
QSqlQueryModel::clear()。
[virtual] QVariant QSqlRelationalTableModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const
重新实现
QAbstractItemModel::data() 。
[virtual protected] bool QSqlRelationalTableModel::insertRowIntoTable(const QSqlRecord &values)
重新实现
QSqlTableModel::insertRowIntoTable() 。
[virtual protected] QString QSqlRelationalTableModel::orderByClause() const
重新实现
QSqlTableModel::orderByClause() 。
QSqlRelation QSqlRelationalTableModel::relation(int column) const
返回列(字段)column的关系,如果没有设置关系则返回一个无效的关系。
[virtual] QSqlTableModel *QSqlRelationalTableModel::relationModel(int column) const
返回一个
QSqlTableModel 对象,用于访问列column是一个外键的的表,如果没有给定列column的关系,则返回0。
返回的对象是属于
QSqlRelationalTableModel。
[virtual] bool QSqlRelationalTableModel::removeColumns(int column, int count, const QModelIndex &parent = QModelIndex())
重新实现
QAbstractItemModel::removeColumns()。
[virtual slot] void QSqlRelationalTableModel::revertRow(int row)
重新实现
QSqlTableModel::revertRow()。
[virtual] bool QSqlRelationalTableModel::select()
重新实现
QSqlTableModel::select()。
[virtual protected] QString QSqlRelationalTableModel::selectStatement() const
重新实现
QSqlTableModel::selectStatement()。
[virtual] bool QSqlRelationalTableModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)
重新实现
QAbstractItemModel::setData()。
设置项目中角色的数据,并将指定的索引index的值设置为给定的值value。根据编辑策略,值可能马上被应用到数据库,也可能被缓存到模型中。
如果值可以被设置,则返回true,否则,返回false(例如,索引index超出范围)。
对于关联的列,值value必须是索引,而不是显示值。索引也必须存在于引用表中,否则函数返回false。
void QSqlRelationalTableModel::setJoinMode(QSqlRelationalTableModel::JoinMode joinMode)
设置SQL的连接模式位joinMode以显示或隐藏带有空外键的行。在内连接模式(
QSqlRelationalTableModel::InnerJoin)(默认模式)这些行不会显示;如果你想显示它们则使用左连接模式(
QSqlRelationalTableModel::LeftJoin)。
[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字段呈现给用户(查看)。
注意:表的主键可能不包含与另一个表的关系。
[virtual] void QSqlRelationalTableModel::setTable(const QString &table)
重新实现
QSqlTableModel::setTable()。
[virtual protected] bool QSqlRelationalTableModel::updateRowInTable(int row, const QSqlRecord &values)
重新实现
QSqlTableModel::updateRowInTable()。