文章目录
-
- 目的
- QSqlTableModel
- 采用Model-View-Delegate(模型视图代理)框架的整体结构
- QT数据库组件
-
- 用户界面层(UI Layer)
- SQL接口层(SQL API Layer)
- 驱动程序层(Driver Layer)
- 实现翻页功能
- 实现数据库查询功能
-
- QSqlDatabase
- QSqlQuery
- QSqlRecord
目的
1: 了解QSqlTableMode 与 数据库集合使用
2: 了解mvc结构带来便利性
3: 数量级数据以及如何实现预览
QSqlTableModel
qt 文档如是说:
The QSqlTableModel class provides an editable data model for a single database table.
QSqlTableModel is a high-level interface for reading and writing database records from a single table.
It is built on top of the lower-level QSqlQuery and can be used to provide data to view classes such as 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();
We set the SQL table's name and the edit strategy, then we set up the labels displayed in the view header.
The edit strategy dictates when the changes done by the user in the view are actually applied to the database. The possible values are OnFieldChange, OnRowChange, and OnManualSubmit.
QSqlTableModel can also be used to access a database programmatically, without binding it to a view:
QSqlTableModel model;
model.setTable("employee");
model.select();
int salary = model.record(4).value("salary").toInt();
The code snippet above extracts the salary field from record 4 in the result set of the query SELECT * from employee.
It is possible to set filters using setFilter(), or modify the sort order using setSort(). At the end, you must call select() to populate the model with data.
The tablemodel example illustrates how to use QSqlTableModel as the data source for a QTableView.
QSqlTableModel provides no direct support for foreign keys. Use the QSqlRelationalTableModel and QSqlRelationalDelegate if you want to resolve foreign keys.
采用Model-View-Delegate(模型视图代理)框架的整体结构
图中Model就是模型,View是视图,Delegate是代理。三者之间的关系看图已经很清楚了。其中,View用于用户界面交互,包括数据展示的总体框架等;Model用于向View提供数据支持,包括查询数据和保存数据(修改和插入);Delegate用于具体展示数据和具体提供数据编辑功能的用户交互界面。
可以通过QTableView显示对应表格数据。
QT数据库组件
QT数据库模块整体结构
QT数据库模块包含了用户界面层(UI Layer)、SQL接口层(SQL API Layer),和驱动程序层(Driver Layer)。
在QT应用程序中使用QT数据库模块,必须在项目文件中做如下配置。
对于CMake编译构建管理工具:
QT数据库模块CMake编译构建管理项目配置
对于qmake编译构建管理工具:
QT数据库模块qmake编译构建管理项目配置
用户界面层(UI Layer)
这里的UI可以理解成是数据库模块的普通应用开发者的API 接口;按照QT模型视图代理框架的概念体系,这个UI也可以理解成是这些类型可能会放在用户界面相关的程序代码中去用,比如在与视图有关的代码中去调用这些API。
比如QSqlQueryModel经常作为模型类型在模型视图代理框架中使用,当然也可以独立使用。
SQL接口层(SQL API Layer)
QT数据库模块使用QSqlDatabase类型提供通用的数据库的连接和SQL查询操作的API接口。
驱动程序层(Driver Layer)
QT数据库模块使用QSqlDriver类型定义了一些数据库的一些抽象的底层操作。特定数据库相关的具体实现有特定数据库对应的派生类提供。
QT 助手API DOC中描述了QT框架对特定数据库的支持情况如下图所示:
QT数据库模块驱动程序层
博客参考整理
基于此可以对于千万级数据显示处理效率上还是不错。
实现翻页功能
如果大量数据查询以及显示在ui上, 那必定会加载时间过长, 导致让人体验很不爽。
因此我们要考虑到分页 + 数据查询。
QSqlTableModel+QTableView的组合完成需求,同时要对应QSqlDatabase作为数据库来源对数据进行掌握。
QSqlTableModel 本身不支持分页显示逻辑数据。我们可以通过在selectStatment中进行适当修改去显示某特定页数据。
.h
#ifndef KDSQLTABLEMODEL_H
#define KDSQLTABLEMODEL_H
#include <QSqlTableModel>
#include <QObject>
#include <QtGlobal>
class KDSqlTableModelPrivate;
class KDSqlTableModel : public QSqlTableModel
{
Q_OBJECT
Q_DECLARE_PRIVATE(KDSqlTableModel)
public:
explicit KDSqlTableModel(QObject *parent = nullptr, QSqlDatabase db = QSqlDatabase(<