QSqlTableModel 类

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

头文件 #include <QSqlTableModel>
CMakefind_package(Qt6 REQUIRED COMPONENTS Sql)
target_link_libraries(mytarget PRIVATE Qt6::Sql)
qmakeQT += sql
继承自 QSqlQueryModel
继承

QSqlRelationalTableModel

公共类型

枚举EditStrategy { OnFieldChange, OnRowChange, OnManualSubmit }

公共函数

QSqlTableModel(QObject *parent = nullptr, const QSqlDatabase &db = QSqlDatabase())
虚拟~QSqlTableModel()
QSqlDatabasedatabase() const
QSqlTableModel::EditStrategyeditStrategy() const
intfieldIndex(const QString &fieldName) const
QStringfilter() const
boolinsertRecord(int row, const QSqlRecord &record)
boolisDirty(const QModelIndex &index) const
boolisDirty() const
QSqlIndexprimaryKey() const
QSqlRecordrecord() const
QSqlRecordrecord(int row) const
虚拟 voidrevertRow(int row)
虚拟 voidsetEditStrategy(QSqlTableModel::EditStrategy strategy)
虚拟 voidsetFilter(const QString &filter)
boolsetRecord(int row, const QSqlRecord &values)
虚拟 voidsetSort(int column, Qt::SortOrder order)
虚拟 voidsetTable(const QString &tableName)
QStringtableName() const

重写的公共函数

虚拟 voidclear() override
虚拟 boolclearItemData(const QModelIndex &index) override
虚拟 QVariantdata(const QModelIndex &index, int role = Qt::DisplayRole) const override
虚拟 Qt::ItemFlagsflags(const QModelIndex &index) const override
虚拟 QVariantheaderData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override
虚拟 boolinsertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override
虚拟 boolremoveColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override
虚拟 boolremoveRows(int row, int count, const QModelIndex &parent = QModelIndex()) override
virtual introwCount(const QModelIndex &parent = QModelIndex()) const override
虚拟 boolsetData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override
虚拟 voidsort(int column, Qt::SortOrder order) override

公共槽

虚拟 voidrevert() override
voidrevertAll()
虚拟 boolselect()
虚拟 boolselectRow(int row)
虚拟 boolsubmit() override
boolsubmitAll()

信号

voidbeforeDelete(int row)
voidbeforeInsert(QSqlRecord &record)
voidbeforeUpdate(int row, QSqlRecord &record)
voidprimeInsert(int row, QSqlRecord &record)

保护函数

虚拟 booldeleteRowFromTable(int row)
虚拟 boolinsertRowIntoTable(const QSqlRecord &values)
virtual QStringorderByClause() const
QSqlRecordprimaryValues(int row) const
virtual QStringselectStatement() const
voidsetPrimaryKey(const QSqlIndex &key)
虚拟 boolupdateRowInTable(int row, const QSqlRecord &values)

重实现保护函数

virtual QModelIndexindexInQuery(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 表的名称和编辑策略,然后设置视图标题中显示的标签。编辑策略决定用户在视图中所做的更改何时实际应用到数据库。可能的值有 OnFieldChangeOnRowChange,和 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 不直接支持外键。如果您想解决外键,请使用 QSqlRelationalTableModelQSqlRelationalDelegate

另请参阅QSqlRelationalTableModelQSqlQuery模型/视图编程表模型示例缓存的 SQL 表

成员类型文档

枚举 QSqlTableModel::EditStrategy

该枚举类型描述了在数据库中编辑值时应选择哪种策略。

常量描述
QSqlTableModel::OnFieldChange0对所有模型更改将立即应用于数据库。
QSqlTableModel::OnRowChange1当用户选择不同的行时,将对行的更改应用。
QSqlTableModel::OnManualSubmit2所有更改将缓存到模型中,直到调用 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

返回目前设置的过滤器。

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

[重写虚函数] 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

对于 OnFieldChangeOnRowChange 编辑策略,更改将立即提交。失败不会在模型中留下新行。

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

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

对于每个新行将发出 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()、setPrimaryKeyQSqlDatabase::primaryIndex

[受保护] QSqlRecord QSqlTableModel::primaryValues(int row) const

返回一个包含在主键集设置为 row 处的值表示的字段记录。如果没有定义主键,则返回的记录将包含所有字段。

另请参阅primaryKey

[信号] void QSqlTableModel::primeInsert(int row, QSqlRecord &record)

当在当前活动的数据库表的给定的 row 中启动插入时,此信号由 insertRows 发射。可以写参数 record(因为它是一个引用),例如用默认值填充一些字段并设置字段的生成标志。在处理此信号的同时,不要尝试通过如 setDatasetRecord 等方式编辑记录。

QSqlRecord QSqlTableModel::record() const

这是一个重载函数。

它返回一个空的记录,只包含字段名称。该函数可用于检索记录的字段名称。

另请参阅setRecordQSqlRecord::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()时。

对于OnFieldChangeOnRowChange,每次只能删除一行,并且只有当没有其他行有缓存的更改时。删除会立即提交到数据库。在用select()刷新之前,模型保留一个空白行作为成功删除的行。

删除失败后,模型中不会撤销操作。应用程序可以重新提交或撤销。

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

在从数据库中删除行之前,将发出beforeDelete()信号。

如果行索引小于 0 或行索引 + 行数大于 rowCount(),则不执行任何操作并返回 false。如果所有行都可以删除,则返回 true;否则返回 false。可以使用lastError()检索详细数据库错误信息。

另请参阅removeColumns()和insertRows

[重写虚拟槽] 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)

撤销指定行的所有更改。

另请参阅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()将撤销任何未提交的更改并删除任何插入的列。

另请参阅setTablesetFilterselectStatement

[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,以将更改保存回数据库。

对于编辑策略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).

根据columnorder排序数据。这会立即选择数据,使用setSort()设置排序顺序而不填充模型数据。

另请参阅setSort(),select()和orderByClause().

[override virtual slot] bool QSqlTableModel::submit()

重新实现了:QAbstractItemModel::submit().

此重写的槽在用户停止编辑当前行时由项目代理调用。

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

使用submitAll()提交OnManualSubmit策略的所有挂起更改。

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

不会自动重新填充模型。在成功时,提交的行将从数据库中刷新。

另请参阅 revertrevertRowsubmitAllrevertAll,以及 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)

以指定的 更新当前活动数据库表中的给定 。如果成功则返回 true;否则返回 false

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

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

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

© 2024 Qt公司有限公司。在此包含的文档贡献的著作权属于其各自的版权所有者。在此提供的文档是根据自由软件基金会发布的 GNU自由文档许可版本1.3 的条款许可的。Qt及其相应的标志是Qt公司有限公司在芬兰和其他全球国家的商标。所有其他商标均为其各自所有者的财产。