文章目录
- 一、Qt SQL模块概述
- 1.Qt sql 支持的数据库
- 2.SQLite 数据库
- 3.Qt SQL 模块的主要类
一、Qt SQL模块概述
Qt SQL 模块提供数据库编程的支持,Qt 支持多种常见的数据库,如MySQL、Oracle、MS SQL Server、SQLite 等。Qt SQL 模块包括多个类,可以实现数据库连接、SQL 语句执行、数据获取与界面显示等功能,数据与界面之间使用 Mode /View 架构,从而可以方便实现数据的界面显示操作。
要在项目中使用 Qt SQL 模块,需要进行如下设置:
QT += sql
#include <QtSql>
这样会将 Qt SQL 模块中的所有类都包含进去 ,如果只使用其中的某些类 ,为避免冗余可以单独包含某个类。
1.Qt sql 支持的数据库
Qt SQL 提供了一些常见数据库的驱动,包括网络型数据库,如 Oracle、MS SQL Server等,也包括简单的单机型数据库,如 SQLite。 Qt SQL 提供的数据库驱动如下:
2.SQLite 数据库
SQLite 是一种无需服务器、无需进行任何配置的数据库,所有的数据表、索引等数据库元素全都存储在一个文件里,在应用程序里使用 SQLite 数据库就完全可以当作一个文件来使用。SQLite是可以跨平台使用的数据库,在不同平台之间可以随意复制数据库。 SQLite 的驱动库文件很小,包含完整功能的驱动可以小到只有 500 KB。
SQLite 是一种开源免费使用的数据库,可以从其官网下载最新版本的数据库驱动安装文件。
SQLite Expert 是 SQLite 数据库可视化管理工具,可以从其官网下载最新的安装文件,SQLite Expert 安装文件带有 SQLite 数据库驱动,所以安装 SQLite Expert 后无需再下载安装 SQLite 数据库驱动。
在 SQLite Expert 软件里建立一个数据库demodb.db
,在此数据库里建立 4 个表。
SQLite Expert 软件进行数据库字段设计的界面如下所示:
-
employee 数据表是一个员工信息表
employee 的字段定义如下:
employee 数据表中数据如下:
-
departments 数据表是一个学员信息表,记录学院编号和学院名称。
departments 的字段定义如下:
departments 数据表中数据如下:
-
majors 数据表是专业信息表,记录各专业的信息
majors 数据表的字段定义如下:
departments 和 majors 构成 一个Master/Detail 关系数据表,majors 表里 departID 段记录了这个专业属于哪个学院, departments 表里的一条记录关联 majors 表中的多条记录。
majors 数据表的数据如下:
-
studInfo 是一个记录学生信息的数据表。
studInfo 数据表的字段定义如下:
studlnfo 表中记录学生的所在学院采用了代码字段 departID,具体的学院名称需要通过查询departments 表中相同的 departID 的记录获得; majorID 记录了专业代码,具体的专业名称需要查找 majors 表中的记录获取。这两个字段都是代码字段,只存储代码,具体的意义需要查询关联数据表的相应记录获得,在实际的数据库设计中经常用到这种设计方式。
Qt SQL 中使用 QSqlRelationalTableModel 可以很方便地实现这种代码型数据表的显示与编辑。
studInfo 数据表的数据如下:
3.Qt SQL 模块的主要类
Qt SQL 提供的主要类的简要功能描述如下:
-
QSqlDatabase类
QSqlDatabase 类用于建立与数据库的连接, 一般是先加载需要的数据库驱动,然后设置数据库的登录参数,如主机地址、用户名、 登录密码等,如果是单机型数据库,如 SQLite,只需设置数据库文件即可。
-
数据模型类:QSqlQueryModel、QSqlTableModel 与 QSqIRelationalTableModel
数据库的操作一般需要将数据库的内容在界面上进行显示和编辑, Qt 采用 Model/View 结构进行数据库内容的界面显示。QTableView 是常用的数据库内容显示视图组件。用于数据库操作的数据模型类有 QSqlQueryModel、QSqlTableModel 与 QSqIRelationalTableModel,这几个类的继承关系:
-
QSqlQueryModel:
QSqlQueryModel 是 QSqlTableModel 的父类。QSqlQueryModel 封装了执行 SELECT 语句从数据库查询数据的功能。QSqlQueryModel 通过设置 SELECT 语句查询获取数据库的内容,但是 QSqlQueryModel 只能作为只读数据源使用,不可以编辑数据。
QSqlQueryModel 类的主要接口函数为:
使用 QSqlQueryModel 作为数据模型从数据库里查询数据,只需使用 setQuery() 函数设置一个 SELECT 查询语句即可。QSqlQueryModel 可以作为 QTableView 等视图组件的数据源,也可以使用 QDataWidgetMapper 创建字段与界面组件的映射,只是查询出来的数据是不可编辑的。
-
QSqlTableModel:
QSqlTableModel 直接设置一个数据表的名称,可以获取数据表的全部记录 ,其结果是可编辑的,设置为界面上的 QTableView 组件的数据模型后就可以显示和编辑数据。
其主要的函数功能如下:
-
QSqIRelationalTableModel:
QSqIRelationalTableModel 是 QSqlTableModel 的子类。QSqIRelationalTableModel 可以处理关系数据表。所谓关系数据表,是指将主表里的某个字段存储为代码型字段,而代码字段的具体含义是在另一个数据表(代码表)里。QSqIRelationalTableModel 类专门用来编辑这种具有代码字段的数据表,可以很方便地将代码字段与关系数据表建立关系,在显示和编辑数据表时,直接使用关系表的代码意义字典的内容。
QSqIRelationalTableModel 类的主要函数与 QSqlTableModel 相同,有一个新函数 setRelation() 用于设置代码字段的关联数据表和关联字段 。
函数定义如下:
[virtual] void QSqlRelationalTableModel::setRelation(int column, const QSqlRelation &relation)
-
参数 column 是主表中代码字段的序号
-
参数 relation 是 QSqlRelation 类型的表示关联数据表的关系
例如:
tabModel->setRelation(3,QSqlRelation("departments","departID","department")); //学院
- 第一个参数(数字3)是 departID 字段在 studInfo 表中的字段序号
- 第二个参数用
QSqlRelation("departments","departID","department")
创建了一个 QSqlRelation 类对象,其中,参数"departments"指的是数据库中的代码表departments;参数"departID"是数据表中的代码字段名称;参数"department"是代码表中的代码意义字段名称。
在数据库设计中使用代码字段和代码表的好处:
- 一是可以减少数据表的存储量,一个大的数据表存储代码远比存储具体文字用的存储空间少;
- 二是代码表示的文字可能会被修改 ,例如学院的名称可能会修改 ,这时只需修改代码表里一条记录而已。
-
这些数据模型通常与 QTableView 组合成 Model/View 结构,实现通用的数据库表的管理功能。
-
-
QSqlQuery:
QSqlQuery 是能执行任意 SQL 语句的类,它可以执行任何 SQL 语句,如 SELECT、INSERT、UPDATE 、DELETE 等,通过 SQL 语句对数据库直接进行编辑修改。
QSqlQuery 类的常用函数如下:
-
使用 QSqlQuery 执行不带参数的 SQL 语句时可以用 exec(QString) 函数,如:
QSqlQuery query; query.exec("SELECT * FROM employee"); query.exec("UPDATE employee SET Salary=3000 where Gender='女'");
-
使用 带参数的 SQL 语句时,先用 prepare() 函数准备 SQL 语句,然后用 bindValue() 函数设置参数值,再用 exec() 执行 SQL 语句。
QSqlQuery query; query.prepare("SELECT * FROM employee where EmpNo=:ID"); query.bindValue(":ID", 2003); query.exec();
SQL 语句中的参数用 “冒号+参数名” 表示的形式,还可以直接用占位符来表示参数。
QSqlQuery query; query.prepare("UPDATE employee SET Name=?,Gender=?,Height=? where EmpNo=?"); query.bindValue(0, "高某某"); query.bindValue(1, "男"); query.bindValue(2, 1.78); query.bindValue(3, 2010); query.exec();
-
-
QSqlRecord类:
QSqlRecord 类记录了数据表的字段信息和一条记录的数据内容, QSqlTableModel 有两种参数的函数 record() 可以返回一条记录,分别是
QSqlRecord QSqlTableModel::record() const QSqlRecord QSqlTableModel::record(int row) const
- 不带参数的 record() 函数,返回的 QSqlRecord 对象只有记录的字段定义,但是没有数据。 这个函数一般用于获取一个数据表的字段定义。
- 带参数的 record() 函数,返回行号为 row 的记录,包括记录的字段定义和数据。
QSqlRecord 类封装了对记录的字段定义和数据的操作,其主要函数如下:
QSqlRecord 用于字段操作的函数,一般有两种参数形式的同名函数,用字段序号或字段名表示一个字段 ,如 value() 函数返回一个字段的值,有如下两种参数形式的函数:
QVariant value(int index)
: 返回序号为 index 字段的值QVariant value(QString &name)
:返回字段名称为 name 的字段的值
-
QSqlField类
QSqlField 封装了字段定义信息和数据。字段的定义一般在设计数据表时就固定了,不用在 QSqlRecord 里修改。QSqlRecord 的 fileld() 函数返回某个字段,返回的数据类型为QSqlField。QSqlField用于字段数据读写的函数如下:
-
QDataWidgetMapper类
QDataWidgetMapper 用于建立界面组件与数据模型之间的映射,可以将界面的 QLineEdit、QCombobox 等组件与数据模型的一个字段关联起来。当数据模型关联的字段内容发生变化时,自动更新组件的显示内容。
其常用函数如下:
-
setModel() 函数–设置关联的数据模型
void QDataWidgetMapper::setModel(QAbstractItemModel *model)
用于设置
QDataWidgetMapper
将要使用的数据模型。参数model
是一个指向QAbstractItemModel
类型的指针 -
setSubmitPolicy() 函数–设置数据提交策略
void setSubmitPolicy(QDataWidgetMapper::SubmitPolicy policy)
其参数
policy
是一个枚举类型QDataWidgetMapper::SubmitPolicy
。取值如下:QDataWidgetMapper::AutoSubmit
:自动,行切换时将自动提交修改。QDataWidgetMapper::ManualSubmit
:手动,需调用 submit() 方法,手工提交当前记录的修改。
-
addMapping() 函数 – 用于设置界面组件与数据模型的列的映射,这种映射关系使得控件的值可以与数据模型中的特定项关联起来
void QDataWidgetMapper::addMapping(QWidget *widget, int section)
参数
widget
是指向 UI 控件的指针,section
指定了数据模型中的列(如果方向是水平的)或行(如果方向是垂直的) -
setCurrentIndex() 函数 – 将当前行数据映射到界面组件, 使界面上的编辑框、下拉列表框等与字段关联的界面组件显示当前记录的内容
virtual void setCurrentIndex(int index)
例如:
dataMapper->setCurrentIndex(current.row()); //更新当前行数据映射
-
setCurrentModelIndex() 函数–当用户在视图中选择不同的行或列时,自动更新与之关联的表单或控件的数据。
[slot] void QDataWidgetMapper::setCurrentModelIndex(const QModelIndex &index)
-
revert() 和 submit() 函数用于手工取消或提交当前记录的修改。
-
toFirst()、toPrevious()、toNext() 和 toLast() 函数用于在记录间移动
如:toFirst()函数用于移动到首记录
-