QSqlTableModel Class

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

Header: #include <QSqlTableModel>
CMake.QSqlTableModel 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 表的名称和编辑策略,然后设置视图标题中显示的标签。编辑策略决定了用户在视图中所做的更改何时实际应用到数据库。可能的值有OnFieldChangeOnRowChangeOnManualSubmit

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 不直接支持外键。如果要解析外键,请使用QSqlRelationalTableModelQSqlRelationalDelegate

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

该信号由deleteRowFromTable() 在row 从当前活动数据库表中删除之前发出。

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

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

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

updateRowInTable() 用record 中的值更新当前活动数据库表row 之前,会发出该信号。

请注意,只有标记为已生成的值才会被更新。生成标志可通过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) 常量。

返回模型中给定item 的数据库结果集中值的索引。

如果没有插入、移除或移动列或行,则返回值与item 相同。

如果item 越界或item 未指向结果集中的值,则返回无效的模型索引。

另请参阅 QSqlQueryModel::indexInQuery() 。

bool QSqlTableModel::insertRecord(int row, const QSqlRecord &record)

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

如果记录可以插入,则返回true ,否则返回 false。

OnFieldChangeOnRowChange 会立即提交更改。失败则不会在模型中留下新记录。

另请参见 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 必须无效,因为此模型不支持父子关系。

对于编辑策略OnFieldChangeOnRowChange ,一次只能插入一条记录,而且模型可能不包含其他缓存更改。

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 开始。

如果成功移除列,则返回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() 时进行。

对于OnFieldChangeOnRowChange ,一次只能删除一条记录,而且只有在其他记录没有缓存更改的情况下才能删除。删除会立即提交给数据库。在使用select() 刷新之前,模型会为成功删除的记录保留一条空白记录。

删除失败后,该操作不会在模型中恢复。应用程序可以重新提交或还原。

要删除的范围内已插入但尚未成功提交的行会立即从模型中删除。

在从数据库中删除记录之前,会发出beforeDelete() 信号。

如果 row < 0 或 row + count >rowCount() 则不执行任何操作,并返回 false。如果可以删除所有记录,则返回true ;否则返回false 。详细的数据库错误信息可通过lastError() 获取。

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

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

重新实现:QAbstractItemModel::revert().

当用户取消编辑当前行时,项目代表会调用此重新实现的槽。

如果模型的策略设置为OnRowChangeOnFieldChange ,则还原更改。对OnManualSubmit 策略不做任何操作。

使用revertAll() 可还原OnManualSubmit 策略的所有待定更改,使用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)。

将项目index 的角色role 的数据设置为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 ,才能将更改保存回数据库。

对于编辑策略OnFieldChangeOnRowChange ,只有当其他行没有缓存更改时,该行才会收到更改。更改会立即提交。提交的更改在失败后不会恢复。

如果可以设置所有值,则返回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().

当用户停止编辑当前行时,项目代表会调用此重新实现的槽。

如果模型的策略设置为OnRowChangeOnFieldChange ,则提交当前编辑的行。对OnManualSubmit 策略不做任何操作。

使用submitAll() 提交OnManualSubmit 策略的所有待处理更改。

成功时返回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() 更新值。模型将根据其编辑策略决定何时修改数据库。

请注意,只有设置了生成标志的值才会被更新。生成标志可以用QSqlRecord::setGenerated() 设置,并用QSqlRecord::isGenerated() 测试。

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

© 2025 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.