Qt基础 | Qt SQL模块介绍 | 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 提供的数据库驱动如下:

image-20240722204753229

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 软件进行数据库字段设计的界面如下所示:

image-20240722211257838

  • employee 数据表是一个员工信息表

    employee 的字段定义如下:

    image-20240722211435705

    image-20240722211454798

    employee 数据表中数据如下:

    image-20240722211654511

  • departments 数据表是一个学员信息表,记录学院编号和学院名称。

    departments 的字段定义如下:

    image-20240722211556223

    departments 数据表中数据如下:

    image-20240722211738373

  • majors 数据表是专业信息表,记录各专业的信息

    majors 数据表的字段定义如下:

    image-20240722211837021

    departments 和 majors 构成 一个Master/Detail 关系数据表,majors 表里 departID 段记录了这个专业属于哪个学院, departments 表里的一条记录关联 majors 表中的多条记录。

    majors 数据表的数据如下:

    image-20240722212200438

  • studInfo 是一个记录学生信息的数据表。

    studInfo 数据表的字段定义如下:

    image-20240722212309203

    studlnfo 表中记录学生的所在学院采用了代码字段 departID,具体的学院名称需要通过查询departments 表中相同的 departID 的记录获得; majorID 记录了专业代码,具体的专业名称需要查找 majors 表中的记录获取。这两个字段都是代码字段,只存储代码,具体的意义需要查询关联数据表的相应记录获得,在实际的数据库设计中经常用到这种设计方式。

    Qt SQL 中使用 QSqlRelationalTableModel 可以很方便地实现这种代码型数据表的显示与编辑。

    studInfo 数据表的数据如下:

    image-20240722212637919

3.Qt SQL 模块的主要类

  Qt SQL 提供的主要类的简要功能描述如下:

image-20240722212943689

  • QSqlDatabase

      QSqlDatabase 类用于建立与数据库的连接, 一般是先加载需要的数据库驱动,然后设置数据库的登录参数,如主机地址、用户名、 登录密码等,如果是单机型数据库,如 SQLite,只需设置数据库文件即可。

  • 数据模型类:QSqlQueryModel、QSqlTableModel 与 QSqIRelationalTableModel

      数据库的操作一般需要将数据库的内容在界面上进行显示和编辑, Qt 采用 Model/View 结构进行数据库内容的界面显示。QTableView 是常用的数据库内容显示视图组件。用于数据库操作的数据模型类有 QSqlQueryModel、QSqlTableModel 与 QSqIRelationalTableModel,这几个类的继承关系:

    image-20240722213840666

    • QSqlQueryModel

        QSqlQueryModel 是 QSqlTableModel 的父类。QSqlQueryModel 封装了执行 SELECT 语句从数据库查询数据的功能。QSqlQueryModel 通过设置 SELECT 语句查询获取数据库的内容,但是 QSqlQueryModel 只能作为只读数据源使用,不可以编辑数据

      QSqlQueryModel 类的主要接口函数为:

      image-20240723215120419

      使用 QSqlQueryModel 作为数据模型从数据库里查询数据,只需使用 setQuery() 函数设置一个 SELECT 查询语句即可。QSqlQueryModel 可以作为 QTableView 等视图组件的数据源,也可以使用 QDataWidgetMapper 创建字段与界面组件的映射,只是查询出来的数据是不可编辑的。

    • QSqlTableModel

        QSqlTableModel 直接设置一个数据表的名称,可以获取数据表的全部记录 ,其结果是可编辑的,设置为界面上的 QTableView 组件的数据模型后就可以显示和编辑数据。

      其主要的函数功能如下:

      image-20240723161034834

    • 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 类的常用函数如下:

    image-20240724152749230

    • 使用 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 类封装了对记录的字段定义和数据的操作,其主要函数如下:

    image-20240723171602680

    QSqlRecord 用于字段操作的函数,一般有两种参数形式的同名函数,用字段序号或字段名表示一个字段 ,如 value() 函数返回一个字段的值,有如下两种参数形式的函数:

    • QVariant value(int index): 返回序号为 index 字段的值
    • QVariant value(QString &name):返回字段名称为 name 的字段的值
  • QSqlField

    QSqlField 封装了字段定义信息和数据。字段的定义一般在设计数据表时就固定了,不用在 QSqlRecord 里修改。QSqlRecord 的 fileld() 函数返回某个字段,返回的数据类型为QSqlField。QSqlField用于字段数据读写的函数如下:

    image-20240723172421273

  • 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()函数用于移动到首记录

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值