QSqlTableModel 类
QSqlTableModel 类提供了一个单个数据库表的可编辑数据模型。 了解更多...
头文件 | #include <QSqlTableModel> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Sql) target_link_libraries(mytarget PRIVATE Qt6::Sql) |
qmake | QT += sql |
继承自 | QSqlQueryModel |
继承 |
- 所有成员列表,包括继承成员
- QSqlTableModel 属于 数据库类。
公共类型
枚举 | EditStrategy { OnFieldChange, OnRowChange, OnManualSubmit } |
公共函数
QSqlTableModel(QObject *parent = nullptr, const QSqlDatabase &db = QSqlDatabase()) | |
虚拟 | ~QSqlTableModel() |
QSqlDatabase | database() const |
QSqlTableModel::EditStrategy | editStrategy() const |
int | fieldIndex(const QString &fieldName) const |
QString | filter() const |
bool | insertRecord(int row, const QSqlRecord &record) |
bool | isDirty(const QModelIndex &index) const |
bool | isDirty() const |
QSqlIndex | primaryKey() const |
QSqlRecord | record() const |
QSqlRecord | record(int row) const |
虚拟 void | revertRow(int row) |
虚拟 void | setEditStrategy(QSqlTableModel::EditStrategy strategy) |
虚拟 void | setFilter(const QString &filter) |
bool | setRecord(int row, const QSqlRecord &values) |
虚拟 void | setSort(int column, Qt::SortOrder order) |
虚拟 void | setTable(const QString &tableName) |
QString | tableName() const |
重写的公共函数
虚拟 void | clear() override |
虚拟 bool | clearItemData(const QModelIndex &index) override |
虚拟 QVariant | data(const QModelIndex &index, int role = Qt::DisplayRole) const override |
虚拟 Qt::ItemFlags | flags(const QModelIndex &index) const override |
虚拟 QVariant | headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override |
虚拟 bool | insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override |
虚拟 bool | removeColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override |
虚拟 bool | removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override |
virtual int | rowCount(const QModelIndex &parent = QModelIndex()) const override |
虚拟 bool | setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override |
虚拟 void | sort(int column, Qt::SortOrder order) override |
公共槽
虚拟 void | revert() override |
void | revertAll() |
虚拟 bool | select() |
虚拟 bool | selectRow(int row) |
虚拟 bool | submit() override |
bool | submitAll() |
信号
void | beforeDelete(int row) |
void | beforeInsert(QSqlRecord &record) |
void | beforeUpdate(int row, QSqlRecord &record) |
void | primeInsert(int row, QSqlRecord &record) |
保护函数
虚拟 bool | deleteRowFromTable(int row) |
虚拟 bool | insertRowIntoTable(const QSqlRecord &values) |
virtual QString | orderByClause() const |
QSqlRecord | primaryValues(int row) const |
virtual QString | selectStatement() const |
void | setPrimaryKey(const QSqlIndex &key) |
虚拟 bool | updateRowInTable(int row, const QSqlRecord &values) |
重实现保护函数
virtual QModelIndex | indexInQuery(const QModelIndex &item) const override |
详细信息
QSqlTableModel 是从单个表中读取和写入数据库记录的高级接口。它在较低级别的 QSqlQuery 上构建,可以用于为例如 QTableView 这样的视图类提供数据。例如
QSqlTableModel *model = new QSqlTableModel; model->setTable("employee"); model->setEditStrategy(QSqlTableModel::OnManualSubmit); model->select(); model->setHeaderData(0, Qt::Horizontal, tr("Name")); model->setHeaderData(1, Qt::Horizontal, tr("Salary")); QTableView *view = new QTableView; view->setModel(model); view->hideColumn(0); // don't show the ID view->show();
我们设置 SQL 表的名称和编辑策略,然后设置视图标题中显示的标签。编辑策略决定用户在视图中所做的更改何时实际应用到数据库。可能的值有 OnFieldChange,OnRowChange,和 OnManualSubmit。
QSqlTableModel 还可以用于以编程方式访问数据库,而不将其绑定到视图
QSqlTableModel model; model.setTable("employee"); model.select(); int salary = model.record(4).value("salary").toInt();
上面的代码片段从查询 SELECT * from employee
的结果集中提取第 4 条记录的 salary
字段。
可以使用 setFilter() 设置过滤器,或使用 setSort() 修改排序顺序。最后,必须调用 select() 将数据填充到模型中。
tablemodel 示例说明了如何将 QSqlTableModel 作为 QTableView 的数据源使用。
QSqlTableModel 不直接支持外键。如果您想解决外键,请使用 QSqlRelationalTableModel 和 QSqlRelationalDelegate。
另请参阅QSqlRelationalTableModel,QSqlQuery,模型/视图编程,表模型示例 和 缓存的 SQL 表。
成员类型文档
枚举 QSqlTableModel::EditStrategy
该枚举类型描述了在数据库中编辑值时应选择哪种策略。
常量 | 值 | 描述 |
---|---|---|
QSqlTableModel::OnFieldChange | 0 | 对所有模型更改将立即应用于数据库。 |
QSqlTableModel::OnRowChange | 1 | 当用户选择不同的行时,将对行的更改应用。 |
QSqlTableModel::OnManualSubmit | 2 | 所有更改将缓存到模型中,直到调用 submitAll() 或 revertAll()。 |
注意:为防止将仅部分初始化的行插入到数据库中,OnFieldChange
将对新插入的行表现得像 OnRowChange
。
另请参阅setEditStrategy。
成员函数文档
[显式]
QSqlTableModel::QSqlTableModel(QObject *parent = nullptr, const QSqlDatabase &db = QSqlDatabase())
创建一个空的 QSqlTableModel,并设置父对象为 parent 以及数据库连接为 db。如果 db 无效,将使用默认数据库连接。
默认编辑策略是 OnRowChange。
[虚拟 noexcept]
QSqlTableModel::~QSqlTableModel()
销毁对象并释放任何分配的资源。
[信号]
void QSqlTableModel::beforeDelete(int row)
在删除当前活动数据库表的 row 之前,该信号由 deleteRowFromTable() 引发。
[信号]
void QSqlTableModel::beforeInsert(QSqlRecord &record)
在当前活动数据库表中插入新行之前,该信号由 insertRowIntoTable() 引发。即将插入的值存储在 record 中,可以在它们被插入之前对其进行修改。
[信号]
void QSqlTableModel::beforeUpdate(int row, QSqlRecord &record)
在当前活动数据库表中使用 record 中的值更新 row 之前,该信号由 updateRowInTable() 引发。
注意,只有标记为生成的值才会更新。可以使用 QSqlRecord::setGenerated() 设置生成的标志,并使用 QSqlRecord::isGenerated() 检查该标志。
另请参阅 QSqlRecord::isGenerated().
[重写虚函数]
void QSqlTableModel::clear()
重实现了: QSqlQueryModel::clear().
[重写虚函数]
bool QSqlTableModel::clearItemData(const QModelIndex &index)
重实现了: QAbstractItemModel::clearItemData(const QModelIndex &index).
[重写虚函数]
QVariant QSqlTableModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const
重实现了: QSqlQueryModel::data(const QModelIndex &item, int role) const.
另请参阅 setData().
QSqlDatabase QSqlTableModel::database() const
返回模型的数据库连接。
[虚拟保护函数]
bool QSqlTableModel::deleteRowFromTable(int row)
从当前活动的数据库表中删除给定的 行。
这是对数据库的直接操作方法,不应该直接调用。使用 removeRow() 或 removeRows() 删除值。模型将根据其编辑策略决定何时修改数据库。
如果删除了行,则返回 true
;否则返回 false
。
另请参阅 removeRow() 和 removeRows().
QSqlTableModel::EditStrategy QSqlTableModel::editStrategy() const
返回当前的编辑策略。
另请参阅setEditStrategy。
int QSqlTableModel::fieldIndex(const QString &fieldName) const
返回字段 fieldName 的索引,如果模型中不存在对应的字段,则返回 -1。
QString QSqlTableModel::filter() const
返回目前设置的过滤器。
[重写虚函数]
Qt::ItemFlags QSqlTableModel::flags(const QModelIndex &index) const
重实现了: QAbstractTableModel::flags(const QModelIndex &index) const.
[重写虚函数]
QVariant QSqlTableModel::headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const
重实现了: QSqlQueryModel::headerData(int section, Qt::Orientation orientation, int role) const.
[重载虚受保护]
QModelIndex QSqlTableModel::indexInQuery(const QModelIndex &item) const
重写: QSqlQueryModel::indexInQuery(const QModelIndex &item) const.
返回模型中给定 item 在数据库结果集中的值索引。
如果没有插入、删除或移动任何行或列,返回值与 item 相同。
如果 item 超出范围或 item 不指向结果集中的值,则返回无效模型索引。
另请参见QSqlQueryModel::indexInQuery().
bool QSqlTableModel::insertRecord(int row, const QSqlRecord &record)
在位置 row 插入 record。如果 row 为负值,则将记录附加到末尾。内部调用 insertRows() 和 setRecord()。
如果记录可以插入,返回 true
,否则返回 false
。
对于 OnFieldChange 和 OnRowChange 编辑策略,更改将立即提交。失败不会在模型中留下新行。
另请参见insertRows(),removeRows()和setRecord().
[虚拟受保护]
bool QSqlTableModel::insertRowIntoTable(const QSqlRecord &values)
将 values 插入当前活动的数据库表中。
这是一个低级方法,直接操作数据库,不应直接调用。使用 insertRow() 和 setData() 插入值。模型将根据其编辑策略决定何时修改数据库。
如果可以插入值,返回 true
,否则返回 false
。可以通过 lastError() 获取错误信息。
另请参见lastError(),insertRow() 和 insertRows().
[重载虚]
bool QSqlTableModel::insertRows(int row, int count, const QModelIndex &parent = QModelIndex())
重写: QAbstractItemModel::insertRows(int row, int count, const QModelIndex &parent).
在位置 row 插入 count 个空行。注意,parent 必须是无效的,因为该模型不支持父子关系。
对于 OnFieldChange 和 OnRowChange 编辑策略,一次只能插入一行,且模型可能不包含其他缓存更改。
对于每个新行将发出 primeInsert 信号。如果您想要用默认值初始化新行,请连接到它。
无论如何编辑策略都没有提交行。
如果参数超出范围或行无法插入,则返回 false
;否则返回 true
。
另请参阅primeInsert() 和 insertRecord。
bool QSqlTableModel::isDirty(const QModelIndex &index) const
如果索引 index 处的值是脏的,则返回 true
,否则返回 false。脏值是指已修改但尚未写入数据库的模型中的值。
如果 index 无效或指向了不存在的行,则返回 false。
bool QSqlTableModel::isDirty() const
这是一个重载函数。
如果模型包含尚未提交到数据库的已修改值,则返回 true
,否则返回 false
。
[虚拟受保护]
QString QSqlTableModel::orderByClause() const
返回基于当前设置排序顺序的 SQL ORDER BY
子句。
另请参阅setSort() 和 selectStatement。
QSqlIndex QSqlTableModel::primaryKey() const
返回当前表的键,如果没有设置表或没有主键,则返回一个空的 QSqlIndex。
另请参阅setTable()、setPrimaryKey 和 QSqlDatabase::primaryIndex。
[受保护]
QSqlRecord QSqlTableModel::primaryValues(int row) const
返回一个包含在主键集设置为 row 处的值表示的字段记录。如果没有定义主键,则返回的记录将包含所有字段。
另请参阅primaryKey。
[信号]
void QSqlTableModel::primeInsert(int row, QSqlRecord &record)
当在当前活动的数据库表的给定的 row 中启动插入时,此信号由 insertRows 发射。可以写参数 record(因为它是一个引用),例如用默认值填充一些字段并设置字段的生成标志。在处理此信号的同时,不要尝试通过如 setData 或 setRecord 等方式编辑记录。
QSqlRecord QSqlTableModel::record() const
这是一个重载函数。
它返回一个空的记录,只包含字段名称。该函数可用于检索记录的字段名称。
另请参阅setRecord 和 QSqlRecord::isEmpty。
QSqlRecord QSqlTableModel::record(int row) const
返回模型中第row行的记录。
如果row是有效行的索引,则记录将填充该行的值。
如果模型未初始化,将返回空记录。
另请参阅QSqlRecord::isEmpty。
[重写虚拟]
bool QSqlTableModel::removeColumns(int column, int count, const QModelIndex &parent = QModelIndex())
重实现: QSqlQueryModel::removeColumns(int column, int count, const QModelIndex &parent).
从起始索引column开始,从parent模型中删除count列。
如果删除列成功,则返回 true;否则返回 false。
另请参阅removeRows。
[重写虚拟]
bool QSqlTableModel::removeRows(int row, int count, const QModelIndex &parent = QModelIndex())
重实现: QAbstractItemModel::removeRows(int row, int count, const QModelIndex &parent).
从起始第row行开始,删除count行。由于此模型不支持层次结构,因此parent必须是无效模型索引。
当编辑策略为OnManualSubmit时,删除数据库中的行将延迟到调用submitAll()时。
对于OnFieldChange和OnRowChange,每次只能删除一行,并且只有当没有其他行有缓存的更改时。删除会立即提交到数据库。在用select()刷新之前,模型保留一个空白行作为成功删除的行。
删除失败后,模型中不会撤销操作。应用程序可以重新提交或撤销。
要删除的范围内的已插入但尚未成功提交的行将立即从模型中删除。
在从数据库中删除行之前,将发出beforeDelete()信号。
如果行索引小于 0 或行索引 + 行数大于 rowCount(),则不执行任何操作并返回 false。如果所有行都可以删除,则返回 true;否则返回 false。可以使用lastError()检索详细数据库错误信息。
另请参阅removeColumns()和insertRows。
[重写虚拟槽]
void QSqlTableModel::revert()
重实现: QAbstractItemModel::revert。
此重写的槽在项目代理调用用户取消编辑当前行时调用。
如果模型的策略设置为OnRowChange或OnFieldChange,则会重置更改。对于OnManualSubmit策略,不执行任何操作。
使用revertAll()函数撤销所有针对OnManualSubmit策略的挂起更改,或使用revertRow()函数撤销特定行的更改。
另请参阅submit()、submitAll()、revertRow()和revertAll[]。
[slot]
void QSqlTableModel::revertAll()
撤销所有挂起的更改。
另请参阅revert()、revertRow()和submitAll[]。
[virtual]
void QSqlTableModel::revertRow(int row)
撤销指定行的所有更改。
另请参阅revert()、revertAll()、submit()和submitAll[]。
[override virtual]
int QSqlTableModel::rowCount(const QModelIndex &parent = QModelIndex()) const
重新实现:QSqlQueryModel::rowCount(const QModelIndex &parent) const。
[virtual slot]
bool QSqlTableModel::select()
使用指定的筛选条件和排序条件,从通过setTable设置的表中填充模型数据,如果成功则返回true
;否则返回false
。
注意:调用select()将撤销任何未提交的更改并删除任何插入的列。
另请参阅setTable、setFilter和selectStatement。
[virtual slot]
bool QSqlTableModel::selectRow(int row)
使用与主键值匹配的数据库表行的值刷新模型中的行。如果没有找到匹配的行,模型将显示空行。
如果成功,则返回true
;否则返回false
。
另请参阅select。
[virtual protected]
QString QSqlTableModel::selectStatement() const
返回用于在模型内部填充数据的内部SQL SELECT
语句。语句包括筛选器和国家规定的顺序子句。
另请参阅filter()和orderByClause。
[override virtual]
bool QSqlTableModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)
重构实现:QAbstractItemModel::setData(const QModelIndex &index, const QVariant &value, int role).
将指定 index 模型的角色 role 的数据设置为 value。
对于编辑策略 OnFieldChange,索引可能只有在没有其他索引缓存更改时才会接收到更改。更改会立即提交。但是,尚未插入数据库的行可以随意更改并且不会自动提交。提交的更改在失败时不会回滚。
对于 OnRowChange,索引可能只有在没有其他行缓存更改时才会接收到更改。更改不会自动提交。
如果 value 等于当前值,则返回 true
。然而,该值将不会提交到数据库。
在成功时返回 true
或在错误时(例如,如果 index 超出范围)返回 false
。
如果角色不是 Qt::EditRole,则返回 false
。要为非 EditRole 的其他角色设置数据,可以要么使用自定义代理模型,要么继承 QSqlTableModel。
另请参阅:editStrategy(),data(),submit(),submitAll() 以及 revertRow()。
[虚拟]
void QSqlTableModel::setEditStrategy(QSqlTableModel::EditStrategy strategy)
将数据库中数值编辑策略设置为 strategy。
这将撤销所有挂起的更改。
另请参阅:editStrategy() 以及 revertAll()。
[保护]
void QSqlTableModel::setFilter(const QString &filter)
将当前过滤器设置为 filter。
过滤器是一个没有 WHERE
关键字的 SQLWHERE子句(例如,name='Josephine')
)。
如果模型已经从数据库中填充了数据,则模型会使用新的过滤器重新选择它。否则,过滤器将在调用 select() 时应用。
另请参阅:filter(),select(),selectStatement() 以及 orderByClause()。
[保护]
void QSqlTableModel::setPrimaryKey(const QSqlIndex &key)
受保护的方法,允许子类将主键设置为 key。
通常,在调用 setTable() 时自动设置主索引。
另请参阅:primaryKey() 及 QSqlDatabase::primaryIndex()。
bool QSqlTableModel::setRecord(int row, const QSqlRecord &values)
将 values 应用到模型中的 row。源字段和目标字段是根据字段名称映射,而不是根据记录中的位置。
请注意,在values中生成的标志将被保留,以确定在向数据库提交更改时是否使用相应的字段。默认情况下,对于QSqlRecord中的所有字段,都设置为true
。您必须使用setGenerated(false)将标志设置为false
,以将更改保存回数据库。
对于编辑策略OnFieldChange和OnRowChange,只有在没有其他行存在缓存的更改时,一个行才可能接收到更改。更改将立即提交。失败时,提交的更改不会被撤销。
如果所有值都可以设置,则返回true
;否则返回false。
另请参阅record()和editStrategy().
[virtual]
void QSqlTableModel::setSort(int column, Qt::SortOrder order)
将column的排序顺序设置为order。这不会影响当前数据,要使用新的排序顺序刷新数据,请调用select().
另请参阅sort(),select()和orderByClause().
[virtual]
void QSqlTableModel::setTable(const QString &tableName)
将模型操作的数据库表设置为tableName。不会从表中选择数据,但会获取其字段信息。
要使用表数据填充模型,请调用select().
可以使用lastError()检索错误信息。
另请参阅select(),setFilter()和lastError().
[override virtual]
void QSqlTableModel::sort(int column, Qt::SortOrder order)
重新实现了:QAbstractItemModel::sort(int column, Qt::SortOrder order).
根据column以order排序数据。这会立即选择数据,使用setSort()设置排序顺序而不填充模型数据。
另请参阅setSort(),select()和orderByClause().
[override virtual slot]
bool QSqlTableModel::submit()
重新实现了:QAbstractItemModel::submit().
此重写的槽在用户停止编辑当前行时由项目代理调用。
如果模型策略设置为OnRowChange或OnFieldChange,则提交当前正在编辑的行。对于OnManualSubmit策略不执行任何操作。
使用submitAll()提交OnManualSubmit策略的所有挂起更改。
在成功时返回 true
;否则返回 false
。使用 lastError() 来查询详细错误信息。
不会自动重新填充模型。在成功时,提交的行将从数据库中刷新。
另请参阅 revert,revertRow,submitAll,revertAll,以及 lastError。
[slot]
bool QSqlTableModel::submitAll()
提交所有挂起的更改,并在成功时返回 true
。在出错时返回 false
,可以使用 lastError() 获取详细错误信息。
在 OnManualSubmit 中,如果成功,模型将重新填充。任何展示该模型的视图都将丢失其选择。
注意:在 OnManualSubmit 模式下,如果 submitAll() 失败,已提交的更改不会从缓存中清除。这允许回滚事务并重新提交而不丢失数据。
QString QSqlTableModel::tableName() const
返回当前所选表的名称。
[virtual protected]
bool QSqlTableModel::updateRowInTable(int row, const QSqlRecord &values)
以指定的 值 更新当前活动数据库表中的给定 行。如果成功则返回 true
;否则返回 false
。
这是一个低级方法,它直接在数据库上操作,不应直接调用。请使用 setData() 来更新值。模型将根据其编辑策略决定何时修改数据库。
请注意,只有设置了生成标志的值才会更新。可以使用 QSqlRecord::setGenerated() 设置生成标志,并且可以使用 QSqlRecord::isGenerated() 测试生成标志。
另请参阅 QSqlRecord::isGenerated() 和 setData。
© 2024 Qt公司有限公司。在此包含的文档贡献的著作权属于其各自的版权所有者。在此提供的文档是根据自由软件基金会发布的 GNU自由文档许可版本1.3 的条款许可的。Qt及其相应的标志是Qt公司有限公司在芬兰和其他全球国家的商标。所有其他商标均为其各自所有者的财产。