QSqlQueryModel是用于执行SQL语句和遍历结果集的高级接口。它构建在较低级的 QSqlQuery之上,可用于向QTableView 等视图类提供数据,也是使用了Qt 的 mode/view 框架。这种方式是非常快的,对于数据的显示是非常方便的一个类,而且这个类主要是用于对 sql 的查询,也就是只读的一个操作,只读取数据,而不会修改数据的一个 model 类。
当然,在使用这些之前也是要连接数据库的,和正常使用 QSqlQuery 没有什么区别的。
例如:
QSqlQueryModel *model = new QSqlQueryModel;
model->setQuery("SELECT name, salary FROM employee");
model->setHeaderData(0, Qt::Horizontal, tr("Name"));
model->setHeaderData(1, Qt::Horizontal, tr("Salary"));
QTableView *view = new QTableView;
view->setModel(model);
view->show();
我们设置了模型的查询,然后设置了显示在视图标题中的标签。当然这个标签也是自己定义的,如果没有定义的话就会使用数据库中的表字段。
QSqlQueryModel也可以通过编程方式访问数据库,而不需要将其绑定到视图:
在这个情况下,相当于我们通过model 去访问到了数据,避免直接与数据库去交互数据,在model 层的交互就非常的简单。
QSqlQueryModel model;
model.setQuery("SELECT name, salary FROM employee");
int salary = model.record(4).value("salary").toInt();
上面的代码片段从SELECT查询的结果集中的第4条记录中提取了salary字段。【要注意索引边界问题】
由于salary是第2列(或者列索引为1),我们可以将最后一行重写为:
int salary = model.data(model.index(4, 1)).toInt();
通过这样的方式我们也非常方便的去读取了数据库的数据。
模型默认是只读的。要使它可读可写,必须继承它并重新实现setData()和flags()。另一种选择是使用QSqlTableModel,它提供了基于单个数据库表的读写模型。