QSqlTableModel理论总结
- 一、概述
- 二、使用
- 1. 与 view 视图绑定
- 2. 做中间层,不显示
- 三、常用函数
一、概述
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()