Qt SQL模块概述
模板:Qt += sql
头文件:#include <QtSql>
Qt SQL支持的数据库
SQLite
:无需服务器,无需任何配置.所有数据表,索引,...
全部存储在一个文件
SQLite Expert
是SQLite
数据库可视化管理工具
如QSqlRelationalTableModel
Qt SQL模块的主要类
Qt SQL
模块包含的主要类的功能
类名 | 描述 |
---|---|
QSqlDatabase | 建立与数据库的连接 |
QSqlDriver | 访问具体的SQL数据库的底层抽象类 |
QSqlDriverCreator | 为某具体的数据库驱动提供SQL驱动的模板类 |
QSqlDriverCreatorBase | |
QSqlDriverPlugin | 用于定制QSqlDriver插件的抽象基类 |
QSqlError | |
QSqlField | 操作数据表或视图的字段的类 |
QSqlIndex | 操作数据库的索引的类 |
QSqlQuery | 执行各种SQL语句的类 |
QSqlRecord | 封装了数据记录操作的类 |
QSqlRelation | 存储SQL外键信息 |
QSqlRelationDelegate | |
QSqlRelationTableModel | |
QSqlResult | |
QSqlTableModel | 编辑一个单一数据表的数据模型类 |
QDataWidgetMapper | 界面组件与字段间映射 |
QSqlDatabase
用于建立与数据库的连接
一般先加载数据库驱动
设置数据库登录参数[主机地址,用户名,密码,...]
如单机数据库,只需设置数据库文件
数据库的操作一般需将数据库内容在界面上显示和编辑
Qt
采用Model/View
结构进行显示
QTableView
常用的数据库内容显示视图组件
用于数据库操作的数据模型类有QSqlQueryModel,QSqlTableModel,QSqlRelationalTableModel
有:QAbstractTableModel-->QSqlQueryModel-->QSqlTableModel-->QSqlRelationalTableModell
QSqlQueryModel
通过设置SELECT
查询获取数据库的内容
但QSqlQueryModel
的数据是只读的
QSqlTableModel
直接设置一个数据表的名称,可获取数据表的全部记录,结果是可编辑的
设置为界面上QTableView
组件的数据模型后就可显示和编辑数据
QSqlRelationalTableModel
编辑一个数据表
且可将代码字段通过关系与代码表关联
将代码字段的编辑转换为直观的内容选择编辑
QSqlTableModel的使用
实例功能
主窗口设计
QSqlDataBase
// 加载数据库驱动&建立与数据库间的连接
QSqlTableModel
// 指定某一数据表,作为数据表的数据模型
QItemSelectionModel
// 选择项模型
QDataWidgetMapper
// 实现界面组件与tabModel
字段间的映射
定义了两个槽函数
- 如on_currentChanged()
检查数据表内容是否有修改
- 如on_currentRowChanged()
对QTableView
:
void setSelectionBehavior(...)
void setSelectionMode(...)
void setAlternatingRowColors(...)
打开数据表
对QSqlDataBase
:
void addDatabase(...)
void setDatabaseName(...)
bool open()
void setHostName(...)
void setUserName(...)
void setPassword(...)
对QSqlTableModel
:
void setTable(...)
void setSort(...)
? fieldIndex(...)
void setEditStrategy(...)
void select()
void setHeaderData(...)
如:QItemSelectionModel,QModelIndex,QTableVIew
void setModel(...)
void setSelectionModel(...)
void setColumnHidden(...)
void setItemDelegateForColumn(...)
如QDataWidgetMapper
:
new QDataWidgetMapper()
void setModel(...)
void setSubmitPolicy(...)
void addMapping(...)
void toFirst()
QSqlTableModel
类的主要函数
函数 | 描述 |
---|---|
QSqlDatabase database() | 返回其数据库连接 |
void setTable(QString&) | 设置数据表名称 |
QString tableName() | |
void setFilter(QString&) | 设置记录过滤条件 |
void setSort(…) | 设置排序字段,排序规则 |
void sort(…) | 按列和排序规则立即排序 |
void setEditStrategy(…) | 设置编辑策略 |
bool setHeaderData(…) | 设置表头 |
bool isDirty() | 若有未更新到数据库的修改,返回true |
int fieldIndex(…) | 根据字段名称返回在模型中的字段序号 |
QSqlIndex primaryKey() | 返回数据表的主索引 |
int rowCount() | 返回记录条数 |
bool select() | 查询数据表的数据,使用排序和过滤规则 |
bool selectRow(…) | 刷新获取指定行记录 |
void clear() | 清理数据模型,释放所有获取的数据 |
QSqlRecord record() | 返回一条空记录 |
QSqlRecord record(…) | 返回指定行记录 |
bool setRecord(…) | 更新一条记录数据到数据模型.按字段匹配 |
bool insertRecord(…) | 在行号row前插入一条记录 |
bool insertRows(…) | 在指定行号前插入若干空行 |
bool removeRows(…) | 从指定行号开始,删除若干行,若编辑策略为OnManualSubmit,需调submitAll()才从数据表删除 |
void revertRow(…) | 取消指定行号记录修改 |
void revert() | 编辑策略为OnRowChange/OnFieldChange时,取消当前行修改 |
void revertAll() | 取消所有未提交修改 |
bool submit() | 提交当前行修改到数据库,对OnManualSubmit编辑策略无效 |
bool submitAll() | 提交所有未更新的修改到数据库.若成功,返回true.失败,返回false. |
openTable
主要功能
- 数据模型创建与属性设置
创建QSqlTableModel
类型私有变量
在创建时指定数据库连接
用setTable()
函数指定数据表
void QSqlTableModel::setSort(...),QSqlTableModel::setEditStrategy(...)
用于设置编辑策略
1.QSqlTableModel::OnFieldChange
字段值变化时立即更新到数据库
2.QSqlTableModel::OnRowChange
当前行变换时更新到数据库
3.QSqlTableModel::OnManualSubmit
所有修改暂时缓存
手动调submitAll()
保存所有修改
调revertAll()
取消所有未保存修改
对tabModel
设置这些属性后,调select
打开数据表
QSqlTableModel::lastError()
获取上一错误信息文本说明
- 表头设置
如QSqlTableModel::setHeaderData(...)
- 选择模型及其信号的作用
如QItemSelectionModel,QDataWidgetMapper
:void setCurrentIndex(...)
如QSqlRecord
支持bool isFull(...)
如QSqlTableModel
支持QSqlRecord record(...)
如QPixmap
:
void loadFromData(...)
void setPixmap(...)
- 表示记录的类QSqlRecord
QSqlRecord
类记录了数据表的字段信息和一条记录的数据内容
QSqlTableModel
有两种参数的函数record()
可返回一条记录
1.QSqlRecord QSqlTableModel::record()
返回空记录
2.QSqlRecord QSqlTableModel::record(...)
返回指定行的记录,包括记录的字段定义和数据
QSqlRecord
类的主要函数
原型 | 描述 |
---|---|
void clear() | 清除记录的所有字段定义和数据 |
void clearValuess() | 清除所有字段的数据,将字段数据内容设置为null |
bool contains(QString&) | 判断记录是否按指定名字字段 |
bool isEmpty() | 判断记录是否无字段 |
int count() | 返回记录字段个数 |
QString fieldName(…) | 返回指定序号字段的名称 |
int indexOf(QString&) | 返回字段名称为指定值的字段序号 |
QSqlField field(QString&) | 返回字段名称为指定值的字段对象 |
QVariant value(QString&) | 返回字段名称为指定值的字段的值 |
void setValue(QString&, QVariant&) | 设置字段名为指定值的字段值 |
bool isNull(const QString&) | 判断字段名称为指定值字段数据是否为null |
void setNull(const QString&) | 设置名称为指定值字段值为null |
- 表示字段的类QSqlField
QSqlRecord
的field()
函数返回某个字段,返回数据类型是QSqlField
QSqlField
封装了字段定义信息和数据
字段的定义一般在设计数据表时就固定了,不用在QSqlRecord
里修改
QSqlRecord
用于字段数据读写函数见下标
函数 | 描述 |
---|---|
void clear() | 清除字段数据,设置为NULL.如字段为只读,不清除. |
bool isNull() | 判断字段值是否为NULL |
bool setReadOnly(bool) | 设置一个字段为只读,只读字段不可用setValue()设置值,不可用clear()清除值 |
QVariant value() | 返回字段的值 |
void setValue(QVariant&) | 设置字段的值 |
- tableView
的设置
- 数据映射
QDataWidgetMapper
用于建立界面组件与数据模型间的映射
- 获取数据表的所有字段名称
对QSqlRecord
支持QString fieldName(...)
添加,插入与删除记录
对QSqlTableModel
:
void insertRow(...)
QModelIndex index(...)
void setData(...)
void removeRow(...)
对QItemSelection
:
void clearSelection()
void setCurrentIndex(...)
QModelIndex currentIndex()
对QTableView
支持QModelIndex currentIndex()
对QModelIndex
:
int row()
int col()
保存与取消修改
对QSqlTableModel
:
void submitAll()
void revertAll()
设置和清除照片
对QItemSelection
支持QModelIndex currentIndex()
对QModelIndex
:
int row()
int col()
对QSqlTableModel
:
QSqlRecord record(...)
void setRecord(...)
对QSqlRecord
:
void setValue(...)
void setNull()
对QPixmap
支持void Load(...)
数据记录的遍历
对QSqlTableModel
:
int rowCount()
QSqlRecord record(...)
void setRecord(...)
bool submitAll()
对QSqlRecord
:
QVariable value(...)
void setValue(...)
记录排序
对QSqlTableModel
:
void setSort(...)
void select()
记录过滤
对QSqlTableModel
支持void setFilter(...)// 设置记录过滤条件
QSqlQueryModel的使用
QSqlQueryModel功能概述
QSqlQueryModel
类的主要函数
函数 | 描述 |
---|---|
void clear() | 清除数据模型,释放所有获得数据 |
QSqlError lastError() | 返回上次错误,可获取错误类型和文本信息 |
QSqlQuery query() | 返回当前关联的QSqlQuery对象 |
void setQuery(QSqlQuery&) | 设置一个QSqlQuery对象,获取数据 |
void setQuery(QString&) | 设置一个SELECT语句创建查询,获取数据 |
QSqlRecord record() | 返回一个空记录,含字段信息 |
QSqlRecord record(int) | 返回指定行的记录 |
int rowCount() | 返回查询到的记录条数 |
int columuCount() | 返回查询的字段个数 |
void setHeaderData(int, Qt::Orientation, QVariant&) | 设置表头数据,一般用于设置字段的表头标题 |
使用QSqlQueryModel实现数据查询
1.实例功能
如:QSqlDatabase,QSqlQueryModel,QItemSelectionModel,QDataWidgetMapper,QModelIndex
2.打开数据库
如QSqlQueryModel
:
void setQuery(...)
? lastError()
void setHeaderData(...)
如QItemSelectionModel
支持new QItemSelectionModel(...)
如QTableView
:
void setModel(...)
void setSelectionMode(...)
如QDataWidgetMapper
:
void setCurrentModelIndex(...)
void setSubmitPolicy(...)
void setModel(...)
void addMapping(...)
void toFirst()
如QSqlQuery
:
void prepare(...)
void bindValue(...)
void exec()
void first()
QVariant value(...)
QVariant value(...)
如QByteArray,QPixmap
支持void loadFromData(...)
- 记录移动
如QDataWidgetMapper
QSqlQuery使用
QSqlQuery基本用法
QSqlQuery
能执行任意SQL
语句的类,
如SELECT,INSERT,UPDATE,DELETE
等
QSqlQuery
类的主要函数
函数 | 描述 |
---|---|
bool prepare(QString&) | |
void bindValue(QString&,QVariant&) | |
void exec() | |
void exec(QString&) | |
bool isActive() | |
bool isSelect() | |
QVariant value(QString&) | |
bool isNull(QString&) | |
int size() | |
int numRowsAffected() | |
bool first() | |
bool previous() | |
bool next() | |
bool last() | |
bool seek(…) | |
int at() |
QSqlQueryModel和QSqlQuery联合使用
1.数据表显示
QSqlQueryModel
可查询数据并作为数据模型,实现数据的显示
QSqlQuery
可执行UPDATE,INSERT,DELETE
等SQL
语句实现数据的编辑修改
如QSqlDatabase,QSqlQueryModel
:
void setQuery(...)
? lastError()
void setHeaderData(...)
对QItemSelectionModel
支持new QItemSelectionModel(...)
对QTableView
:
void setModel(...)
void setSelectionModel(...)
2.编辑记录对话框
如QSqlRecord
3.编辑记录
4.插入记录
5.删除记录
6.记录遍历
QSqlRelationalTableModel的使用
关系型数据表和实例功能
所谓关系数据表,指将主表里某个字段存储为代码型字段,而代码的具体意义在另外一个数据表里
关系型数据模型功能实现
- 主窗口类定义
如QSqlDataBase,QSqlRelationalTableModel,QItemSelectionModel
- 打开数据表
如QSqlRelationalTableModel
:
new QSqlRelationalTableModel(...)
void setTable(...)
void setEditStrategy(...)
void setSort(...)
void setHeaderData(...)
void setRelation(int column, const QSqlRelation&)//
void select()
如QItemSelectionModel,QTableView
:
void setModel(...)
void setSelectionMode(...)
void setItemDelegate(...)
如QItemSelectionModel
- 实际字段列表
如QSqlTableModel
支持QSqlRecord record()
- 其他功能的实现