Qt扫盲-QSqlTableModel理论总结

一、概述

QSqlTableModel是用于从单个表读写数据库记录的高级接口。它构建在较低级的QSqlQuery之上,可用于向QTableView
等视图类提供数据。这个主要是对单表的操作,不仅可以读取数据,而且可以修改数据。

在项目里面,我们比如要操作某一个最基础的配置表的数据,因为其他表是依赖这个表里面数据的索引,我们就需要修改这个配置表里的具体的字段数据,就需要用这个 QSqlTableModel 对单表进行修改。当然我们也可以把 数据库的视图当成一个表,用作显示也是可以的。

二、使用

1. 与 view 视图绑定

QSqlTableModel *model = new QSqlTableModel(parentObject, database);
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 表的名称 和编辑策略,然后设置了显示在view头中的标签。和QSqlQueryModel,如果在没有定义头的显示内容,就会和数据库的字段显示一样的,编辑策略决定了用户在视图中所做的更改何时实际应用于数据库。可能的值有 OnFieldChange、OnRowChange 和 OnManualSubmit。

2. 做中间层,不显示

QSqlTableModel也可以通过编程方式访问数据库,而不需要将其绑定到视图,这样的好处是显而易见的,就是构造了一个中间层、避免直接与数据库对接,方便后期的维护之类的:
在这里插入图片描述

QSqlTableModel model;
model.setTable("employee");
model.select();
int salary = model.record(4).value("salary").toInt();

上面的代码片段从查询 SELECT * from employee 的结果集 里面的第4条记录提取工资字段。

可以使用setFilter()设置过滤器,也可以使用setSort()修改排序顺序。

最后,必须调用select()方法向模型中填充数据。

tablemodel示例说明如何使用QSqlTableModel作为QTableView的数据源。

QSqlTableModel 不直接支持外键。如果你想解析外键,可以使用QSqlRelationalTableModel和QSqlRelationalDelegate。

三、常用函数

因为在很多时候修改单表配置的时候需要对这个数据表经常删、改、增等操作。这个类也是提供了这些修改的接口。
当然修改的数据结构都是以 QSqlRecord 为基础结构进行的,所以我们需要去查 QSqlRecord 是如何表示一条sql查询结果的记录就可以啦。

  • deleteRowFromTable(int row)
  • insertRowIntoTable(const QSqlRecord &values)
  • updateRowInTable(int row, const QSqlRecord &values)

在修改好,如果需要手动提交、回滚到数据库中,就可以使用 下面的这些API即可

回滚:

  • revert() override
  • revertAll()

提交

  • submit() override
  • submitAll()

猜你喜欢

转载自blog.csdn.net/qq_43680827/article/details/133325398