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

news2024/12/25 12:49:41

一、效果展示

在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_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    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_OBJECT

public:
    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.coloradmin.cn/o/1804266.html

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

相关文章

C++ | Leetcode C++题解之第139题单词拆分

题目&#xff1a; 题解&#xff1a; class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {auto wordDictSet unordered_set <string> ();for (auto word: wordDict) {wordDictSet.insert(word);}auto dp vector <bool> (s.…

HC-05蓝牙模块配置连接和使用

文章目录 1. 前期准备 2. 进入AT模式 3. 电脑串口配置 4. 配置过程 5. 主从机蓝牙连接 6. 蓝牙模块HC-05和电脑连接 1. 前期准备 首先需要准备一个USB转TTL连接器&#xff0c;电脑安装一个串口助手&#xff0c;然后按照下面的连接方式将其相连。 VCCVCCGNDGNDRXDTXDTXD…

jquery.datetimepicker控件不弹出的问题

项目场景&#xff1a; CRM项目&#xff0c;在项目中涉及日期类输入框&#xff0c;打算采用平常见到的点击选择日期的方式。在浏览了网页后&#xff0c;目前比较好的解决方案是jquery.datetimepicker和flatpicker两种&#xff0c;flatpicker的缺点是官网是英文版的&#xff0c;…

计算机系统基础笔记(12)——控制

前言 在持续输出ing 一、条件码 1.处理器状态&#xff08;x86-64&#xff0c;部分的&#xff09; 当前程序的执行信息 ◼ 临时数据 ◼ 运行时栈的位置&#xff08;栈顶&#xff09; ◼ 当前代码控制点的位置&#xff08;即将要执行的指令地址&#xff09; ◼ 最近一次指令执…

SpringCloudAlibaba基础二 Nacos注册中心

一 什么是 Nacos 官方&#xff1a;一个更易于构建云原生应用的动态服务发现(Nacos Discovery )、服务配置(Nacos Config)和服务管理平台。 集 注册中心配置中心服务管理 平台。 Nacos 的关键特性包括: 服务发现和服务健康监测动态配置服务动态 DNS 服务服务及其元数据管理 …

进军rust:从0开始学习rust语法

一.变量类型 Rust语言中的基础数据类型有以下几种&#xff1a; 1.整数型 整数型简称整型&#xff0c;按照比特位的长度和有无符号位可以分为以下几种 isize和usize两种整数类型是用来衡量数据大小的&#xff0c;它们的位长度取决于所运行的目标平台&#xff0c;如果是32位架…

openpose标定中棋盘格检测错误的解决方案

文章目录 1、openpose 棋盘格检测流程2、解决过程3、实测结果1、openpose 棋盘格检测流程 在opencv中通过调用cv::findChessboardCorners()函数,同时指定棋盘格内角点尺寸来检测画面中的棋盘格,结果将以一定顺序来保存结果。通常指定尺寸的两个纬度的值不能相同,例如当指定…

学习笔记——路由网络基础——等开销负载均衡

3、等开销负载均衡 等开销负载均衡&#xff1a;到达同一目标网段&#xff0c;存在多条路由条目&#xff0c;存在两条或两条以上的路由优先级值和开销值都是最优的(优先级值和开销值一致)&#xff0c;则这几条路径执行负载均衡(在ping中就是这条路由发个包再下一条路由再发个包…

计算机网络 —— 网络层(子网掩码和子网划分)

计算机网络 —— 网络层&#xff08;子网掩码和子网划分&#xff09; 网络地址转换NAT子网掩码和子网划分举个例子第一步&#xff1a;看类型第二步&#xff1a;从主机号开始比对第三步&#xff1a;去头去尾 我们今天来看子网掩码和子网划分&#xff1a; 网络地址转换NAT 网络…

[FSCTF 2023]Tea_apk

得到密文和密钥 import base64 from ctypes import c_uint32import libnumDELTA 0x9E3779B9def decrypt(v, n, k):rounds 6 int(52 / n)sum c_uint32(rounds * DELTA)y v[0].valuewhile rounds > 0:e (sum.value >> 2) & 3p n - 1while p > 0:z v[p …

使用缓存降低数据库并发读写方案探索

文章目录 前言缓存设计思想缓存划分缓存应用时机 客户端缓存浏览器缓存网关或代理服务器缓存CDNPCDN 服务端缓存本地缓存本地缓存实现Java堆缓存memcached/ecachecaffeineORM框架一级/二级缓存 分布式缓存分布式缓存优缺点分布式缓存实现分布式缓存实施过程可能遇到问题分布式缓…

【冲刺秋招,许愿offer】第 一 天

【冲刺秋招&#xff0c;许愿offer】第 一 天 知识点emo环节 知识点 Java Leetcode&#xff1a;可以用LinkedListMap模拟实现LRUCache&#xff0c;用hash表查找&#xff0c;双向链表记录顺序。集合&#xff1a;集合的遍历方式&#xff0c;可以使用迭代器(万能)、增强for只能用…

Mysql使用中的性能优化——批量插入的规模对比

在《Mysql使用中的性能优化——单次插入和批量插入的性能差异》中&#xff0c;我们观察到单次批量插入的数量和耗时呈指数型关系。 这个说明&#xff0c;不是单次批量插入的数量越多越好。本文我们将通过实验测试出本测试案例中最佳的单次批量插入数量。 结论 本案例中约每次…

【模拟-BM100 设计LRU缓存结构】

题目 BM100 设计LRU缓存结构 描述 设计LRU(最近最少使用)缓存结构&#xff0c;该结构在构造时确定大小&#xff0c;假设大小为 capacity &#xff0c;操作次数是 n &#xff0c;并有如下功能: Solution(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存get(key)&am…

[大模型]CharacterGLM-6B Transformers部署调用

环境准备 在autodl平台中租一个3090等24G显存的显卡机器&#xff0c;如下图所示镜像选择PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 接下来打开刚刚租用服务器的JupyterLab&#xff0c;并且打开其中的终端开始环境配置、模型下载和运行demo。 pip换源和安装依赖包 …

python爬虫入门教程(一)

上一篇文章讲了爬虫的工作原理&#xff0c;这篇文章以后就要重点开始讲编程序了。 简单爬虫的的两个步骤&#xff1a; 使用HTTPRequest工具模拟HTTP请求&#xff0c;接收到返回的文本。用于请求的包有: requests、urllib等。 对接收的文本进行筛选,获取想要的内容。用户筛选文…

Nvidia/算能 +FPGA+AI大算力边缘计算盒子:隧道和矿井绘图设备

RockMass 正在努力打入采矿业和隧道工程利基市场。 这家位于多伦多的初创公司正在利用 NVIDIA AI 开发一款绘图平台&#xff0c;帮助工程师评估矿井和施工中的隧道稳定性。 目前&#xff0c;作为安全预防措施&#xff0c;地质学家和工程师会站在离岩石五米远的地方&#xff0…

【Pyqt6 学习笔记】DIY一个二维码解析生成小工具

文章目录 Pycharm 配置QtDesignerPyUIC基本模板 代码示例依赖包main.pyscreen_shot_module.pyuntitled.pyuntitled.ui Pycharm 配置 摘自PyQT6的从零开始在Pycharm中配置与使用——蹦跑的蜗牛 pip install PyQt6 PyQt6-toolsQtDesigner File -> Settings -> External …

pdf文件在线压缩网站,pdf文件在线压缩工具软件

在数字化时代的今天&#xff0c;PDF文件已经成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;随着PDF文件的广泛使用&#xff0c;其文件大小问题也日益凸显。过大的PDF文件不仅占用了大量的存储空间&#xff0c;而且在传输和共享过程中也往往面临诸多不便。因此&am…

ubuntu 用户名及密码忘记操作

1、重启系统&#xff0c;长按Shift键&#xff0c;直到出现菜单&#xff0c;选则高级设置。选择recovery mode&#xff0c;即恢复模式 2、选择root 3、# 后面敲入 sudo passwd 用户名 4、# passwd "用户名" 之后再敲两次密码就可以了。(如果提示修改失败可先执行&a…