当前位置: 首页 > news >正文

Qt基于SQLite数据库的增删查改demo

一、效果展示

在Qt创建如图UI界面,主要包括“查询”、“添加”、“删除”、“更新”,四个功能模块。

查询:从数据库中查找所有数据的所有内容,并显示在左边的QListWidget控件上。

添加:在右边的QLineEdit标签上输入需要添加的内容,包含id,name,age三个字段,然后点击添加按钮,即可将数据添加至数据库。

删除:根据在id控件输入框中输入的id,删除数据库中指定那一行内容。

更新:根据输入的id号,对指定行数据的name字段内容进行修改。

如上四个功能来实现一个简单的增删查改demo。

二、基于数据库的操作

在qt中要使用数据库,需要在.pro文件中添加sql模块才能使用数据库的相关操作。

基本操作:

1.与数据库进行连接

QSqlDatabase db;
db = QSqlDatabase::addDatabase("QSQLITE");  // 指明数据库为SQLite
db.setDatabaseName("test.db");  // 连接的数据库名

2.打开数据库

db.open()

3.定义QSqlQuery

QSqlQuery query;  // 用于执行对数据库的相关操作
QString sqlstr = QString("select * from user;");  // 定义sql语句

4.执行sql语句

query.exec(sqlstr)

1.连接数据库

QSqlDatabase db;
// 指明连接的是SQLite3数据库; 连接返回
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("test.db");  // 连接的数据库文件,需要在打开数据库之前进行// 打开数据库
if(!db.open()){qDebug() << "Error failed to open" << db.lastError();
}
else{qDebug() << "open success";
}

db = QSqlDatabase::addDatabase("QSQLITE");指明使用的是SQLite数据库驱动。

db.setDatabaseName("test.db");与test.db数据库进行连接

db.open()打开数据库,返回值是bool类型,打开失败会返回false。在打开数据库之前,就需要指明连接的数据库。

db.lastError()该方法会打印数据库中最新的一条出错原因。

2.查询操作

void MainWindow::on_pushButton_find_clicked()
{ui->listWidget->clear();  // 清空之前的内容// 查询操作QSqlQuery query;QString sqlstr = QString("select * from user;");if(!query.exec(sqlstr)){qDebug() << "查询错误:" << query.lastError();return;}// 因为查询出的数据可能不止一条,所以需要循环打印while(query.next()){// 获取每一条记录的内容int id = query.value("id").toInt();QString name = query.value("name").toString();int age = query.value("age").toInt();// 将数据更新到控件界面上// 创建一条数据的条目itemFrom *userItem = new itemFrom;userItem->setUserInfo(id, name, age);  // 设置该条记录内容QListWidgetItem *item = new QListWidgetItem(ui->listWidget);item->setSizeHint(QSize(442, 29));ui->listWidget->addItem(item);ui->listWidget->setItemWidget(item, userItem);}
}
  • QSqlQuery query;创建一个QSqlQuery对象,用于执行对数据库进行的一些操作。
  • QString sqlstr = QString("select * from user;");定义一条查询语句,查询user表中所有的内容。
  • query.exec(sqlstr)执行自定义的sql语句,执行失败会返回false。
  • query.next()该函数会指向我们指向我们指向sql语句后,返回结果的第一条内容,每执行一次,就会指向下一条内容,如果没有内容了就会返回false。
  • query.value("id")该函数会匹配查询出来的结果中,一条记录中对应“id”字段的内容,以字符串的形式返回。

3.添加操作

void MainWindow::on_pushButton_add_clicked()
{// 获取控件上的内容QString name = ui->lineEdit_name->text();QString age = ui->lineEdit_age->text();// 执行插入操作QSqlQuery query;// %表示占位符QString sqlstr = QString("insert into user(name, age) ""values('%1', %2)").arg(name).arg(age.toInt());if(!query.exec(sqlstr)){qDebug() << "插入错误:" << query.lastError();return;}
}

首先获取输入框中对应的内容;然后创建QSqlQuery对象执行sql语句。在user表中,id字段设置为自增,所以不需要输入id的内容来进行添加。

QString("insert into user(name, age) ""values('%1', %2)").arg(name).arg(age.toInt());

在字符串中,%1表示的是占位符,数字1表示序号。使用arg()方法将内容填充到对应的占位符中,顺序方式填充。

query.exec(sqlstr)函数执行sql语句。

4.删除操作

void MainWindow::on_pushButton_del_clicked()
{// 获取控件上的内容QString id = ui->lineEdit_id->text();// 执行删除操作QSqlQuery query;// %表示占位符QString sqlstr = QString("delete from user ""where id = %1").arg(id.toInt());if(!query.exec(sqlstr)){qDebug() << "删除错误:" << query.lastError();return;}// 同时更新控件上的显示ui->listWidget->takeItem(id.toInt()-1);
}

实现方式类似,需要根据需求自定义一条sql语句,然后调用执行。

5.修改操作

void MainWindow::on_pushButton_update_clicked()
{// 获取控件上的内容QString name = ui->lineEdit_name->text();QString id = ui->lineEdit_id->text();// 执行更新操作QSqlQuery query;// %表示占位符QString sqlstr = QString("update user set name = '%1' ""where id = %2 ;").arg(name).arg(id.toInt());if(!query.exec(sqlstr)){qDebug() << "更新错误:" << query.lastError();return;}
}

先获取输入框中的内容,然后进行编写修改的sql语句,使用%1表示占位符,使用arg()进行填充,最后执行sql语句。

完整代码

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "itemfrom.h"#include <QDebug>
#include <QSqlError>  // 数据库操作错误信息
#include <QListWidgetItem>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 指明连接的是SQLite3数据库; 连接返回db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("test.db");  // 连接的数据库文件,需要在打开数据库之前进行// 打开数据库if(!db.open()){qDebug() << "Error failed to open" << db.lastError();}else{qDebug() << "open success";}
}MainWindow::~MainWindow()
{db.close();delete ui;
}// 添加
void MainWindow::on_pushButton_add_clicked()
{// 获取控件上的内容QString name = ui->lineEdit_name->text();QString age = ui->lineEdit_age->text();// 执行插入操作QSqlQuery query;// %表示占位符QString sqlstr = QString("insert into user(name, age) ""values('%1', %2)").arg(name).arg(age.toInt());if(!query.exec(sqlstr)){qDebug() << "插入错误:" << query.lastError();return;}
}
// 删除
void MainWindow::on_pushButton_del_clicked()
{// 获取控件上的内容QString id = ui->lineEdit_id->text();// 执行删除操作QSqlQuery query;// %表示占位符QString sqlstr = QString("delete from user ""where id = %1").arg(id.toInt());if(!query.exec(sqlstr)){qDebug() << "删除错误:" << query.lastError();return;}// 同时更新控件上的显示ui->listWidget->takeItem(id.toInt()-1);
}
// 更新
void MainWindow::on_pushButton_update_clicked()
{// 获取控件上的内容QString name = ui->lineEdit_name->text();QString id = ui->lineEdit_id->text();// 执行更新操作QSqlQuery query;// %表示占位符QString sqlstr = QString("update user set name = '%1' ""where id = %2 ;").arg(name).arg(id.toInt());if(!query.exec(sqlstr)){qDebug() << "更新错误:" << query.lastError();return;}
}
// 查询
void MainWindow::on_pushButton_find_clicked()
{ui->listWidget->clear();  // 清空之前的内容// 查询操作QSqlQuery query;QString sqlstr = QString("select * from user;");if(!query.exec(sqlstr)){qDebug() << "查询错误:" << query.lastError();return;}// 因为查询出的数据可能不止一条,所以需要循环打印while(query.next()){// 获取每一条记录的内容int id = query.value("id").toInt();QString name = query.value("name").toString();int age = query.value("age").toInt();// 更新到控件上// 创建一条数据的条目itemFrom *userItem = new itemFrom;userItem->setUserInfo(id, name, age);  // 设置该条记录内容QListWidgetItem *item = new QListWidgetItem(ui->listWidget);item->setSizeHint(QSize(442, 29));ui->listWidget->addItem(item);ui->listWidget->setItemWidget(item, userItem);}
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QSqlDatabase>  // 用于连接打开数据库
#include <QSqlQuery>  // 用于访问操作数据库QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_pushButton_add_clicked();void on_pushButton_del_clicked();void on_pushButton_update_clicked();void on_pushButton_find_clicked();private:Ui::MainWindow *ui;QSqlDatabase db;
};
#endif // MAINWINDOW_H

QListWidget中每一条记录的显示,可以自定义一种显示方式,新建一个类itemfrom

#ifndef ITEMFROM_H
#define ITEMFROM_H#include <QMainWindow>namespace Ui {
class itemFrom;
}class itemFrom : public QMainWindow
{Q_OBJECTpublic:explicit itemFrom(QWidget *parent = nullptr);~itemFrom();void setUserInfo(int id, QString name, int age);private:Ui::itemFrom *ui;
};#endif // ITEMFROM_H
#include "itemfrom.h"
#include "ui_itemfrom.h"itemFrom::itemFrom(QWidget *parent) :QMainWindow(parent),ui(new Ui::itemFrom)
{ui->setupUi(this);
}itemFrom::~itemFrom()
{delete ui;
}
// 将值设置在ui上
void itemFrom::setUserInfo(int id, QString name, int age)
{ui->label_id2->setText(QString::number(id));ui->label_age2->setText(QString::number(age));ui->label_name2->setText(name);
}

相关文章:

Qt基于SQLite数据库的增删查改demo

一、效果展示 在Qt创建如图UI界面&#xff0c;主要包括“查询”、“添加”、“删除”、“更新”&#xff0c;四个功能模块。 查询&#xff1a;从数据库中查找所有数据的所有内容&#xff0c;并显示在左边的QListWidget控件上。 添加&#xff1a;在右边的QLineEdit标签上输入需…...

新书推荐:2.2.4 第11练:消息循环

/*------------------------------------------------------------------------ 011 编程达人win32 API每日一练 第11个例子GetMessage.c&#xff1a;消息循环 MSG结构 GetMessage函数 TranslateMessage函数&#xff1a;将虚拟键消息转换为字符消息 DispatchMessage函数…...

MASA:匹配一切、分割一切、跟踪一切

文章目录 摘要1、引言2、相关工作2.1、学习实例级关联2.2、Segment and Track Anything 模型 3、方法3.1、预备知识&#xff1a;SAM3.2、通过分割任何事物来匹配任何事物3.2.1、MASA流程3.2.2、MASA适配器3.2.3、推理 4、实验4.1、实验设置4.2、与最先进技术的比较4.3、消融研究…...

Websocket前端传参:深度解析与实战应用

Websocket前端传参&#xff1a;深度解析与实战应用 在现代Web开发中&#xff0c;Websocket作为一种双向通信协议&#xff0c;已经广泛应用于实时数据传输场景。前端传参作为Websocket通信的重要组成部分&#xff0c;其正确性和高效性直接影响到应用的性能和用户体验。本文将深…...

造假高手——faker

在测试写好的代码时通常需要用到一些测试数据&#xff0c;大量的真实数据有时候很难获取&#xff0c;如果手动制造测试数据又过于繁重无聊&#xff0c;显得不够优雅&#xff0c;今天我们介绍的faker这个轮子可以完美的解决这个问题。faker是一个用于生成各种类型假数据的库&…...

前端工程化工具系列(十二)—— PostCSS(v8.4.38):CSS 转换工具

PostCSS 是转换 CSS 语法的工具。它提供 API 来对 CSS 文件进行分析和修改它的规则。 PostCSS 本身并不能直接使用&#xff0c;主要是使用基于 PostCSS 编写的插件。 1 安装 pnpm add -D postcss-import postcss-nested postcss-preset-env cssnano2 配置 在项目根目录下创…...

Scanpy(3)单细胞数据分析常规流程

单细胞数据分析常规流程 面对高效快速的要求上,使用R分析数据越来越困难,转战Python分析,我们通过scanpy官网去学习如何分析单细胞下游常规分析。 数据3k PBMC来自健康的志愿者,可从10x Genomics免费获得。在linux系统上,可以取消注释并运行以下操作来下载和解压缩数据。…...

【Stable Diffusion】(基础篇二)—— Stable Diffusion图形界面介绍和基本使用流程

本系列笔记主要参考B站nenly同学的视频教程&#xff0c;传送门&#xff1a;B站第一套系统的AI绘画课&#xff01;零基础学会Stable Diffusion&#xff0c;这绝对是你看过的最容易上手的AI绘画教程 | SD WebUI 保姆级攻略_哔哩哔哩_bilibili 在上一篇博客中&#xff0c;我们成功…...

OpenCv之简单的人脸识别项目(动态处理页面)

人脸识别 准备九、动态处理页面1.导入所需的包2.设置窗口2.1定义窗口外观和大小2.2设置窗口背景2.2.1设置背景图片2.2.2创建label控件 3.定义视频处理脚本4.定义相机抓取脚本5.定义关闭窗口的函数6.按钮设计6.1视频处理按钮6.2相机抓取按钮6.3返回按钮 7.定义关键函数8.动态处理…...

【Linux】进程间通信

目录 一、进程间通信概念 二、进程间通信的发展 三、进程间通信的分类 四、管道 4.1 什么是管道 4.2 匿名管道 4.2 基于匿名管道设计进程池 4.3 命名管道 4.4 用命名管道实现server&client通信 五、system V共享内存 5.1 system V共享内存的引入 5.2 共享内存的…...

UI与前端:揭秘两者的微妙差异

UI与前端&#xff1a;揭秘两者的微妙差异 在数字化时代的浪潮中&#xff0c;UI设计和前端开发已成为塑造用户体验的两大核心力量。然而&#xff0c;这两者之间究竟有何区别&#xff1f;本文将深入剖析UI设计与前端开发的四个方面、五个方面、六个方面和七个方面的差异&#xf…...

idea如何根据路径快速在项目中快速打卡该页面

在idea项目中使用快捷键shift根据路径快速找到该文件并打卡 双击shift(连续按两下shift) -粘贴文件路径-鼠标左键点击选中跳转的路径 自动进入该路径页面 例如&#xff1a;我的实例路径为src/views/user/govType.vue 输入src/views/user/govType或加vue后缀src/views/user/go…...

探索成功者的特质——俞敏洪的观点启示

在人生的舞台上&#xff0c;我们常常对成功者充满好奇与敬仰&#xff0c;试图探寻他们成功的奥秘。俞敏洪指出&#xff0c;成功者都具备七个特质&#xff0c;而这些特质与家庭背景和大学的好坏并无直接关系。让我们深入剖析这七个特质&#xff0c;或许能从中获得对我们自身成长…...

MCU的环形FIFO

fifo.h #ifndef __FIFO_H #define __FIFO_H#include "main.h"#define RINGBUFF_LEN (500) //定义最大接收字节数 500typedef struct {uint16_t Head; // 头指针 指向可读起始地址 每读一个&#xff0c;数字1uint16_t Tail; // 尾指针 指…...

使用proteus仿真51单片机的流水灯实现

proteus介绍&#xff1a; proteus是一个十分便捷的用于电路仿真的软件&#xff0c;可以用于实现电路的设计、仿真、调试等。并且可以在对应的代码编辑区域&#xff0c;使用代码实现电路功能的仿真。 汇编语言介绍&#xff1a; 百度百科介绍如下&#xff1a; 汇编语言是培养…...

【漏洞复现】Apache OFBiz 路径遍历导致RCE漏洞(CVE-2024-36104)

0x01 产品简介 Apache OFBiz是一个电子商务平台&#xff0c;用于构建大中型企业级、跨平台、跨数据库、跨应用服务器的多层、分布式电子商务类应用系统。是美国阿帕奇(Apache)基金会的一套企业资源计划(ERP)系统。该系统提供了一整套基于Java的Web应用程序组件和工具。 0x02 …...

数据库表中创建字段查询出来却为NULL?

起因&#xff1a; 今天新创建了一张表,其中一个字段命名为"word_num"带下划线&#xff0c;我在前端页面怎么也查询不出来word_num的值&#xff0c;后来在后端接口处打印了一下数据库查询出来的数据&#xff0c;发现这个字段一直为NULL&#xff0c;然后我就想到是不是…...

缓存方法返回值

1. 业务需求 前端用户查询数据时,数据查询缓慢耗费时间; 基于缓存中间件实现缓存方法返回值:实现流程用户第一次查询时在数据库查询,并将查询的返回值存储在缓存中间件中,在缓存有效期内前端用户再次查询时,从缓存中间件缓存获取 2. 基于Redis实现 参考1 2.1 简单实现 引入…...

【十大排序算法】快速排序

在乱序的世界中&#xff0c;快速排序如同一位智慧的园丁&#xff0c; 以轻盈的手法&#xff0c;将无序的花朵们重新安排&#xff0c; 在每一次比较中&#xff0c;沐浴着理性的阳光&#xff0c; 终使它们在有序的花园里&#xff0c;开出绚烂的芬芳。 文章目录 一、快速排序二、…...

linux系统ubuntu中在命令行中打开图形界面的文件夹

在命令行中打开当前路径&#xff0c;以文件管理器的形式打开&#xff1a; 命令 # 打开文件管理器 当前的路径 nautilus .nautilus 是一个与 GNOME 桌面环境集成的文件管理器的命令行启动程序。在 Linux 系统中&#xff0c;特别是使用 GNOME 作为桌面环境时&#xff0c;用户经…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

SpringAI实战:ChatModel智能对话全解

一、引言&#xff1a;Spring AI 与 Chat Model 的核心价值 &#x1f680; 在 Java 生态中集成大模型能力&#xff0c;Spring AI 提供了高效的解决方案 &#x1f916;。其中 Chat Model 作为核心交互组件&#xff0c;通过标准化接口简化了与大语言模型&#xff08;LLM&#xff0…...

comfyui 工作流中 图生视频 如何增加视频的长度到5秒

comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗&#xff1f; 在ComfyUI中实现图生视频并延长到5秒&#xff0c;需要结合多个扩展和技巧。以下是完整解决方案&#xff1a; 核心工作流配置&#xff08;24fps下5秒120帧&#xff09; #mermaid-svg-yP…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

02.运算符

目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&&#xff1a;逻辑与 ||&#xff1a;逻辑或 &#xff01;&#xff1a;逻辑非 短路求值 位运算符 按位与&&#xff1a; 按位或 | 按位取反~ …...

高抗扰度汽车光耦合器的特性

晶台光电推出的125℃光耦合器系列产品&#xff08;包括KL357NU、KL3H7U和KL817U&#xff09;&#xff0c;专为高温环境下的汽车应用设计&#xff0c;具备以下核心优势和技术特点&#xff1a; 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计&#xff0c;确保在…...