10.11作业

实现简单数据库功能 (增删改查)

widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QSqlDatabase> //  数据库管理类
#include <QWidget>      //
#include <QSqlQuery>
#include <QSqlRecord>       //记录类
#include <QTableWidgetItem>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void setupConnections();
private slots:void on_addBtn_clicked();void on_showBtn_clicked();void on_deleteBtn_clicked();void on_sortBtn_clicked();void on_msgTable_itemChanged(QTableWidgetItem *item);private:Ui::Widget *ui;//实例化一个数据库对象QSqlDatabase db;//添加一个用来指示是否在更新数据。bool isUpdating = false;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//想要添加某个数据库if(!db.contains("stu.db")){//如果当前对象中没有包含所需的数据库,则添加一个数据库db = QSqlDatabase::addDatabase("QSQLITE"); //添加一个sqlite3的数据库db.setDatabaseName("stu.db");           //设置数据库的名称}//打开数据库if(!db.open()){QMessageBox::information(this,"提示","数据库打开失败");return ;}//实例化一个sql语句执行者QSqlQuery querry;QString sql = "create table if not exists STU(id int,name char,sex char,score double)";if(!querry.exec(sql)){QMessageBox::information(this,"提示","数据库创建表失败");return;}//修改操作会自动触发该连接setupConnections();
}Widget::~Widget()
{delete ui;
}//添加
void Widget::on_addBtn_clicked()
{//1.获取ui界面上的相关信息int ui_num = ui->numEdit->text().toUInt();      //获取学号QString ui_name = ui->nameEdit->text();         //姓名QString ui_sex = ui->sexEdit->text();           //性别double ui_score = ui->scoreEdit->text().toDouble();//分数//2.判断信息是否为空if(ui_num == 0 || ui_name.isEmpty() || ui_sex.isEmpty() || ui_score == 0){QMessageBox::information(this,"提示","请将信息填写完整");return;}//3.准备sql语句QString sql = QString("insert into STU(id,name,sex,score) values(%1,'%2','%3',%4);").arg(ui_num).arg(ui_name).arg(ui_sex).arg(ui_score);qDebug()<<sql;//4.实例化sql执行者QSqlQuery querry;//5.执行Sql语句if(!querry.exec(sql)){QMessageBox::information(this,"提示","添加信息失败");}else{QMessageBox::information(this,"提示","添加成功");ui->numEdit->clear();ui->nameEdit->clear();ui->sexEdit->clear();ui->scoreEdit->clear();}
}
//展示
void Widget::on_showBtn_clicked()
{isUpdating = true;  // 开始查询,避免触发itemChanged//1.实例化一个sql语句执行者QSqlQuery querry;//2.准备sql语句QString sql = "select * from STU;";//3.执行Sql语句if(!querry.exec(sql)){QMessageBox::information(this,"提示","查询失败");return ;}//程序执行至此,表示已经完成数据库的查询,并将结果存放到querry对象中//清空之前的表格内容ui->msgTable->clear();//设置表头ui->msgTable->setHorizontalHeaderLabels(QStringList() << "学号" << "姓名" << "性别" << "分数");//可以通过next函数进行遍历每个结果集qDebug()<<"查询数据库信息:";int i = 0;while(querry.next()){//获取当前记录QSqlRecord record = querry.record();//对当前记录进行操作,遍历当前记录的所有字段for(int j=0;j<record.count();j++){qDebug() <<record.value(j).toString();//该循环中的value(j),表示的就是第i行j列的元素QTableWidgetItem *item = new QTableWidgetItem(record.value(j).toString());//QString m = record.value(j).toString();ui->msgTable->setItem(i,j,item);}i++;}isUpdating = false;  // 恢复状态
}
//删除后在msgTab上显示
void Widget::on_deleteBtn_clicked()
{//1.获取ui界面上的相关信息int ui_num = ui->numEdit->text().toUInt();      //获取学号QString ui_name = ui->nameEdit->text();         //姓名QString ui_sex = ui->sexEdit->text();           //性别double ui_score = ui->scoreEdit->text().toDouble();//分数if(ui_num == 0 && ui_name.isEmpty() && ui_sex.isEmpty() && ui_score == 0){QMessageBox::information(this,"提示","请填写信息来删除");return;}QSqlQuery querry;QString sql = QString("delete from STU where ""id = %1 or name = '%2' or sex = '%3' or score = %4;").arg(ui_num).arg(ui_name).arg(ui_sex).arg(ui_score);if(!querry.exec(sql)){QMessageBox::information(this,"提示","删除失败");return ;}Widget::on_showBtn_clicked();}
//排序 升序 后在msgTab上显示
void Widget::on_sortBtn_clicked()
{isUpdating = true;  // 开始查询,避免触发itemChanged// 1. 实例化一个SQL语句执行者QSqlQuery querry;// 2. 准备SQL语句,按ID升序排序QString sql = "select * from STU order by score ASC;";// 3. 执行SQL语句if(!querry.exec(sql)){QMessageBox::information(this,"提示","查询失败");return ;}// 4. 清空之前的表格内容ui->msgTable->clear();// 5. 设置表头ui->msgTable->setHorizontalHeaderLabels(QStringList() << "学号" << "姓名" << "性别" << "分数");// 6. 读取并显示查询结果int i = 0;while(querry.next()){QSqlRecord record = querry.record();for(int j=0; j<record.count(); j++){QTableWidgetItem *item = new QTableWidgetItem(record.value(j).toString());ui->msgTable->setItem(i, j, item);}i++;}isUpdating = false;  // 恢复状态
}void Widget::on_msgTable_itemChanged(QTableWidgetItem *item)
{if (isUpdating) return;  // 如果在查询中,直接返回// 获取被修改的行和列int row = item->row();int column = item->column();// 获取学号作为唯一标识int id = ui->msgTable->item(row, 0)->text().toInt();// 根据列的不同,更新对应的字段QString value = item->text();QString sql;if (column == 1) {// 修改姓名sql = QString("update STU set name = '%1' where id = %2;").arg(value).arg(id);} else if (column == 2) {// 修改性别sql = QString("update STU set sex = '%1' where id = %2;").arg(value).arg(id);} else if (column == 3) {// 修改分数double score = value.toDouble();sql = QString("update STU set score = %1 where id = %2;").arg(score).arg(id);}// 执行SQL语句QSqlQuery query;if (!query.exec(sql)) {QMessageBox::information(this, "提示", "修改失败");}
}void Widget::setupConnections()
{connect(ui->msgTable, &QTableWidget::itemChanged, this, &Widget::on_msgTable_itemChanged);
}

运行结果

在这里插入图片描述

思维导图

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

若依 从字典类型跳到字典数据跳到了404

描述&#xff1a; 在字典类型从表中字典类型跳转到详情的字典数据时跳到了404 解决过程&#xff1a; 由于我的id统一是用GUID&#xff0c;所以想到了路由表相关路由的正则校验&#xff0c;若依是int类型&#xff0c;我直接删掉了&#xff0c;改了之后还是跳404 后面想是路由表…

【微服务】网关 - Gateway(下)(day8)

网关过滤工厂 在上一篇文章中&#xff0c;主要是对网关进行了一个总体的介绍&#xff0c;然后对网关中的断言进行了一个描述。在这篇文章中&#xff0c;主要是对网关中的最后一大核心——过滤进行介绍。 当客户端发送过来的请求经过断言之后&#xff0c;如果还想在请求前后添…

智能制造与精益制造的模型搭建

现行制造模式分析I-痛点改善思路-管控省优四化推行

中间件有哪些分类?

中间件的分类 中间件是位于操作系统和应用程序之间的软件&#xff0c;它提供了一系列服务来简化分布式系统中的应用程序开发和集成。中间件可以根据其功能和用途被分为不同的类别。以下是中间件的一些主要分类&#xff1a; 1. 通信处理&#xff08;消息&#xff09;中间件&am…

利用编程思维做题之反转链表

牛客网题目 1. 理解问题 给到我们的是一个单链表的头节点 pHead&#xff0c;要求反转后&#xff0c;返回新链表的头节点。 首先在心里设想能够快速理解的例子&#xff0c;如给你123序列&#xff0c;要你反转此序列如何回答&#xff1f;将最后一个数字3作为头&#xff0c;然后修…

使用Qt Creator创建项目

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 使用Qt Creator创建项目 收录于专栏【Qt开发】 本专栏旨在分享学习Qt的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 温馨提示: 1. 新…

基于SpringBoot+Vue的非物质文化遗产保护与传播系统设计实现(地图组件)

&#x1f388;系统亮点&#xff1a;地图组件&#xff1b; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17 前端&#xff1a; 技术&#xff1a;框架Vue.js&#x…

C/C++进阶(一)--内存管理

更多精彩内容..... &#x1f389;❤️播主の主页✨&#x1f618; Stark、-CSDN博客 本文所在专栏&#xff1a; 学习专栏C语言_Stark、的博客-CSDN博客 其它专栏&#xff1a; 数据结构与算法_Stark、的博客-CSDN博客 ​​​​​​项目实战C系列_Stark、的博客-CSDN博客 座右铭&a…

RDD优化:缓存和checkpoint机制、数据共享(广播变量、累加器)、RDD的依赖关系、shuffle过程、并行度说明

文章目录 1. 缓存和checkpoint机制1.1 缓存使用1.2 checkpoint1.3 缓存和checkpoint的区别 2. 数据共享2.1 广播变量2.2 累加器 3. RDD依赖关系4.shuffle过程4.1 shuffle介绍4.2 spark计算要尽量避免shuffle 5. 并行度 1. 缓存和checkpoint机制 缓存和checkpoint也叫作rdd的持…

Springboot 整合 Java DL4J 实现企业门禁人脸识别系统

&#x1f9d1; 博主简介&#xff1a;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编程&#xff0c;…

vue后台管理系统从0到1(3)element plus 的三种导入方式

文章目录 vue后台管理系统从0到1&#xff08;3&#xff09;element plus 的三种导入方式element plus 引入方式完整引入按需导入手动导入 vue后台管理系统从0到1&#xff08;3&#xff09;element plus 的三种导入方式 element plus 引入方式 官方网址&#xff1a;https://el…

windows系统更新升级node指定版本【避坑篇!!!亲测有效】(附带各版本node下载链接)一定看到最后!不用删旧版!

Node.js 是一个开源、跨平台的 JavaScript 运行时环境&#xff0c;广泛应用于服务器端和网络应用的开发。随着 Node.js 版本的不断更新&#xff0c;我们可能需要升级到特定版本以满足项目需求或修复安全漏洞。又或者是学习开发另外一个新项目&#xff0c;新项目对Node版本要求更…

优达学城 Generative AI 课程2:Large Language Models (LLMs) Text Generation

建议先了解一下附录知识。 文章目录 1 官方课程内容自述Lesson 1: 大型语言模型&#xff08;LLMs&#xff09;简介Lesson 2: 自然语言处理&#xff08;NLP&#xff09;基础Lesson 3: Transformer 和注意力机制Lesson 4: 检索增强生成&#xff08;RAG&#xff09;Lesson 5: 为大…

查找企业联系电话的几种方法

在商业合作和销售拓展的过程中&#xff0c;找到企业的联系电话是至关重要的一步。无论是精准营销还是客户开发&#xff0c;拥有有效的联系方式可以大大提高成功率。那么&#xff0c;如何快速有效地查找企业联系电话呢&#xff1f;下面介绍几种常见的方法&#xff0c;以及如何借…

如何解决项目跟进中关键节点难以把控的问题?

在项目跟进的过程中&#xff0c;关键节点的把控常常是一个棘手的问题。如果不能有效地管理这些节点&#xff0c;项目可能会偏离轨道&#xff0c;导致延误、成本超支甚至失败。下面我们来分析一下都有哪些关键节点难以把控以及相应的应对策略。 1、需求变更节点 在项目进行中&a…

快速入门Tomcat服务(业务发布基础技能)

文章目录 1 Tomcat简介 2 安装tomcat 2.1 安装jdk 2.2 安装Tomcat 3 Tomcat目录结构 4 Tomcat重要配置文件 1 Tomcat简介 Tomcat是Sun公司官方推荐的Servlet和JSP容器&#xff0c;在中小型系统和并发访问用户不是很多的场合下&#xff0c;其作为轻量级应用服务…

无刷直流电机工作原理:【图文讲解】

电动机 (俗称马达) 是机械能与电能之间转换装置的通称。可以分为电动机和发电机.一般称电机时就是指电动机。这个在日常应用中&#xff0c;比较多见&#xff0c;比如机器人&#xff0c;手机&#xff0c;电动车等。 直流电机&#xff1a;分为有刷直流电机&#xff08;BDC&#…

HTTP的工作原理

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是一种用于在计算机网络上传输超文本数据的应用层协议。它是构成万维网的基础之一&#xff0c;被广泛用于万维网上的数据通信。&#xff08;超文本(Hypertext)是用超链接的方法&#xff0c;将各种不同空间的文字信息组…

【MySQL】CRUD增删改查操作

文章目录 CRUD简介一、Creat 新增1.单行数据全列插入2.单行数据全指定列插入3.多行数据指定列插入 二、Retrieve 检索1.全列查询 --练习阶段最简单的查询&#xff1a;&#xff08;在生产环境最好不要用&#xff01;&#xff01;&#xff09;2.指定列查询3.结果去重查询4.where条…

柒拾伍- AI内容农场生产文章自动发布至公众号 (一)

一、内容农场 X AI 看过很多的新闻说 AI 产生 内容 污染网络&#xff0c;我也想试一下到底能污染成怎样。 然后为了编写爆款的内容&#xff0c;我选用这个 内容农场 的种子是来源于 微博热搜&#xff0c;让生长出来的垃圾文章更加火爆 涉及内容不能放 二、编写代码 关于代…