本页内容

QSqlTableModel Class

QSqlTableModel 类为单个数据库表提供了一个可编辑的数据模型。更多内容...

标题: #include <QSqlTableModel>
CMake: find_package(Qt6 REQUIRED COMPONENTS Sql)
target_link_libraries(mytarget PRIVATE Qt6::Sql)
qmake: QT += sql
继承自: QSqlQueryModel
被继承者:

QSqlRelationalTableModel

公共类型

enum EditStrategy { OnFieldChange, OnRowChange, OnManualSubmit }

公共函数

QSqlTableModel(QObject *parent = nullptr, const QSqlDatabase &db = QSqlDatabase())
virtual ~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
virtual void revertRow(int row)
virtual void setEditStrategy(QSqlTableModel::EditStrategy strategy)
virtual void setFilter(const QString &filter)
bool setRecord(int row, const QSqlRecord &values)
virtual void setSort(int column, Qt::SortOrder order)
virtual void setTable(const QString &tableName)
QString tableName() const

重新实现的公共函数

virtual void clear() override
virtual bool clearItemData(const QModelIndex &index) override
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override
virtual Qt::ItemFlags flags(const QModelIndex &index) const override
virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override
virtual bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override
virtual bool removeColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override
virtual bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override
virtual int rowCount(const QModelIndex &parent = QModelIndex()) const override
virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override
virtual void sort(int column, Qt::SortOrder order) override

公共插槽

virtual void revert() override
void revertAll()
virtual bool select()
virtual bool selectRow(int row)
virtual 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)

受保护函数

virtual bool deleteRowFromTable(int row)
virtual bool insertRowIntoTable(const QSqlRecord &values)
virtual QString orderByClause() const
QSqlRecord primaryValues(int row) const
virtual QString selectStatement() const
void setPrimaryKey(const QSqlIndex &key)
virtual 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 表。

成员类型文档

enum QSqlTableModel::EditStrategy

此枚举类型用于描述在编辑数据库中的值时应选择哪种策略。

常量值描述
QSqlTableModel::OnFieldChange0对模型的所有更改将立即应用到数据库中。
QSqlTableModel::OnRowChange1对某一行所做的更改将在用户选择另一行时应用。
QSqlTableModel::OnManualSubmit2所有更改都会缓存到模型中,直到调用submitAll() 或revertAll() 为止。

注意:为了防止将仅部分初始化的行插入数据库,对于新插入的行,OnFieldChange 的行为将与OnRowChange 相同。

另请参阅 setEditStrategy()。

成员函数文档

[explicit] QSqlTableModel::QSqlTableModel(QObject *parent = nullptr, const QSqlDatabase &db = QSqlDatabase())

创建一个空的 QSqlTableModel,并将父对象设置为parent ,数据库连接设置为db 。如果db 无效,则将使用默认的数据库连接。

默认编辑策略为OnRowChange 。

[virtual noexcept] QSqlTableModel::~QSqlTableModel()

销毁该对象并释放所有已分配的资源。

[signal] void QSqlTableModel::beforeDelete(int row)

在从当前活动的数据库表中删除row 之前,deleteRowFromTable()会发出此信号。

[signal] void QSqlTableModel::beforeInsert(QSqlRecord &record)

在将新行插入当前活动的数据库表之前,insertRowIntoTable() 会发出此信号。即将插入的值存储在record 中,可在插入前进行修改。

[signal] void QSqlTableModel::beforeUpdate(int row, QSqlRecord &record)

该信号由updateRowInTable()在将row 的值从record 更新到当前活动的数据库表之前发出。

请注意,只有被标记为“生成”的值才会被更新。可通过QSqlRecord::setGenerated() 设置“生成”标记,并通过QSqlRecord::isGenerated() 进行检查。

另请参阅 QSqlRecord::isGenerated()。

[override virtual] void QSqlTableModel::clear()

重写了:QSqlQueryModel::clear()。

[override virtual] bool QSqlTableModel::clearItemData(const QModelIndex &index)

重写了:QAbstractItemModel::clearItemData(const QModelIndex &index)。

[override virtual] QVariant QSqlTableModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const

重写了:QSqlQueryModel::data(const QModelIndex &item, int role) const。

另请参阅 setData()。

QSqlDatabase QSqlTableModel::database() const

返回模型的数据库连接。

[virtual protected] bool QSqlTableModel::deleteRowFromTable(int row)

从当前活动的数据库表中删除指定的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

返回当前设置的过滤器。

另请参阅 setFilter() 和select()。

[override virtual] Qt::ItemFlags QSqlTableModel::flags(const QModelIndex &index) const

重写了:QAbstractTableModel::flags(const QModelIndex &index) const。

[override virtual] QVariant QSqlTableModel::headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const

重写了:QSqlQueryModel::headerData(int section, Qt::Orientation orientation, int role) const。

[override virtual protected] 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)

将record 插入到位置row 处。如果row 为负数,则该记录将追加到末尾。内部调用insertRows()和setRecord()。

如果记录成功插入,则返回true ;否则返回false。

对于OnFieldChange 和OnRowChange ,更改将立即提交。若操作失败,模型中不会保留新行。

另请参阅 insertRows()、removeRows() 和setRecord()。

[virtual protected] bool QSqlTableModel::insertRowIntoTable(const QSqlRecord &values)

将值values 插入到当前活动的数据库表中。

这是一个直接操作数据库的底层方法,不应直接调用。请使用insertRow() 和setData() 来插入值。模型将根据其编辑策略决定何时修改数据库。

如果值成功插入,则返回true ;否则返回false。可通过lastError()获取错误信息。

另请参阅 lastError()、insertRow() 和insertRows()。

[override virtual] 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。

这是一个重载函数。

[virtual protected] QString QSqlTableModel::orderByClause() const

根据当前设置的排序顺序返回一个 SQLORDER BY 子句。

另请参阅 setSort() 和selectStatement()。

QSqlIndex QSqlTableModel::primaryKey() const

返回当前表的主键;如果未设置该表或该表没有主键,则返回一个空的QSqlIndex 。

另请参阅 setTable()、setPrimaryKey() 和QSqlDatabase::primaryIndex()。

[protected] QSqlRecord QSqlTableModel::primaryValues(int row) const

返回一个记录,其中主键所包含的字段值设置为row 中的值。如果未定义主键,则返回的记录将包含所有字段。

另请参阅 primaryKey()。

[signal] 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()。

[override virtual] bool QSqlTableModel::removeColumns(int column, int count, const QModelIndex &parent = QModelIndex())

重写了:QSqlQueryModel::removeColumns (int column, int count, const QModelIndex &parent)。

从parent 模型中移除count 列,起始索引为column 。

若列已成功删除,则返回 true;否则返回false 。

另请参阅 removeRows()。

[override virtual] 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() 信号。

如果 row < 0 或 row + count >rowCount(),则不执行任何操作并返回 false。如果所有行都能被移除,则返回true ;否则返回false 。可使用lastError() 检索详细的数据库错误信息。

另请参阅 removeColumns() 和insertRows()。

[override virtual slot] void QSqlTableModel::revert()

重写了:QAbstractItemModel::revert()。

当用户取消编辑当前行时,项目委托会调用此重实现的插槽。

如果模型的策略设置为OnRowChange 或OnFieldChange ,则回滚更改。对于OnManualSubmit 策略,不执行任何操作。

对于OnManualSubmit 策略,请使用revertAll()来撤销所有待处理的更改;对于revertRow 策略,请使用 ()来撤销特定行。

另请参阅 submit()、submitAll()、revertRow() 以及revertAll()。

[slot] void QSqlTableModel::revertAll()

撤销所有待处理的更改。

另请参阅 revert()、revertRow() 以及submitAll()。

[virtual] void QSqlTableModel::revertRow(int row)

撤销指定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)

使用数据库表中按主键值匹配的行中的值,刷新模型中的 `row `。如果没有主键,则所有列的值都必须匹配。如果未找到匹配的行,模型将显示空行。

若操作成功,则返回true ;否则返回false 。

另请参阅 select()。

[virtual protected] QString QSqlTableModel::selectStatement() const

返回内部用于填充模型的 SQLSELECT 语句。该语句包含过滤条件和ORDER BY 子句。

另请参阅 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)。

将角色role 对应的项index 的数据设置为value 。

对于编辑策略OnFieldChange ,只有当没有其他索引具有缓存的更改时,某个索引才能接收更改。更改会立即提交。但是,尚未插入数据库的行可以自由更改,且不会自动提交。已提交的更改在发生故障时不会被回滚。

对于OnRowChange ,只有当没有其他行缓存了更改时,索引才会接收该更改。更改不会自动提交。

如果 `value ` 等于当前值,则返回 `true `。但该值不会提交到数据库。

如果值可以设置,则返回 `true `;若发生错误(例如 `index ` 超出范围),则返回 `false`。

如果角色不是Qt::EditRole ,则返回false 。要为 EditRole 以外的角色设置数据,请使用自定义代理模型或继承QSqlTableModel 类。

另请参阅 editStrategy()、data()、submit()、submitAll() 以及revertRow()。

[virtual] void QSqlTableModel::setEditStrategy(QSqlTableModel::EditStrategy strategy)

将数据库中值的编辑策略设置为strategy 。

这将撤销所有待处理的更改。

另请参阅 editStrategy() 和revertAll()。

[virtual] void QSqlTableModel::setFilter(const QString &filter)

将当前过滤器设置为filter 。

该筛选条件是一个不包含关键字WHERE 的SQLWHERE 子句(例如,name='Josephine') 。

如果模型中已填充了来自数据库的数据,则模型将使用新的过滤器重新选择数据。否则,该过滤器将在下次调用 `select()` 时生效。

另请参阅 filter()、select()、selectStatement() 和orderByClause()。

[protected] void QSqlTableModel::setPrimaryKey(const QSqlIndex &key)

一个受保护的方法,允许子类将主键设置为key 。

通常,每当调用setTable() 时,主索引都会自动设置。

另请参阅 primaryKey() 和QSqlDatabase::primaryIndex()。

bool QSqlTableModel::setRecord(int row, const QSqlRecord &values)

将values 应用于模型中的row 。源字段和目标字段是根据字段名称进行映射的,而不是根据记录中的位置。

请注意,values 中生成的标志会被保留,用于在向数据库提交更改时确定相应的字段是否被使用。默认情况下,QSqlRecord 中的所有字段均设置为true 。对于values 中的任何值,您必须使用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 ` 策略,则不执行任何操作。

对于策略为OnManualSubmit 的情况,请使用submitAll() 提交所有待处理的更改。

成功时返回true ;否则返回false 。请使用lastError() 查询详细的错误信息。

不会自动重新加载模型。成功提交后,已提交的行将从数据库中刷新。

另请参阅 revert()、revertRow()、submitAll()、revertAll() 和lastError()。

[slot] bool QSqlTableModel::submitAll()

提交所有待处理的更改,成功时返回true 。发生错误时返回false ,可通过lastError()获取详细的错误信息。

在OnManualSubmit 模式下,成功时模型将被重新加载。任何显示该模型的视图都将丢失其选中状态。

注意:在OnManualSubmit 模式下,当 submitAll() 失败时,已提交的更改不会从缓存中清除。这允许事务回滚并重新提交,而不会丢失数据。

另请参阅 revertAll() 和lastError()。

QString QSqlTableModel::tableName() const

返回当前所选表的名称。

[virtual protected] bool QSqlTableModel::updateRowInTable(int row, const QSqlRecord &values)

将指定的values 更新到当前活动数据库表中的给定字段row 。成功时返回true ;否则返回false 。

这是一个直接操作数据库的底层方法,不应直接调用。请使用setData()来更新值。模型将根据其编辑策略决定何时修改数据库。

请注意,只有设置了 generated-flag 的值才会被更新。可以通过QSqlRecord::setGenerated() 设置 generated-flag,并通过QSqlRecord::isGenerated() 进行检测。

另请参阅 QSqlRecord::isGenerated() 和setData()。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.