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

Qt 数据库SQLite 使用【01】基本功能

1.开发背景

        Qt 开发过程中难免需要存储数据,可以选择保存到本地文件,但是查找比较麻烦,所以就有了数据库,主要是方便查找数据,增删改查等操作,而 SqLite 属于数据库中轻量级的存在,适合本地数据存储功能。

2.开发需求

        Qt 界面上管理数据多个表的数据增删改查。

3.开发环境

        Window10 + Qt5.12.2 + QtCreator4.8.2

4.实现步骤

4.1 添加 SQL

        xxx.pro 文件添加 sql 模块

QT       += sql

4.2 软件编码

          主要头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QTextEdit>
#include <QPushButton>
#include <QLineEdit>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QFormLayout>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEtypedef struct
{quint32 num;QString name;QString data;}ItemData_t;class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:private:Ui::MainWindow *ui;QSqlDatabase db;bool connectSQLite(QString name = "test.db");   // 连接数据库void disconnectSQLite(void);                    // 断开数据库bool addSQLiteForm(QString name);               // 增加表bool delSqLiteForm(QString name);               // 删除表void refreshFormShow(void);                     // 刷新表显示bool checkSQLiteItemExists(QString formName, quint32 num);bool addSQLiteItem(QString formName, const ItemData_t &item);           // 添加字段bool findSQLiteItem(QString formName, QString name, ItemData_t &item);  // 通过名字查找bool querySQLiteForm(QString formName);                                 // 查找整个数据表bool modifSQLiteItem(QString formName, QString name, QString dataNew);  // 修改数据库数据bool deleteSQLiteItem(QString formName, quint32 num);                   // 删除数据库字段
};#endif // MAINWINDOW_H

        主要源文件

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QDebug>
#include <QInputDialog>
#include <QMessageBox>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);/* 连接信号和槽 */connect(ui->pushButton_Open, &QPushButton::clicked, [this](){if (db.isOpen()){QMessageBox::information(this, "提示", "数据库已打开");return;}connectSQLite();});connect(ui->pushButton_AddForm, &QPushButton::clicked, [this](){QString formName = QInputDialog::getText(this, "输入", "请输入表名");addSQLiteForm(formName);});connect(ui->pushButton_DelForm, &QPushButton::clicked, [this](){QString formName = ui->comboBox_Form->currentText();if (formName == nullptr){QMessageBox::information(this, "提示", "数据表空");return;}delSqLiteForm(formName);});connect(ui->pushButton_Query, &QPushButton::clicked, [this](){if (!db.isOpen()){QMessageBox::information(this, "提示", "数据库未打开");return;}QString formName = ui->comboBox_Form->currentText();querySQLiteForm(formName);});connect(ui->pushButton_Insert, &QPushButton::clicked, [this](){if (!db.isOpen()){QMessageBox::information(this, "提示", "数据库未打开");return;}/* 添加数据 */QString formName = ui->comboBox_Form->currentText();ItemData_t item;item.num = ui->lineEdit_Number->text().toUInt();item.name = ui->lineEdit_Name->text();item.data = ui->lineEdit_Data->text();addSQLiteItem(formName, item);});connect(ui->pushButton_Find, &QPushButton::clicked, [this](){QString formName = ui->comboBox_Form->currentText();ItemData_t item;item.name = ui->lineEdit_Name->text();findSQLiteItem(formName, item.name, item);});connect(ui->pushButton_Modif, &QPushButton::clicked, [this](){QString formName = ui->comboBox_Form->currentText();QString name = ui->lineEdit_Name->text();QString dataNew = ui->lineEdit_Data->text();modifSQLiteItem(formName, name, dataNew);});connect(ui->pushButton_delete, &QPushButton::clicked, [this](){QString formName = ui->comboBox_Form->currentText();quint32 num = ui->lineEdit_Number->text().toUInt();deleteSQLiteItem(formName, num);});/* 打开即连接 */connectSQLite();
}MainWindow::~MainWindow()
{disconnectSQLite();delete ui;
}/* 连接数据库 */
bool MainWindow::connectSQLite(QString name)
{/* 创建 SQLITE 数据库连接 */db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName(name);/* 打开数据库 */if (!db.open()){QMessageBox::critical(this, "Database Error", db.lastError().text());return false;}/* 刷新表格显示 */refreshFormShow();/* 返回成功 */return true;
}/* 断开数据库连接 */
void MainWindow::disconnectSQLite(void)
{/* 关闭数据库连接 */if (db.isOpen()){db.close();}
}/* 添加数据表 */
bool MainWindow::addSQLiteForm(QString name)
{if (!db.isOpen()){return false;}QString createTableQuery = QString("CREATE TABLE IF NOT EXISTS %1 (id INTEGER PRIMARY KEY, num INTEGER, name TEXT, data TEXT)").arg(name);QSqlQuery query;if (!query.exec(createTableQuery)){return false;}/* 创建成功 刷新显示 */refreshFormShow();return true;
}/* 删除表 */
bool MainWindow::delSqLiteForm(QString name)
{if (!db.isOpen()){return false;}QSqlQuery query;QString deleteTableQuery = QString("DROP TABLE IF EXISTS %1").arg(name);if (!query.exec(deleteTableQuery)){return false;}refreshFormShow();return true;
}/* 刷新表显示 */
void MainWindow::refreshFormShow(void)
{/* 查询数据库所有表 */QSqlQuery query;if (!query.exec("SELECT name FROM sqlite_master WHERE type='table';")){return;}/* 显示存在的表 */ui->comboBox_Form->clear();while (query.next()){QString tableName = query.value(0).toString();ui->comboBox_Form->addItem(tableName);}
}/* 查找是否存在 */
bool MainWindow::checkSQLiteItemExists(QString formName, quint32 num)
{QString checkQuery = QString("SELECT COUNT(*) FROM %1 WHERE num = :num").arg(formName);QSqlQuery query;if (!query.prepare(checkQuery)){return false;}query.bindValue(":num", num);if (query.exec() && query.next()){int count = query.value(0).toInt();if (count > 0){return true;}}return false;
}/* 添加数据 */
bool MainWindow::addSQLiteItem(QString formName, const ItemData_t &item)
{if (checkSQLiteItemExists(formName, item.num)){return false;}/* 选择数据表 */QString insertDataQuery = QString("INSERT INTO %1 (num, name, data) VALUES (:num, :name, :data)").arg(formName);QSqlQuery query;if (!query.prepare(insertDataQuery)){return false;}query.bindValue(":num", item.num);query.bindValue(":name", item.name);query.bindValue(":data", item.data);if (!query.exec()){return false;}ui->lineEdit_Number->clear();ui->lineEdit_Name->clear();ui->lineEdit_Data->clear();return true;
}/* 获取数据 数据 */
bool MainWindow::findSQLiteItem(QString formName, QString name, ItemData_t &item)
{if (!db.isOpen()){return false;}QString findDataQuery = QString("SELECT * FROM %1 WHERE name = :name").arg(formName);QSqlQuery query;if (!query.prepare(findDataQuery)){return false;}query.bindValue(":name", name);if (!query.exec()){return false;}QString result;while (query.next()){result += QString("ID: %1, Num: %2, Name: %3, Data: %4\n").arg(query.value(0).toInt()).arg(query.value(1).toInt()).arg(query.value(2).toString()).arg(query.value(3).toString());}ui->textEdit_Query->setText(result);return true;
}/* 显示数据库数据 */
bool MainWindow::querySQLiteForm(QString formName)
{if (!db.isOpen()){return false;}/* 选择表 */QString queryDataQuery = QString("SELECT * FROM %1").arg(formName);QSqlQuery query;if (!query.exec(queryDataQuery)){return false;}QString result;while (query.next()){result += QString("ID: %1, Num: %2, Name: %3, Data: %4\n").arg(query.value(0).toInt()).arg(query.value(1).toInt()).arg(query.value(2).toString()).arg(query.value(3).toString());}ui->textEdit_Query->setText(result);return true;
}/* 修改数据 */
bool MainWindow::modifSQLiteItem(QString formName, QString name, QString dataNew)
{if (!db.isOpen()){return false;}QString updateDataQuery = QString("UPDATE %1 SET data = :newData WHERE name = :name").arg(formName);QSqlQuery query;if (!query.prepare(updateDataQuery)){return false;}query.bindValue(":newData", dataNew);query.bindValue(":name", name);if (!query.exec()){return false;}return true;
}/* 通过编号删除数据 */
bool MainWindow::deleteSQLiteItem(QString formName, quint32 num)
{if (!db.isOpen()){return false;}QString updateDataQuery = QString("DELETE FROM %1 WHERE num = :num").arg(formName);QSqlQuery query;if (!query.prepare(updateDataQuery)){return false;}// 执行查询query.bindValue(":num", num);if (!query.exec()){return false;}return true;
}

4.3 运行测试

        可以实现基本的增删改查,还可以,数据库的操作需要熟悉数据库语句

4.4 第三方工具 HeidiSQL

        主要是可以查看数据库的实际情况,使用方法如下,可以看到写入的字段

相关文章:

Qt 数据库SQLite 使用【01】基本功能

1.开发背景 Qt 开发过程中难免需要存储数据&#xff0c;可以选择保存到本地文件&#xff0c;但是查找比较麻烦&#xff0c;所以就有了数据库&#xff0c;主要是方便查找数据&#xff0c;增删改查等操作&#xff0c;而 SqLite 属于数据库中轻量级的存在&#xff0c;适合本地数据…...

stm32小白成长为高手的学习步骤和方法

我们假定大家已经对STM32的书籍或者文档有一定的理解。如不理解&#xff0c;请立即阅读STM32的文档&#xff0c;以获取最基本的知识点。STM32单片机自学教程 这篇博文也是一篇不错的入门教程&#xff0c;初学者可以看看&#xff0c;讲的真心不错。 英文好的同学&#xf…...

大模型产品Deepseek(五)、本地安装部署(Docker方式)

DeepSeek 本地部署指南 DeepSeek是一款高效的智能搜索与推荐引擎,除了通过云端API提供服务外,它还支持本地部署,让开发者可以完全控制数据和计算资源。通过本地部署,您可以将DeepSeek集成到内部系统中,在私有环境下运行模型,减少对外部API的依赖,同时提升数据隐私性与响…...

Kafka 的消费offset原来是使用ZK管理,现在新版本是怎么管理的?

目录 基于 ZooKeeper 管理消费 offset 原理 缺点 新版本基于内部主题管理消费 offset 原理 优点 示例代码(Java) 在 Kafka 早期版本中,消费者的消费偏移量(offset)是存储在 ZooKeeper 中的,但由于 ZooKeeper 并不适合高频读写操作,从 Kafka 0.9 版本开始,消费偏…...

基于改进型灰狼优化算法(GWO)的无人机路径规划

内容&#xff1a; 基于改进型灰狼优化算法的无人机轨迹规划 GWO是一种群体智能优化算法&#xff0c;模仿灰狼的社会等级和狩猎行为。原始的GWO有一些局限性&#xff0c;比如容易陷入局部最优&#xff0c;收敛速度慢等&#xff0c;所以改进型的GWO可能通过不同的策略来优化这些…...

JS中|=是什么意思?

在JavaScript中&#xff0c;| 是一个位运算符的复合赋值操作&#xff0c;具体表示按位或赋值运算。这个操作符会对两个操作数进行按位或&#xff08;|&#xff09;运算&#xff0c;然后将结果赋值回左操作数。 let a 5; // 二进制表示为 0101let b 3; // 二进制表示为 0011a …...

快速上手Vim的使用

Vim Linux编辑器-vim使用命令行模式下所有选项都可以带数字底行模式可视块模式&#xff08;ctrlV进入&#xff09; Linux编辑器-vim使用 Vim有多种模式的编辑器。能帮助我们很快的进行代码的编辑&#xff0c;甚至完成很多其他事情。 默认情况下我们打开vim在命令模式下&#x…...

RPA与深度学习结合

什么是RPA RPA即机器人流程自动化&#xff08;Robotic Process Automation&#xff09;&#xff0c;它是一种利用软件机器人模拟人类在计算机上的操作&#xff0c;按照预设的规则自动执行一系列重复性、规律性任务的技术。这些任务可以包括数据录入、文件处理、报表生成、系统…...

在阿里云ECS上一键部署DeepSeek-R1

DeepSeek-R1 是一款开源模型&#xff0c;也提供了 API(接口)调用方式。据 DeepSeek介绍&#xff0c;DeepSeek-R1 后训练阶段大规模使用了强化学习技术&#xff0c;在只有极少标注数据的情况下提升了模型推理能力&#xff0c;该模型性能对标 OpenAl o1 正式版。DeepSeek-R1 推出…...

长安汽车发布“北斗天枢2.0”计划,深蓝汽车普及全民智驾

2月9日&#xff0c;长安汽车智能化战略“北斗天枢2.0”计划暨深蓝汽车全场景智能驾驶解决方案发布会在重庆盛大召开。此次发布会标志着长安汽车正式迈入智能化战略的新纪元&#xff0c;携手众多“中国智驾合伙人”&#xff0c;共同开启全民智驾元年。 发布会上&#xff0c;长安…...

Aitken 逐次线性插值

Aitken 逐次线性插值 用 Lagrange 插值多项式 L n ( x ) L_n(x) Ln​(x)计算函数近似值时&#xff0c;如需增加插值节点&#xff0c;那么原来算出的数据均不能利用&#xff0c;必须重新计算。为克服这个缺点&#xff0c;可用逐次线性插值方法求得高次插值。 令 I i 1 , i 2…...

docker 安装 Prometheus、Node Exporter 和 Grafana

Docker Compose 配置文件 docker-compose.yml services:prometheus:image: prom/prometheus:latestcontainer_name: prometheusvolumes:- ./prometheus.yml:/etc/prometheus/prometheus.yml # 挂载配置文件 - prometheus_data:/prometheus # 持久化数据存储 command:- --…...

【LeetCode 热题100】74:搜索二维矩阵(二分、线性两种方式 详细解析)(Go 语言实现)

&#x1f680; 力扣热题 74&#xff1a;搜索二维矩阵&#xff08;详细解析&#xff09; &#x1f4cc; 题目描述 力扣 74. 搜索二维矩阵 给你一个满足下述两条属性的 m x n 整数矩阵 matrix &#xff1a; 每行中的整数从左到右按非递减顺序排列。每行的第一个整数大于前一行的…...

元数据、数据元、数据元素、数据项 和 主数据的概念

一、元数据 1.概念 元数据&#xff0c;又称中介数据、中继数据&#xff0c;为描述数据的数据。主要是描述数据属性的信息&#xff0c;用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。 2.实例 数据库中&#xff0c;表的名称、表字段名、其他相关的描述信息&a…...

阿里云cdn怎样设置图片压缩

阿里云 CDN 提供了图像加速服务&#xff0c;其中包括图像压缩功能。通过设置图片压缩&#xff0c;可以显著减小图片文件的体积&#xff0c;提升网站加载速度&#xff0c;同时减少带宽消耗。九河云来告诉你如何进行图片压缩吧。 如何设置阿里云 CDN 图片压缩&#xff1f; 1. 登…...

白话文实战Nacos(保姆级教程)

前言 上一篇博客 我们创建好了微服务项目,本篇博客来体验一下Nacos作为注册中心和配置中心的功能。 注册中心 如果我们启动了一个Nacos注册中心,那么微服务比如订单服务,启动后就可以连上注册中心把自己注册上去,这过程就是服务注册。每个微服务,比如商品服务都应该注册…...

7. 基于DeepSeek和智谱清言实现RAG问答

课件链接&#xff1a;https://cloud.189.cn/t/VNvmyimY7Vna&#xff08;访问码&#xff1a;e4cb&#xff09;天翼云盘是中国电信推出的云存储服务&#xff0c;为用户提供跨平台的文件存储、备份、同步及分享服务&#xff0c;是国内领先的免费网盘&#xff0c;安全、可靠、稳定、…...

【数据结构】双向链表(真正的零基础)

链表是一种物理存储单元上非连续、非顺序的存储结构。数据元素的逻辑顺序是通过指针的链接来实现的&#xff01;在上篇我们学习了单向链表&#xff0c;而单向链表虽然空间利用率高&#xff0c;插入和删除也只需改变指针就可以达到&#xff01;但是我们在每次查找、删除、访问..…...

【生产变更】- Oracle RAC添加配置ipv6地址

【生产变更】- Oracle RAC添加配置ipv6地址 一、概述二、环境检查及备份2.1 检查并备份系统层面IP配置2.2 检查并备份监听配置2.3 检查并备份网卡配置2.4 检查并备份/etc/hosts三、集群层面配置3.1 检查集群配置3.2 停止集群组件3.3 Bond0网卡设置3.4 /etc/hosts文件配置3.5 重…...

Ai无限免费生成高质量ppt教程(deepseek+kimi)

第一步&#xff1a;打开deepseek官网&#xff08;DeepSeek) 1.如果deepseek官网网络繁忙&#xff0c;解决方案如下&#xff1a; (1)使用easychat官网&#xff08;EasyChat&#xff09;使用deepseek模型&#xff0c;如图所示&#xff1a; &#xff08;2&#xff09;本地部署&…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 &#xff0c;不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源&#xff08;最常用&#xff09; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

2.3 物理层设备

在这个视频中&#xff0c;我们要学习工作在物理层的两种网络设备&#xff0c;分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间&#xff0c;需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质&#xff0c;假设A节点要给…...

Xcode 16 集成 cocoapods 报错

基于 Xcode 16 新建工程项目&#xff0c;集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...

vxe-table vue 表格复选框多选数据,实现快捷键 Shift 批量选择功能

vxe-table vue 表格复选框多选数据&#xff0c;实现快捷键 Shift 批量选择功能 查看官网&#xff1a;https://vxetable.cn 效果 代码 通过 checkbox-config.isShift 启用批量选中,启用后按住快捷键和鼠标批量选取 <template><div><vxe-grid v-bind"gri…...