Qt基础 | Qt SQL模块介绍 | Qt SQL模块常用类及其常用函数介绍

news2024/12/23 13:41:28

文章目录

  • 一、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 提供的数据库驱动如下:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1945632.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

phpstorm配置xdebug3

查看php路径相关信息 php --ini安装xdebug https://www.jetbrains.com/help/phpstorm/2024.1/configuring-xdebug.html?php.debugging.xdebug.configure php.ini 配置 在最后添加&#xff0c;以下是我的配置 [xdebug] zend_extension/opt/homebrew/Cellar/php8.1/8.1.29/p…

安装NVIDIA驱动

一、不升级内核安装NVIDIA驱动 说明: 1、安装NVIDIA驱动,是用来提升AI、图片等算法 2、本人是在centos7.9操作系统安装英伟达T4板卡驱动 操作系统Centos 7.9驱动版本NVIDIA-Linux-x86_64-525.89.02.run操作账号root1.1 关闭nouveau 1、查看nouveau是否关闭 lsmod |grep nouv…

Android 常用调试工具/方法解析

一、内存相关 参考Android内存分析命令_dumpsys meminfo 算出rss-CSDN博客 1、基本概念 1&#xff09;PSS & RSS & USS & VSS a、PSS 概念&#xff1a;全称Proportional Set Size&#xff0c;根据进程实际使用的内存量按照共享比例分配给进程的一种内存度量方…

MySql性能调优05-[sql实战演练]

sql实战演练 行列转换行列式转换第一题【列转行】第二题【列转行】 having的使用找到表中&#xff0c;名字重复的项有数据表employee&#xff0c;包含如下字段id、name、department、age&#xff0c;编写SQL&#xff0c;找到不与其他人同龄的年纪最大的员工的年龄有数据表emplo…

Nacos-2.4.0最新版本docker镜像,本人亲自制作,部署十分方便,兼容postgresql最新版本17和16,奉献给大家了

基于Postgresql数据库存储的nacos最新版本2.4.0,采用docker镜像安装方式 因业务需要,为了让nacos支持postgresql,特意花了两天时间修改了源码,然后制作了docker镜像,如果你也在找支持postgresql的nacos最新版本,恭喜你,你来的正好~ nacos-2.4.0 postgresql的数据库脚本…

C++学习笔记-C++11中的智能指针

1.智能指针介绍 智能指针是C的特性用法&#xff0c;是一个类似指针功能的类对象&#xff0c;其目的是为了更好的管理动态分配的内存&#xff0c;避免出现内存泄漏、悬空指针等问题。C11的标准库里提供了三种智能指针模板类&#xff0c;分别是std::unique_ptr、std::shared_ptr…

vue 两个页面切换, 再回到当前页,还是离开前的数据

1、要保证页面的name 和 建路由的大小写一致 2、页面不用生命周期--activated 调接口刷新

计算机网络八股文(三)

目录 41.为什么每次建立TCP连接时&#xff0c;初始化的序列号都不一样&#xff1f; 42.初始序列号ISN如何随机产生&#xff1f; 43.既然IP层会分片&#xff0c;为什么TCP层需要根据MSS分片呢&#xff1f; 44.TCP第一次握手丢失&#xff0c;会发生什么&#xff1f; 45.TCP第…

一个python脚本解决新版剪映导出字幕收费问题

如果你是希望我能完全解决剪映收费问题&#xff0c;我无法帮你&#xff1b; 两个文件&#xff0c;可生成不带时间线的纯文案&#xff0c;MD 格式&#xff0c;也可以生成带时间线的 SRT 文件。 因为剪映国内版对 JSON 文件进行了加密&#xff0c;所以请选择国际版 Cutcap&#x…

《javaEE篇》--阻塞队列详解

阻塞队列 阻塞队列概述 阻塞队列也是一种队列&#xff0c;和普通队列一样遵循先进先出的原则&#xff0c;但是阻塞队列相较于普通队列多了两项功能阻塞添加和阻塞移除&#xff0c;使得阻塞队列成为一种线程安全的数据结构 阻塞添加&#xff1a;当队列满的时候继续入队就会阻…

电脑虚拟摄像头软件分享|用手机打破电脑摄像头的极限

随着手机摄像头的不断更新迭代&#xff0c;手机已经接近专业电脑摄像头的画质。这让我们可以花费更低的成本获取优质的电脑录像画面。今天小编给大家详细讲解电脑虚拟摄像头的在我们日常生活中的妙用&#xff0c;以及分享几款口碑不错的电脑虚拟摄像头软件。有需要的小伙伴可以…

从业务到数据,大模型应用成功的再思考!

自2022年底OpenAI发布ChatGPT以来&#xff0c;大模型在企业的应用方兴未艾。 大模型必须要结合落地应用&#xff0c;才算是长出手跟脚&#xff0c;真正应用于实际业务场景的解决方案中&#xff0c;配合“大脑”完成任务。从医疗诊断到自动驾驶&#xff0c;从个性化营销到智能客…

数据结构重置版(概念篇)

本篇文章是对数据结构的重置&#xff0c;且只涉及概念 顺序表与链表的区别 不同点 顺序表 链表 存储空间上 物理上一定连续 逻辑上连续&#xff0c;但物理上不一定连续…

【办公软件】Office 2019以上版本PPT 做平滑切换

Office2019以上版本可以在切页面时做平滑切换&#xff0c;做到一些简单的动画效果。如下在快捷菜单栏中的切换里选择平滑。 比如&#xff0c;在两页PPT中&#xff0c;使用同一个形状对象&#xff0c;修改了大小和颜色。 选择切换为平滑后&#xff0c;可以完成如下的动画显示。 …

milvus的collection操作

milvus的collection操作 创建collection import uuidfrom pymilvus import (connections,FieldSchema, CollectionSchema, DataType,Collection, )collection_name "hello_milvus" host "192.168.230.71" port 19530 username "" password…

JavaScript:数组排序(冒泡排序)

目录 一、数组排序 二、sort()方法 1、基本语法 2、默认排序 3、自定义排序 三、冒泡排序 1、基本概念 2、实现步骤 3、过程解析 4、代码示例 5、时间复杂度 一、数组排序 对一个给定数组进行处理&#xff0c;使其从无序变为有序&#xff0c;这个过程就是数组排序&…

Python文件打包exe文件

作者的一点话 你是否还在为py文件无法像其他可视化项目展示出来&#xff0c;制造图形界面的移动使用&#xff0c;那接下来我会与你一同使用它&#xff0c;并进行study&#xff0c;如有困惑&#xff0c;可随时联系。 然后&#xff0c;需要使用pysimplgui&#xff0c;如果…

Vue3+.NET6前后端分离式管理后台实战(三十一)

1&#xff0c;Vue3.NET6前后端分离式管理后台实战(三十一)

数据开发/数仓工程师上手指南(一)数仓概念总览

前言 笔者毕业最开始从事的就是大数据开发和数据仓库建设工作&#xff0c;途中曾担任过人工智能工程师和计算机视觉工程师&#xff0c;没想到最后兜兜转转还是回到了最原本的工作数据开发工程师。但很少有写关于本职工作的技术内容输出。 之前笔者撰文内容大部分都是关于算法…

Spring Boot集成screw实现数据库文档生成

1.什么是screw&#xff1f; 在企业级开发中、我们经常会有编写数据库表结构文档的时间付出&#xff0c;从业以来&#xff0c;待过几家企业&#xff0c;关于数据库表结构文档状态&#xff1a;要么没有、要么有、但都是手写、后期运维开发&#xff0c;需要手动进行维护到文档中&…