qt SQLite学习记录

1. 查看qt中数据库的驱动的类型的支持

QStringList drivers = QSqlDatabase::drivers();//获取qt中所支持的数据库驱动类型foreach(QString driver,drivers){qDebug()<<driver;}

在这里插入图片描述

2. Qt SQL 模块包含的主要类的功能介绍

Qt SQL 模块包含了一些主要的类,用于在 Qt 应用程序中实现数据库操作。以下是几个主要类的功能介绍:

  1. QSqlDatabase:用于表示数据库连接的类。通过 QSqlDatabase 类,可以建立和管理数据库连接,并执行数据库操作。

  2. QSqlQuery:用于执行 SQL 查询的类。通过 QSqlQuery 类,可以执行各种 SQL 查询语句,如 SELECT、INSERT、UPDATE、DELETE 等,并获取查询结果。

  3. QSqlTableModel:用于绑定数据库表格的类。通过 QSqlTableModel 类,可以将数据库表格和 Qt 的模型/视图框架相结合,实现数据的展示和编辑。

  4. QSqlRelationalTableModel:用于处理关系型数据库表格的类。通过 QSqlRelationalTableModel 类,可以处理包含外键关系的数据库表格,并在 UI 中显示相关联的数据。

  5. QSqlQueryModel:用于执行 SQL 查询并在视图中显示结果的类。通过 QSqlQueryModel 类,可以执行 SQL 查询并将结果集显示在 Qt 的视图组件中,如 QTableView、QListView 等。

  6. QSqlRelationalDelegate:用于管理数据库表格中外键列的类。通过 QSqlRelationalDelegate 类,可以为外键列提供自定义的展示和编辑行为。

  7. QSqlError:表示数据库错误信息的类。通过 QSqlError 类,可以获取数据库操作时可能发生的错误信息,便于进行错误处理和调试。

总的来说,Qt SQL 模块提供了一系列的类和方法,方便开发者在 Qt 应用程序中实现数据库操作和数据展示功能。

3. QSqlDatabase操作主要接口

方法描述
addDatabase(const QString &type)添加一个数据库连接,并指定数据库类型。
removeDatabase(const QString &name)移除指定名称的数据库连接。
database(const QString &connectionName = defaultConnection)返回指定名称的数据库连接。
contains(const QString &connectionName)检查是否存在指定名称的数据库连接。
setDatabaseName(const QString &name)设置连接的数据库名称。
setUserName(const QString &name)设置连接的用户名。
setPassword(const QString &password)设置连接的密码。
open()打开数据库连接。
isOpen()检查数据库连接是否打开。
close()关闭数据库连接。
tables(QSql::TableType type = Tables)返回数据库中的表格列表。
exec(const QString &query)执行 SQL 查询语句。
commit()提交数据库事务。
rollback()回滚数据库事务。
lastError()返回最后一个数据库操作的错误信息。
  • 范例示范
QSqlDatabase db;//对于一个工程而言,该类对象就相当于是一个数据库,所以再工程中只使用一个对象即可
//连接成功,返回一个数据库对象db=QSqlDatabase::addDatabase("QSQLITE");//告诉系统,连接的数据库是sqlite3数据库db.setDatabaseName("test.db");//数据库文件后缀为.db//如果想要进一步操作数据库,那么,就必须要进行数据库打开操作if(!db.open()){qDebug()<<"Error falied to open"<<db.lastError();}

4. QSqlQuery 操作主要接口

方法描述
bindValue(int pos, const QVariant &val)绑定参数到查询中的指定位置。
boundValue(int pos)返回查询中指定位置的绑定参数值。
exec()执行当前设置的查询。
exec(const QString &query)执行指定的 SQL 查询语句。
setForwardOnly(bool forward)设置查询是否只能向前滚动。
first()移动到查询结果的第一条记录。
last()移动到查询结果的最后一条记录。
next()移动到查询结果的下一条记录。
previous()移动到查询结果的上一条记录。
seek(int index, bool relative)移动到查询结果中的指定位置。
value(int index)返回当前记录中指定字段的值。
record()返回当前记录的字段值。
nextResult()移动到多结果查询的下一个结果。
finish()完成多结果查询。
isActive()检查查询是否处于活动状态。
isValid()检查查询是否有效。
isSelect()检查查询是否为 SELECT 查询。
isForwardOnly()检查查询是否只能向前滚动。
lastError()返回最后一个查询操作的错误信息。
  • 范例示范
//连接成功,返回一个数据库对象db=QSqlDatabase::addDatabase("QSQLITE");//告诉系统,连接的数据库是sqlite3数据库db.setDatabaseName("test.db");//数据库文件后缀为.db//如果想要进一步操作数据库,那么,就必须要进行数据库打开操作if(!db.open()){qDebug()<<"Error falied to open"<<db.lastError();}//访问数据库的主要操作包括:创建表  向数据库表中插入数据  删除数据  更新数据  查询数据//对于数据库中的表,通常只需要创建一次,其他的操作可以重复QSqlQuery query;//在创建对象时,系统会自动完成跟数据库的关联//定义一条创建表的sql语句   表名:staff  表中的字段: id name ageQString sqlCreate = QString("create table staff(id integer primary key autoincrement,""name varchar(20),""age int;");query.exec(sqlCreate);

5. 插入查询操作

  • 创建表
//连接成功,返回一个数据库对象db=QSqlDatabase::addDatabase("QSQLITE");//告诉系统,连接的数据库是sqlite3数据库db.setDatabaseName("test.db");//数据库文件后缀为.db//如果想要进一步操作数据库,那么,就必须要进行数据库打开操作if(!db.open()){qDebug()<<"Error falied to open"<<db.lastError();}//访问数据库的主要操作包括:创建表  向数据库表中插入数据  删除数据  更新数据  查询数据//对于数据库中的表,通常只需要创建一次,其他的操作可以重复//QSqlQuery query;//在创建对象时,系统会自动完成跟数据库的关联
#if 0//定义一条创建表的sql语句   表名:staff  表中的字段: id name ageQString sqlCreate = QString("create table staff(id integer primary key autoincrement,""name varchar(20),""age int);");if(!query.exec(sqlCreate)){qDebug()<<"create table error"<<db.lastError();}
#endifQSqlQuery query;//在创建对象时,系统会自动完成跟数据库的关联
  • 插入操作
    //插入操作QString sqlInsert = QString ("INSERT INTO staff(id ,name,age) VALUES(2,'张三',20);");if(!query.exec(sqlInsert)){qDebug()<<"insert data error"<<db.lastError();}
  • 查询操作
    QString sqlSelect =QString ("select *from staff;");if(!query.exec(sqlSelect)){qDebug()<<"select data error"<<db.lastError();}else{while(query.next()){qDebug()<< query.value("id").toInt();qDebug()<< query.value("name").toString();qDebug()<< query.value("age").toInt();}}

6. 删除更新操作

  • 删除操作
//删除操作QSqlQuery query;QString sqlDelete = QString("delete from staff where id = 2;");if(!query.exec(sqlDelete)){qDebug()<<"delete data error"<<db.lastError();}
  • 更新操作
//更新数据操作QSqlQuery query;QString sqlUpdate = QString("update staff set name = '李四' where id =1;");if(!query.exec(sqlUpdate)){qDebug()<<"update data error"<<db.lastError();}

7.数据库和图形界面交互项目

  • 项目效果展示
    在这里插入图片描述
  • 增删改查功能
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QListWidgetItem>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//1.根据数据库的类型来连接数据库db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("compary.db");//2.打开数据库if(!db.open()){qDebug()<<"open error"<<db.lastError();}//3.根据需求,创建数据库中所需要的表QSqlQuery query;/*员工表:staff字段名有 id name age adress salary*///autoincrement 自动增长//注释掉,这个创建表的操作只需要操作一次
#if 0QString sqlCreateTable = QString("create table staff(id integer primary key autoincrement,""name varchar(20),""age int,""address varchar(50),""salary int);");if(!query.exec(sqlCreateTable)){qDebug()<<"create table"<<db.lastError();}#endif#if 0QString sqlInsert = QString("insert into staff(name,age,address,salary) ""values('张三',20,'广州市天河区',12000);");if(!query.exec(sqlInsert)){qDebug()<<"Error insert into data"<<db.lastError();}#endif}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_add_clicked()
{//1.获取UI控件的内容//int id=ui->lineEdit_ID->text().toUInt();QString name=ui->lineEdit_name->text();QString address=ui->lineEdit_adress->text();int age=ui->lineEdit_age->text().toInt();int salary = ui->lineEdit_money->text().toInt();//2.执行sql语句将数据插入到数据中QSqlQuery query;QString sqlInsert=QString("insert into staff(name,age,address,salary)""values('%1',%2,'%3',%4);").arg(name).arg(age).arg(address).arg(salary);if(!query.exec(sqlInsert)){qDebug()<<"Error insert into data"<<db.lastError();}else{qDebug()<<"insert successful!!!";}}void MainWindow::on_pushButton_update_clicked()
{//更新数据库QSqlQuery query;int id=ui->lineEdit_ID->text().toInt();QString address=ui->lineEdit_adress->text();QString sqlUpdate=QString("update staff set address = '%1' where id=%2; " ).arg(address).arg(id);if(!query.exec(sqlUpdate)){qDebug()<<"Error update into data"<<db.lastError();}else{qDebug()<<"update staff successful!!!";}
}void MainWindow::on_pushButton_delete_clicked()
{//设置通过名字来删除QSqlQuery query;int id=ui->lineEdit_ID->text().toInt();QString sqlDelete=QString("delete from staff where id = %1;").arg(id);if(!query.exec(sqlDelete)){qDebug()<<"Error delete into data"<<db.lastError();}else{qDebug()<<"delete successful!!!";}//2.删除数据库的同时要删除UI控件上的内容,下标是从零开始的ui->listWidget->takeItem(id-1);}void MainWindow::on_pushButton_check_clicked()
{ui->listWidget->clear();//查询数据库的操作QSqlQuery query;//1.向数据库下达查询数据的命令QString sqlSelect=QString("select*from staff ;");if(!query.exec(sqlSelect)){qDebug()<<"Error select into data"<<db.lastError();}//2.遍历数据库的记录while(query.next()){int id = query.value("id").toInt();QString name = query.value("name").toString();int age = query.value("age").toInt();QString address = query.value("address").toString();QString salary = query.value("salary").toString();qDebug()<<"id = "<<id<<"name = "<<name<<"age = "<<age<<"address = "<<address<<"salary = "<<salary;//3. 没遍历一条记录,就更新到ui控件上//3.1创建一个列表条目itemFrom*staffitem=new itemFrom();staffitem->setId(id);staffitem->setName(name);staffitem->setAge(age);staffitem->setAddress(address);staffitem->setSalary(salary);QListWidgetItem*item=new QListWidgetItem();//将大小设置相同item->setSizeHint(QSize(574,51));ui->listWidget->addItem(item);//QWidget(staffitem)放置在QListWidget中的一个项(item)中,而不是直接替换掉项。ui->listWidget->setItemWidget(item,staffitem);}}
  • 自定义控件
    在这里插入图片描述
#include "itemfrom.h"
#include "ui_itemfrom.h"itemFrom::itemFrom(QWidget *parent) :QMainWindow(parent),ui(new Ui::itemFrom)
{ui->setupUi(this);
}itemFrom::~itemFrom()
{delete ui;
}void itemFrom::setId(int id)
{ui->lineEdit_ID->setText(QString::number(id));
}void itemFrom::setName(QString name)
{ui->lineEdit_name->setText(name);
}void itemFrom::setAge(int age)
{ui->lineEdit_age->setText(QString::number(age));
}void itemFrom::setAddress(QString address)
{ui->lineEdit_address->setText(address);
}void itemFrom::setSalary(QString salary)
{ui->lineEdit_money->setText(salary);
}

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

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

相关文章

传输层协议——TCP

TCP协议 TCP全称为“传输控制协议”&#xff0c;要对数据的传输进行一个详细的控制。 特点 面向连接的可靠性字节流 TCP的协议段格式 源/目的端口&#xff1a;表示数据从哪个进程来&#xff0c;到哪个进程4位首部长度&#xff1a;表示该TCP头部有多少字节&#xff08;注意它…

大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

SQL注入万字详解,基于sqli-labs(手注+sqlmap)

目录 一、什么是SQL 1.什么是SQL 2.SQL的作用 3.MySQL基础知识 4.SQL增、删、改语句 *5.SQL查询语句 二、什么是SQL注入 1.SQL注入原理&#xff1a; 2.SQL注入&#xff1a; 3.SQL注入危害&#xff1a; 4.SQL注入技术分类&#xff1a; 5.防御方法&#xff1a;使用参…

javaEE-01-tomcat

文章目录 javaWebTomcat启动 Tomcat 服务器测试服务器是否成功停止tomcat服务器修改服务器的端口号 Idea整合tomcat服务器 javaWeb 所有通过 Java 语言编写可以通过浏览器访问的程序的总称,是基于请求和响应来开发的。 请求: 客户端给服务器发送数据(Request)响应: 服务器给客…

萝卜快跑:自动驾驶的先锋与挑战

萝卜快跑&#xff1a;自动驾驶的先锋与挑战 近段时间&#xff0c;由萝卜快跑引发的自动驾驶事件如火如荼&#xff0c;成为科技领域的热门话题。萝卜快跑作为自动驾驶领域的重要参与者&#xff0c;其最新事件引发了广泛的关注和讨论。 萝卜快跑是百度推出的自动驾驶出行服务平台…

Pytorch使用教学2-Tensor的维度

在PyTorch使用的过程中&#xff0c;维度转换一定少不了。而PyTorch中有多种维度形变的方法&#xff0c;我们该在什么场景下使用什么方法呢&#xff1f; 本小节我们使用的张量如下&#xff1a; # 一维向量 t1 torch.tensor((1, 2)) # 二维向量 t2 torch.tensor([[1, 2, 3], …

common-intellisense:助力TinyVue 组件书写体验更丝滑

本文由体验技术团队Kagol原创~ 前两天&#xff0c;common-intellisense 开源项目的作者 Simon-He95 在 VueConf 2024 群里发了一个重磅消息&#xff1a; common-intellisense 支持 TinyVue 组件库啦&#xff01; common-intellisense 插件能够提供超级强大的智能提示功能&…

Java设计模式—单例模式(Singleton Pattern)

目录 一、定义 二、应用场景 三、具体实现 示例一 示例二 四、懒汉与饿汉 饿汉模式 懒汉模式 五、总结 六、说明 一、定义 二、应用场景 ‌单例模式的应用场景主要包括以下几个方面&#xff1a; ‌日志系统&#xff1a;在应用程序中&#xff0c;通常只需要一个日…

【JS逆向课件:第十三课:异步爬虫】

回顾 并行和并发 表示程序/计算机具有处理多个任务的能力 并行表示可以同时处理多个任务&#xff08;几个多核CPU&#xff09;并发无法同时处理多个任务&#xff0c;但是可以基于时间片轮转法在多任务间快速切换的执行任务。 同步和异步 在基于并行或者并发处理任务的时候&am…

链式法则和自动求导

向量链式法则 说明&#xff1a; 1.第一个式子&#xff0c; y是标量&#xff0c;u是标量&#xff0c;x是n维向量 2.第二个式子&#xff0c;y是标量&#xff0c;u是k维向量&#xff0c;x是n维向量&#xff0c;所以y对u求导是k维的行向量&#xff0c;u对x求导是k行n列的矩阵&…

学术研讨 | 区块链治理与应用创新研讨会顺利召开

学术研讨 近日&#xff0c;国家区块链技术创新中心组织&#xff0c;长安链开源社区支持的“区块链治理与应用创新研讨会”顺利召开&#xff0c;会议围绕区块链治理全球发展现状、研究基础、发展趋势以及区块链行业应用创新展开研讨。北京大学陈钟教授做了“区块链治理与应用创…

ESP32-S3-DevKitC-1开发记录帖——与MPU6050进行姿态检测

目录 MPU6050传感器——姿态检测 1.姿态检测 1.1 基本认识 1&#xff09;坐标系 2&#xff09;姿态角的关系 3&#xff09;陀螺仪检测的缺陷 4&#xff09;利用加速度计检测角度 5&#xff09;利用磁场检测角度 1.2 姿态融合与四元数 1.3传感器工作原理 1.4 MPU6050模…

【PyTorch】图像多分类项目

【PyTorch】图像二分类项目 【PyTorch】图像二分类项目-部署 【PyTorch】图像多分类项目 【PyTorch】图像多分类项目部署 多类图像分类的目标是为一组固定类别中的图像分配标签。 目录 加载和处理数据 搭建模型 定义损失函数 定义优化器 训练和迁移学习 用随机权重进行训…

one-api 源码调试配置

本文主要介绍通过 VSCode 调试 one-api 源码。 一、环境配置 1.1 VSCode 和 one-api 安装 首先,确保已经安装了 VSCode(下载链接)和 one-api 源码(下载链接)已下载并安装了依赖 1.2 安装 Go 插件 在 VSCode 中,安装 Go 插件。 1.3 安装 dlv 调试包 可以通过下载源码…

【黑马java基础】多线程

什么是线程&#xff1f; 线程(Thread)是一个程序内部的一条执行流程。 这个是一条执行流程&#xff0c;虽然有循环&#xff0c;但是最后只有一条流程往前推进&#xff0c;所以视为一条。 程序中如果只有一条执行流程&#xff0c;那这个程序就是单线程的程序。 程序是指令序列…

Ubuntu20.04安装Elasticsearch

简介 ELK&#xff08;Elasticsearch, Logstash, Kibana&#xff09;是一套开源的日志管理和分析工具&#xff0c;用于收集、存储、分析和可视化日志数据。以下是如何在Ubuntu服务器上安装和配置ELK堆栈以便发送和分析日志信息的步骤。 安装Elasticsearch 首先&#xff0c;安…

【系统架构设计师】十八、架构设计实践(信息系统架构设计理论与实践2)

目录 四、企业信息系统的总体框架 4.1 战略系统 4.2 业务系统 4.3 应用系统 4.4 企业信息基础设施 4.5 业务流程重组BPR 4.6 业务流程管理BPM 五、信息系统架构设计方法 5.1 行业标准的体系架构框架 5.2 架构开发方法 5.3 信息化总体架构方法 5.4 信息化建设生命周…

防火墙——网络环境支持

目录 网络环境支持 防火墙的组网 web连接上防火墙 web管理口 让防火墙接到网络环境中 ​编辑 管理员用户管理 缺省管理员 接口 配置一个普通接口 创建安全区域 路由模式 透明模式 混合模式 防火墙的安全策略 防火墙转发流程 与传统包过滤的区别 创建安全策略 …

DDoS攻击:威胁与防护策略

DDoS&#xff08;分布式拒绝服务&#xff09;攻击是网络安全领域的一大挑战&#xff0c;对企业造成严重的影响。本文将深入探讨DDoS攻击的原理和防护方法。 DDoS攻击的原理 DDoS攻击通过大量请求&#xff0c;使目标系统无法响应正常请求。攻击者利用多台计算机发送大量请求&am…

气膜羽毛球馆的维护和运营成本解析—轻空间

随着人们对健康生活方式的追求不断增加&#xff0c;羽毛球这项运动也愈发受到欢迎。然而&#xff0c;传统的羽毛球馆往往存在建设周期长、成本高、维护复杂等问题。气膜羽毛球馆作为一种新型的运动场馆解决方案&#xff0c;因其快速搭建、环保节能、舒适环境等优势而逐渐被广泛…