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);
}

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

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

相关文章

pc之间的相互通信详解

如图&#xff0c;实现两台pc之间的相互通信 1.pc1和pc2之间如何进行通讯。 2.pc有mac和ip&#xff0c;首先pc1需要向sw1发送广播&#xff0c;sw1查询mac地址表&#xff0c;向router发送广播&#xff0c;router不接受广播&#xff0c;router的每个接口都有ip和mac&#xff0c;…

使用 Scapy 库编写 TCP SYN 洪水攻击脚本

一、介绍 TCP SYN 洪水攻击是一种拒绝服务攻击&#xff08;Denial-of-Service, DoS&#xff09;类型&#xff0c;攻击者通过向目标服务器发送大量的伪造TCP连接请求&#xff08;SYN包&#xff09;&#xff0c;消耗目标服务器的资源&#xff0c;导致其无法处理合法用户的请求。…

13. ESP32-HTTPClient(Arduino)

使用ESP32 Arduino框架的HTTPClient库进行HTTP请求 在ESP32开发里&#xff0c;网络通信是挺重要的一部分&#xff0c;你可能需要从服务器拿数据啊&#xff0c;或者把传感器数据发到云端什么的。不过别担心&#xff0c;ESP32 Arduino框架给我们提供了HTTPClient库&#xff0c;让…

力扣 有效的括号 栈

Problem: 20. 有效的括号 文章目录 思路复杂度&#x1f49d; Code 思路 &#x1f468;‍&#x1f3eb; 参考地址 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) &#x1f49d; Code class Solution {static Map<Character, Character> m…

【启明智显分享】基于工业级芯片Model3A的7寸彩色触摸屏应用于智慧电子桌牌方案

一场大型会议的布置&#xff0c;往往少不了制作安放参会人物的桌牌。制作、打印、裁剪&#xff0c;若有临时参与人员变更&#xff0c;会务方免不了手忙脚乱更新桌牌。由此&#xff0c;智能电子桌牌应运而生&#xff0c;工作人员通过系统操作更新桌牌信息&#xff0c;解决了传统…

电脑提示msvcp140.dll丢失的解决方法(附带详细msvcp140.dll文件分析)

msvcp140.dll是一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;属于Microsoft Visual C 2015 Redistributable的一部分。它全称为 "Microsoft C Runtime Library" 或 "Microsoft C Runtime Library"&#xff0c;表明该文件是微软C运行时库的一…

uniapp录音播放功能

ui效果如上。 播放就开始倒计时&#xff0c;并且改变播放icon&#xff0c;另外录音则停止上一次录音。 播放按钮&#xff08;三角形&#xff09;是播放功能&#xff0c;两竖是暂停播放功能。 const innerAudioContext wx.createInnerAudioContext();export default{data(){ret…

【设计模式深度剖析】【2】【行为型】【命令模式】| 以打开文件按钮、宏命令、图形移动与撤销为例加深理解

&#x1f448;️上一篇:模板方法模式 | 下一篇:职责链模式&#x1f449;️ 设计模式-专栏&#x1f448;️ 文章目录 命令模式定义英文原话直译如何理解呢&#xff1f; 四个角色1. Command&#xff08;命令接口&#xff09;2. ConcreteCommand&#xff08;具体命令类&…

Spring Boot 3.x集成FastDFS记录

最近在做一个课程&#xff0c;需要用讲一下SpringBoot 使用文件上传的功能&#xff0c;选择了FastDFS作为文件存储OSS。Spring Boot是最新的3.3.0版本&#xff0c;JDK版本是17&#xff0c;中间有一些坑&#xff0c;下面记录一下。 <parent><groupId>org.springfram…

基于VS2022编译GDAL

下载GDAL源码&#xff1b;下载GDAL编译需要依赖的必须代码&#xff0c;proj&#xff0c;tiff&#xff0c;geotiff三个源码&#xff0c;proj需要依赖sqlite&#xff1b;使用cmake编译proj&#xff0c;tiff&#xff0c;geotiff&#xff1b;proj有版本号要求&#xff1b;使用cmake…

Llama模型家族之拒绝抽样(Rejection Sampling)(九) 强化学习之Rejection Sampling

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

Python实现半双工的实时通信SSE(Server-Sent Events)

Python实现半双工的实时通信SSE&#xff08;Server-Sent Events&#xff09; 1 简介 实现实时通信一般有WebSocket、Socket.IO和SSE&#xff08;Server-Sent Events&#xff09;三种方法。WebSocket和Socket.IO是全双工的实时双向通信技术&#xff0c;适合用于聊天和会话等&a…

三端植物大战僵尸杂交版来了

Hi&#xff0c;好久不见&#xff0c;最近植物大战僵尸杂交版蛮火的 那今天苏音整理给大家三端的植物大战僵尸杂交版包括【苹果端、电脑端、安卓端】 想要下载的直接划到最下方即可下载。 植物大战僵尸&#xff0c;作为一款古老的单机游戏&#xff0c;近期随着B站一位UP主潜艇…

jasypt配置文件密码加密解码

1. 需求讲解 对配置文件的组件密码加密,比如数据库redis等密码加密 2. 开发 2.1 依赖引入 <!-- jasypt 加解密 --><dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><v…

基于单片机的船舱温度临界报警系统

摘 要 : 针对传统的船舱温度临界报警系统&#xff0c;由于温度监控不到位导致报警不及时的问题&#xff0c;提出一个基于单片机的船舱温度临界报警系统设计。该设计将单片机作为核心控制硬件&#xff0c;控制系统整体电路。同时设计数据采集模块&#xff0c;利用温度测量仪测试…

数据库分库分表mycat

为啥要分库分表 IO瓶颈&#xff1a;热点数据太多&#xff0c;数据库缓存不足&#xff0c;产生大量磁盘IO&#xff0c;效率较低。 请求数据太多&#xff0c;带宽不够&#xff0c;网络IO瓶颈。 CPU瓶颈&#xff1a;排序、分组、连接查询、聚合统计等SQL会耗费大量的CPU资源&#…

为什么PPT录制没有声音 电脑ppt录屏没有声音怎么办

一、为什么PPT录制没有声音 1.软件问题 我们下载软件的时候可能遇到软件损坏的问题&#xff0c;导致录制没有声音&#xff0c;但其他功能还是可以使用的。我建议使用PPT的隐藏功能&#xff0c;下载插件&#xff0c;在PPT界面的加载项选项卡中就能使用。我推荐一款可以解决录屏…

HTML静态网页成品作业(HTML+CSS)—— 保护环境环保介绍网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

10倍速开发开关电源:PSIM DLL集成指南与如何单步调试你的代码

文末有彩蛋哦。 去年提到要写一篇如何在利用PSIM Visual Studio进行仿真联调&#xff0c;加速实际嵌入式端C代码的开发&#xff0c;但因为懒一直没兑现。 本期简单总结下实现的方法。 特别声明&#xff1a;本文约一半以上内容有kimi/文心一言提问式生成&#xff0c;仅用于技…

【Redis】 Redis 集成到 Spring Boot上面

文章目录 &#x1f343;前言&#x1f384;Spring Boot连接redis客户端&#x1f6a9;项目的创建&#x1f6a9;配置端⼝转发&#x1f6a9;配置 redis 服务地址&#x1f6a9;更改 Redis 配置文件&#x1f6a9;使用 StringRedisTemplate 类操作 &#x1f38d;Spring Boot操作Redis客…