Qt 之 QSqlRelationalTableModel Class

来源:互联网 发布:ubuntu服务器中文版 编辑:程序博客网 时间:2024/06/16 12:41

详细描述

QSqlRelationalTableModel 为单一库表提供一个支持外键的可编辑的数据模型。
QSqlRelationalTableModel 行为就像 QSqlTableModel,但是允许将列作为外键设置给(到)其他库表。


上面左边屏幕截图显示了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::InnerJoin0内连接模式,在两个表中至少有一个匹配时返回行QSqlRelationalTableModel::LeftJoin1左连接模式,从左表(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()。