QSqlRelationalTableModel Class Reference

[QtSql module]

该QSqlRelationalTableModel类提供了一个可编辑的数据模型为单个数据库表,与外键的支持。More…

继承QSqlTableModel

Types

  • enum JoinMode { InnerJoin, LeftJoin }

Methods

  • __init__ (self, QObject parent = None, QSqlDatabase db = QSqlDatabase())
  • clear (self)
  • QVariant data (self, QModelIndex index, int role = Qt.DisplayRole)
  • bool insertRowIntoTable (self, QSqlRecord values)
  • QString orderByClause (self)
  • QSqlRelation relation (self, int column)
  • QSqlTableModel relationModel (self, int column)
  • bool removeColumns (self, int column, int count, QModelIndex parent = QModelIndex())
  • revertRow (self, int row)
  • bool select (self)
  • QString selectStatement (self)
  • bool setData (self, QModelIndex index, QVariant value, int role = Qt.EditRole)
  • setJoinMode (self, JoinMode joinMode)
  • setRelation (self, int column, QSqlRelation relation)
  • setTable (self, QString tableName)
  • bool updateRowInTable (self, int row, QSqlRecord values)

Detailed Description

该QSqlRelationalTableModel类提供了一个可编辑的数据模型为单个数据库表,与外键的支持。

QSqlRelationalTableModel就像QSqlTableModel,但允许列要被设置为外键成其他数据库表。

| QSqlRelationalTableModel Class Reference - 图1 | QSqlRelationalTableModel Class Reference - 图2 |

左边的屏幕截图显示了纯QSqlTableModelQTableView。外键(citycountry)不会被解析为可读价值。右边的屏幕截图显示了QSqlRelationalTableModel ,与外键分解成可读的文本字符串。

下面的代码片段显示了QSqlRelationalTableModel是如何设置:

  1. model->setTable("employee");
  2. model->setRelation(2, [QSqlRelation]($docs-qsqlrelation.html)("city", "id", "name"));
  3. model->setRelation(3, [QSqlRelation]($docs-qsqlrelation.html)("country", "id", "name"));

setRelation( )函数调用建立两个表之间的关系。第一次调用指定表2列employee是,与字段映射外键idcity,而认为应该提出的cityname字段给用户。第二次调用是否与第3列类似的东西。

如果你使用一个读写QSqlRelationalTableModel ,你可能想使用QSqlRelationalDelegate在视图上。不同的是默认的委讬,QSqlRelationalDelegate提供了一个组合框是外键到其他表中的字段。使用类,只需调用QAbstractItemView.setItemDelegate( )与实例的视图QSqlRelationalDelegate

  1. [QTableView]($docs-qtableview.html) *view = new [QTableView]($docs-qtableview.html);
  2. view->setModel(model);
  3. view->setItemDelegate(new [QSqlRelationalDelegate]($docs-qsqlrelationaldelegate.html)(view));

sql/relationaltablemodel示例说明了如何使用QSqlRelationalTableModel与配合QSqlRelationalDelegate提供表外键的支持。

QSqlRelationalTableModel Class Reference - 图3

注意事项:

  • The table must have a primary key declared.
  • The table’s primary key may not contain a relation to another table.
  • If a relational table contains keys that refer to non-existent rows in the referenced table, the rows containing the invalid keys will not be exposed through the model. The user or the database is responsible for keeping referential integrity.
  • If a relation’s display column name is also used as a column name in the main table, or if it is used as display column name in more than one relation it will be aliased. The alias is is the relation’s table name and display column name joined by an underscore (e.g. tablename_columnname). All occurrences of the duplicate display column name are aliased when duplication is detected, but no aliasing is done to the column names in the main table. The aliasing doesn’t affect QSqlRelation, so QSqlRelation.displayColumn() will return the original display column name, but QSqlRecord.fieldName() will return aliases.
  • When using setData() the role should always be Qt.EditRole, and when using data() the role should always be Qt.DisplayRole.

Type Documentation

  1. QSqlRelationalTableModel.JoinMode

此枚举指定的模式连接两个表时要使用的类型。

Constant Value Description
QSqlRelationalTableModel.InnerJoin 0 内部联接模式,返回行的时候,至少有一个匹配两个表中。
QSqlRelationalTableModel.LeftJoin 1 LEFT JOIN模式,返回左表( table_name1 )的所有行,即使在右表( table_name2 )的结果。

这个枚举被引入或修改的Qt 4.8 。

See also QSqlRelationalTableModel.setJoinMode( ) 。


Method Documentation

  1. QSqlRelationalTableModel.__init__ (self, QObject parent = None, QSqlDatabase db = QSqlDatabase())

parent的说法,如果不是没有,原因self通过Qt的,而不是PyQt的拥有。

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

  1. QSqlRelationalTableModel.clear (self)

从重新实现QSqlQueryModel.clear( ) 。

  1. QVariant QSqlRelationalTableModel.data (self, QModelIndex index, int role = Qt.DisplayRole)

从重新实现QAbstractItemModel.data( ) 。

See also setData( ) 。

  1. bool QSqlRelationalTableModel.insertRowIntoTable (self, QSqlRecord values)

从重新实现QSqlTableModel.insertRowIntoTable( ) 。

  1. QString QSqlRelationalTableModel.orderByClause (self)

从重新实现QSqlTableModel.orderByClause( ) 。

  1. QSqlRelation QSqlRelationalTableModel.relation (self, int column)

[

返回列的关系column或无效的关系,如果没有关系设定。

]($docs-qsqlrelation.html)

See also setRelation()和QSqlRelation.isValid( ) 。

  1. QSqlTableModel QSqlRelationalTableModel.relationModel (self, int column)

返回QSqlTableModel对象,用于访问表的量column是外键,或者0,如果没有为给定的没有关系column

返回的对象是由资QSqlRelationalTableModel

See also setRelation()和relation( ) 。

  1. bool QSqlRelationalTableModel.removeColumns (self, int column, int count, QModelIndex parent = QModelIndex())

从重新实现QAbstractItemModel.removeColumns( ) 。

  1. QSqlRelationalTableModel.revertRow (self, int row)

从重新实现QSqlTableModel.revertRow( ) 。

  1. bool QSqlRelationalTableModel.select (self)

从重新实现QSqlTableModel.select( ) 。

  1. QString QSqlRelationalTableModel.selectStatement (self)

从重新实现QSqlTableModel.selectStatement( ) 。

  1. bool QSqlRelationalTableModel.setData (self, QModelIndex index, QVariant value, int role = Qt.EditRole)

从重新实现QAbstractItemModel.setData( ) 。

设置数据的role在用指定的项indexvalue给出。取决于编辑策略,则该值可能被应用到数据库一次,或者它可以在模型中被缓存。

返回True如果该值可以设置,或虚假的错误(例如,如果index是出界) 。

对于关系栏目,value必须是索引,而不是显示值。该指数还必须存在于被引用表,否则返回False 。

See also editStrategy( )data( )submit()和revertRow( ) 。

  1. QSqlRelationalTableModel.setJoinMode (self, JoinMode joinMode)

设置SQL加盟模式由给定的值joinMode要显示或隐藏与NULL外键的行。

In InnerJoin模式(默认)这些行不会被显示;使用LeftJoin模式下,如果你想向他们展示。

此功能被引入Qt的4.8 。

See also QSqlRelationalTableModel.JoinMode

  1. QSqlRelationalTableModel.setRelation (self, int column, QSqlRelation relation)

让指定的column可以通过指定的外国指数relation

例如:

  1. model->setTable("employee");
  2. model->setRelation(2, [QSqlRelation]($docs-qsqlrelation.html)("city", "id", "name"));

该setRelation ( )调用指定表2列employee是,与字段映射外键idcity,而认为应该提出的cityname字段给用户。

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

See also relation( ) 。

  1. QSqlRelationalTableModel.setTable (self, QString tableName)

从重新实现QSqlTableModel.setTable( ) 。

  1. bool QSqlRelationalTableModel.updateRowInTable (self, int row, QSqlRecord values)

从重新实现QSqlTableModel.updateRowInTable( ) 。