SQLite3 数据库学习(五):Qt 数据库高级操作

news2024/11/17 10:00:58

参考引用

  • SQLite 权威指南(第二版)
  • SQLite3 入门

1. Qt 数据库密码加密

  • MD5 加密在线工具
    在这里插入图片描述

1.1 加密流程

  • 加密后的密码都是不可逆的

在这里插入图片描述

在这里插入图片描述

1.2 代码实现

  • loginsqlite.h

    #ifndef LOGINSQLITE_H
    #define LOGINSQLITE_H
    
    #include <QWidget>
    #include <QSqlError>
    #include <QString>
    #include <QSqlQuery>
    #include <QDebug>
    #include <QMessageBox>
    #include <QSqlRecord>
    #include <QSettings>
    #include <QCryptographicHash>  // 对密码进行 md5 加密
    #include <QByteArray>
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class loginSqlite; }
    QT_END_NAMESPACE
    
    class loginSqlite : public QWidget {
        Q_OBJECT
    
    public:
        loginSqlite(QWidget *parent = nullptr);
        ~loginSqlite();
    
    private slots:
        void on_loginBt_clicked();
        void on_regBt_clicked();
    
    private:
        Ui::loginSqlite *ui;
        QString password_md5(QString input);
    };
    #endif // LOGINSQLITE_H
    
  • loginsqlite.cpp

    #include "loginsqlite.h"
    #include "ui_loginsqlite.h"
    
    loginSqlite::loginSqlite(QWidget *parent) : QWidget(parent), ui(new Ui::loginSqlite) {
        ui->setupUi(this);
    
        // 从配置文件中提取用户名和密码
        QSettings setting(QSettings::IniFormat, QSettings::SystemScope, "config");
        QString username = setting.value("username").toString();
        QString password = setting.value("password").toString();
    
        ui->userEdit->setText(username);
        ui->passEdit->setText(password);
    }
    
    loginSqlite::~loginSqlite() {
        delete ui;
    }
    
    // 对密码进行 md5 加密
    QString loginSqlite::password_md5(QString input) {
        // 创建加密对象
        QCryptographicHash hash(QCryptographicHash::Md5);
        // 添加明文数据
        hash.addData(input.toUtf8());
        // 获取加密后的数据
        QByteArray pass = hash.result();  // 16 字节数据,md5 数据就是把这 16 个字节数据转十六进制
        // md5 数据就是把上面 pass 的这 16 个字节数据转十六进制
        return pass.toHex();
    }
    
    // 登录:查询数据库
    void loginSqlite::on_loginBt_clicked() {
        QString username = ui->userEdit->text();
        QString password = ui->passEdit->text();
        // 对密码进行 md5 加密,然后再返回给自己
        password = password_md5(password);
    
        // 打包插入的 sql 语句
        QString sql = QString("select * from user where username='%1' and password='%2'")
                          .arg(username).arg(password);
        // 执行 sql 插入语句
        QSqlQuery query;
        if (!query.exec(sql)) {
            qDebug() << query.lastError().text();
            return;
        }
    
        // 获取查询的数据
        if (query.next()) {  // 指向第一个数据
            // 查到记录
            qDebug() << "find record";
    
            // QSettings 记录用户名密码
            if (ui->checkBox->isChecked()) {
                // 打开配置文件 (在 C:\ProgramData 目录下)
                QSettings setting(QSettings::IniFormat, QSettings::SystemScope, "config.ini");
                // 把用户名和密码设置到配置文件中
                setting.setValue("username", username);
                setting.setValue("password", password);
            }
        } else {
            // 未查到记录
            qDebug() << "not find record";
        }
        QSqlRecord record = query.record();  // 一行数据是一条记录
        qDebug() << record.value("username").toString();
        qDebug() << record.value("password").toString();
    }
    
    // 注册:插入数据
    void loginSqlite::on_regBt_clicked() {
        QString username = ui->userEdit->text();
        QString password = ui->passEdit->text();
        // 对密码进行 md5 加密,然后再返回给自己
        password = password_md5(password);
    
        // 打包插入的 sql 语句
        QString sql = QString("insert into user(username, password) values('%1', '%2')")
                          .arg(username).arg(password);
        // 执行 sql 插入语句
        QSqlQuery query;
        if (!query.exec(sql)) {
            qDebug() << query.lastError().text();
            QMessageBox::information(this, "registe", "registe failed");
            return;
        }
        QMessageBox::information(this, "registe", "registed");
    }
    

2. QSqlTableModel 解析

  • 数据库(数据):QSqlTableModel
  • 视图(显示):QTableView

2.1 QSqlTableModel 简介

在这里插入图片描述

  • main.cpp

    #include "tablemodel.h"
    
    #include <QApplication>
    #include <QSqlDatabase>
    #include <QDebug>
    #include <QSqlError>
    #include <QString>
    #include <QSqlQuery>
    
    int main(int argc, char *argv[]) {
        QApplication a(argc, argv);
    
        // 创建一个默认数据库连接,在后期整个 Qt 应用中可使用,通过 Qt 中的接口函数操作数据库
        // 创建数据库连接句柄
        QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
        // 设置数据库名称,用户名,密码
        db.setDatabaseName("my.db");
        // 打开数据库
        if (!db.open()) {
            qDebug() << db.lastError().text();  // 输出错误信息
        }
    
        // 创建表格
        QString sql = "create table if not exists user(id integer primary key autoincrement,"
                      "username varchar(256) unique, password varchar(256))";
        // 执行 sql 语句
        QSqlQuery query;  // 自动关联到默认连接名的数据库
        if (query.exec(sql)) {
            qDebug() << query.lastError().text();
        }
    
        TableModel w;
        w.show();
        return a.exec();
    }
    
  • tablemodel.h

    #ifndef TABLEMODEL_H
    #define TABLEMODEL_H
    
    #include <QWidget>
    #include <QSqlTableModel>
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class TableModel; }
    QT_END_NAMESPACE
    
    class TableModel : public QWidget {
        Q_OBJECT
    
    public:
        TableModel(QWidget *parent = nullptr);
        ~TableModel();
    
    private slots:
        void on_pushButton_clicked();
    
    private:
        Ui::TableModel *ui;
        QSqlTableModel *model;
    };
    #endif // TABLEMODEL_H
    
  • tablemodel.cpp

    #include "tablemodel.h"
    #include "ui_tablemodel.h"
    
    TableModel::TableModel(QWidget *parent) : QWidget(parent), ui(new Ui::TableModel) {
        ui->setupUi(this);
    
        model = new QSqlTableModel;  // 会自动绑定到默认连接的数据库
        // 设置数据表
        model->setTable("user");
        ui->tableView->setModel(model);
    }
    
    TableModel::~TableModel() {
        delete ui;
    }
    
    void TableModel::on_pushButton_clicked() {
        // 查询--获取数据库数据
        model->select();
    }
    

2.2 QSqlTableModel 增删改查

  • 用 QSqlTableModel 实现数据的插入,查询, 更新, 删除, 事务(默认自动提交):作业提交情况表

在这里插入图片描述

  • main.cpp

    #include "hwtablemodelapp.h"
    
    #include <QApplication>
    #include <QSqlDatabase>
    #include <QDebug>
    #include <QSqlError>
    #include <QString>
    #include <QSqlQuery>
    
    int main(int argc, char *argv[]) {
        QApplication a(argc, argv);
    
        // 创建数据库连接句柄
        QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
        // 设置数据库名称,用户名,密码
        db.setDatabaseName("my.db");
        // 打开数据库
        if (!db.open()) {
            qDebug() << db.lastError().text();  // 输出错误信息
        }
    
        // 创建表格
        QString sql = "create table if not exists homework(id integer primary key autoincrement,"
                      "class varchar(256) not null, name varchar(256) not null,"
                      "time varchar(256) not null, hwname varchar(256))";
        // 执行 sql 语句
        QSqlQuery query;  // 自动关联到默认连接名的数据库
        if (query.exec(sql)) {
            qDebug() << query.lastError().text();
        }
    
        HWTableModelApp w;
        w.show();
        return a.exec();
    }
    
  • hwtablemodelapp.h

    #ifndef HWTABLEMODELAPP_H
    #define HWTABLEMODELAPP_H
    
    #include <QWidget>
    #include <QDebug>
    #include <QSqlError>
    #include <QString>
    #include <QSqlQuery>
    #include <QSqlTableModel>
    #include <QSqlRecord>
    #include <QDatetime>
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class HWTableModelApp; }
    QT_END_NAMESPACE
    
    class HWTableModelApp : public QWidget {
        Q_OBJECT
    
    public:
        HWTableModelApp(QWidget *parent = nullptr);
        ~HWTableModelApp();
    
    private slots:
        void on_insertBt_clicked();
        void on_selectBt_clicked();
        void on_tableView_clicked(const QModelIndex &index);
        void on_updateBt_clicked();
        void on_submitBt_clicked();
        void on_deleteBt_clicked();
    
    private:
        Ui::HWTableModelApp *ui;
        QSqlTableModel *model;
    };
    #endif // HWTABLEMODELAPP_H
    
  • hwtablemodelapp.cpp

    #include "hwtablemodelapp.h"
    #include "ui_hwtablemodelapp.h"
    
    HWTableModelApp::HWTableModelApp(QWidget *parent) : QWidget(parent), ui(new Ui::HWTableModelApp) {
        ui->setupUi(this);
        // 初始化数据表格模型
        model = new QSqlTableModel;
    
        // 设置事务手动提交--默认是自动提交
        model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    
        // 绑定表格
        model->setTable("homework");
        // 查询数据
        model->select();  // 就是把表格中的数据提取出来放在模型中
        // 模型与视图绑定
        ui->tableView->setModel(model);
    }
    
    HWTableModelApp::~HWTableModelApp(){
        delete ui;
        delete model;
    }
    
    // 插入数据
    void HWTableModelApp::on_insertBt_clicked() {
        QString _class  = ui->classEdit->text();
        QString _name   = ui->nameEdit->text();
        QString _hwname = ui->hwEdit->text();
        QString _time   = QDateTime::currentDateTime().toString();
    
        // 创建一条数据记录--根据当前表格创建(才能知道有那些字段)
        QSqlRecord record = model->record();
        record.setValue("class",  _class);
        record.setValue("name",   _name);
        record.setValue("time",   _time);
        record.setValue("hwname", _hwname);
    
        // 把记录添加到表格模型中
        model->insertRecord(0, record);
        // 提交事务
        model->submitAll();
        // 如果使用手动提交事务,从数据库中重新拿到数据
        model->select();
    }
    
    // 查询数据
    void HWTableModelApp::on_selectBt_clicked() {
        QString _class  = ui->classEdit->text();
        QString _name   = ui->nameEdit->text();
        QString _hwname = ui->hwEdit->text();
    
        QString filter;
        if (!_class.isEmpty()) {
            filter.append(QString("class = '%1'").arg(_class));
        }
        if (!_name.isEmpty()) {
            if (!filter.isEmpty()) {  // 设置双重条件查询,更精确
                filter.append(" and ");
            }
            filter.append(QString("name = '%1'").arg(_name));
        }
        if (!_hwname.isEmpty()) {
            if (!filter.isEmpty()) {
                filter.append(" and ");
            }
            filter.append(QString("hwname = '%1'").arg(_hwname));
        }
    
        // 设置条件过滤 sql--where 的条件
        model->setFilter(filter);
        // 查询数据
        model->select();
    }
    
    // 点击视图获取当前点击行的数据
    void HWTableModelApp::on_tableView_clicked(const QModelIndex &index) {
        // 获取当前被选中的行
        int row = index.row();
        // 从模型中获取 row 行的数据
        QSqlRecord record = model->record(row);
    
        // 获取记录中的数据
        ui->classEdit->setText(record.value("class").toString());
        ui->nameEdit->setText(record.value("name").toString());
        ui->hwEdit->setText(record.value("hwname").toString());
    }
    
    // 更新数据
    void HWTableModelApp::on_updateBt_clicked() {
        // 获取当前被选中的行
        int row = ui->tableView->currentIndex().row();
        if (row < 0) {
            return;
        }
        // 从模型中提取 row 行的数据
        QSqlRecord record = model->record(row);
    
        // 更新记录中的数据
        record.setValue("class",  ui->classEdit->text());
        record.setValue("name",   ui->nameEdit->text());
        record.setValue("hwname", ui->hwEdit->text());
    
        // 把记录更新到模型中
        model->setRecord(row, record);
    }
    
    // 事务提交(按下此按钮后更新的数据才会同步到数据库中,因为前面设置了手动事务提交)
    void HWTableModelApp::on_submitBt_clicked() {
        model->submitAll();
    }
    
    // 删除数据
    void HWTableModelApp::on_deleteBt_clicked() {
        // 删除当前被选中的行
        int row = ui->tableView->currentIndex().row();
        if (row < 0) {
            return;
        }
        model->removeRow(row);  // 删除完后要自己调用提交
    }
    
  • hwtablemodelapp.ui
    在这里插入图片描述

3. QTableView 显示设置

在这里插入图片描述

3.1 main.cpp

#include "tableviewapp.h"

#include <QApplication>
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QString>
#include <QSqlQuery>

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);

    // 创建数据库连接句柄
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    // 设置数据库名称,用户名,密码
    db.setDatabaseName("my.db");
    // 打开数据库
    if (!db.open()) {
        qDebug() << db.lastError().text();  // 输出错误信息
    }

    // 创建表格
    QString sql = "create table if not exists homework(id integer primary key autoincrement,"
                  "class varchar(256) not null, name varchar(256) not null,"
                  "time varchar(256) not null, hwname varchar(256))";
    // 执行 sql 语句
    QSqlQuery query;  // 自动关联到默认连接名的数据库
    if (query.exec(sql)) {
        qDebug() << query.lastError().text();
    }

    TableViewApp w;
    w.show();
    return a.exec();
}

3.2 tableviewapp.h

#ifndef TABLEVIEWAPP_H
#define TABLEVIEWAPP_H

#include <QWidget>
#include <QDebug>
#include <QSqlError>
#include <QString>
#include <QSqlQuery>
#include <QSqlTableModel>

QT_BEGIN_NAMESPACE
namespace Ui { class TableViewApp; }
QT_END_NAMESPACE

class TableViewApp : public QWidget {
    Q_OBJECT

public:
    TableViewApp(QWidget *parent = nullptr);
    ~TableViewApp();

private:
    Ui::TableViewApp *ui;
    QSqlTableModel *model;
};
#endif // TABLEVIEWAPP_H

3.3 tableviewapp.cpp

#include "tableviewapp.h"
#include "ui_tableviewapp.h"

TableViewApp::TableViewApp(QWidget *parent) : QWidget(parent), ui(new Ui::TableViewApp) {
    ui->setupUi(this);

    model = new QSqlTableModel;
    model->setTable("homework");
    model->select();
    ui->tableView->setModel(model);

    // 隐藏第 0 列数据
    ui->tableView->setColumnHidden(0,true);

    // 设置表水平头显示
    model->setHeaderData(1, Qt::Horizontal, u8"班级");
    model->setHeaderData(2, Qt::Horizontal, u8"姓名");
    model->setHeaderData(3, Qt::Horizontal, u8"时间");
    model->setHeaderData(4, Qt::Horizontal, u8"作业名称");

    // 设置表格线隐藏/显示
    ui->tableView->setShowGrid(true);

    // 设置表格线样式
    ui->tableView->setGridStyle(Qt::DashDotLine);
}

TableViewApp::~TableViewApp() {
    delete ui;
}

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

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

相关文章

第15届蓝桥杯Scratch选拔赛中级(STEMA)真题2023年10月

一、单选题 1.运行以下哪个程序后&#xff0c;巨嘴鸟会向下移动&#xff1f;&#xff08; &#xff09; A. B. C. D. 2.运行以下程序后&#xff0c; 能看到几只河豚鱼&#xff08; &#xff09;&#xff1f; A.3 B.4 C.6 D.7 3.以下运算结果为“False”的是&#xff08…

Python教程73:Pandas中一维数组Series学习

创建一维数据类型Series dataNone 要转化为Series的数据(也可用dict直接设置行索引) 若是标量则必须设置索引,该值会重复,来匹配索引的长度 indexNone 设置行索引 dtypeNone 设置数据类型(使用numpy数据类型) nameNone 设置Series的name属性 copyFalse 不复制 (当data为ndarray…

常用服务注册中心与发现(Eurake、zookeeper、Nacos)笔记(一)基础概念

基础概念 注册中心 在服务治理框架中&#xff0c;通常都会构建一个注册中心&#xff0c;每个服务单元向注册中心登记自己提供的服务&#xff0c;将主机与端口号、版本号、通信协议等一些附加信息告知注册中心&#xff0c;注册中心按照服务名分类组织服务清单&#xff0c;服务…

群晖NAS搭建WebDav服务做文件共享,可随时随地远程访问

文章目录 1. 在群晖套件中心安装WebDav Server套件1.1 安装完成后&#xff0c;启动webdav服务&#xff0c;并勾选HTTP复选框 2. 局域网测试WebDav服务2.1 下载RaiDrive客户端2.2 打开RaiDrive&#xff0c;设置界面语言可以选择中文2.3 点击添加按钮&#xff0c;新建虚拟驱动区2…

碳化硅MOS/超结MOS在直流充电桩上的应用-REASUNOS瑞森半导体

一、前言 直流充电桩是新能源汽车直流充电桩的简称&#xff0c;一般也被叫做“快充”。直流充电桩一般与交流电网连接&#xff0c;可作为非车载电动汽车的动力补充&#xff0c;是一种直流工作电源的电源控制装置&#xff0c;可以提供充足的电量&#xff0c;输出电压和电流可以…

.symtab ELF符号表(转载)

1. 符号表&#xff08;symbol table&#xff09;介绍 ELF文件中的“符号表&#xff08;symbol table&#xff09;”包含的是程序中的符号信息 – 这些符号代表的或许是定义&#xff08;例如定义全局变量时使用的变量名&#xff0c;或者定义函数时使用的函数名&#xff09;&…

探索网络模型与协议:从OSI到HTTPs的原理解析

一、OSI网络模型 OSI&#xff08;Open Systems Interconnection&#xff09;七层网络参考模型和TCP/IP四层模型都是用于理解和设计计算机网络的框架&#xff0c;但它们之间存在一些差异。 1、七层 vs 四层 OSI七层网络参考模型&#xff1a; 物理层&#xff08;Physical Laye…

博士研究生不会编程,也没有使用过Python,是否很失败

首先&#xff0c;对于博士研究生来说&#xff0c;虽然在学习和科研的过程中会涉猎到大量的专业知识&#xff0c;但是同样也会错过很多知识&#xff0c;对于非计算机相关专业的博士研究生来说&#xff0c;没有使用过Python&#xff0c;或者说编程能力比较弱也是比较正常的情况&a…

Linux CentOS+宝塔面板工具结合内网穿透实现网站发布至公网可访问

使用Typecho搭建个人博客网站&#xff0c;并内网穿透实现公网访问 文章目录 使用Typecho搭建个人博客网站&#xff0c;并内网穿透实现公网访问前言1. 安装环境2. 下载Typecho3. 创建站点4. 访问Typecho5. 安装cpolar6. 远程访问Typecho7. 固定远程访问地址8. 配置typecho 前言 …

「快学Docker」监控和日志记录容器的健康和性能

「快学Docker」监控和日志记录容器的健康和性能 1. 容器健康状态监控2. 性能监控3. 日志记录几种采集架构图 4. 监控工具和平台cAdvisor&#xff08;Container Advisor&#xff09;PrometheusGrafana 5. 自动化运维 1. 容器健康状态监控 方法1&#xff1a;需要实时监测容器的运…

医学检验(LIS)源码,实现检验结果审核自动化、检验无纸化、双向通讯

医学检验(LIS)管理系统 随着全自动生化分析仪、全自动免疫分析仪和全自动血球计数器等仪器的使用&#xff0c;检验科的大多数项目实现了全自动化分析。全自动化分析引入后&#xff0c;组合化验增多&#xff0c;更好的满足了临床需要&#xff0c;也使检验科的工作量和检验数据成…

centos7中通过minikube安装Kubernetes

minikube是一款开源的Kubernetes集群管理器&#xff0c;它可以帮助您在本地计算机上轻松部署和管理Kubernetes集群。以下是minikube的安装和使用步骤&#xff1a; 安装Docker&#xff1a;如果您还没有安装Docker&#xff0c;可以从Docker官方网站上下载并安装适合您操作系统的…

YOLOv5改进: Inner-IoU基于辅助边框的IoU损失,高效结合 GIoU, DIoU, CIoU,SIoU 等 | 2023.11

💡💡💡本文独家改进:Inner-IoU引入尺度因子 ratio 控制辅助边框的尺度大小用于计算损失,并与现有的基于 IoU ( GIoU, DIoU, CIoU,SIoU )损失进行有效结合 推荐指数:5颗星 新颖指数:5颗星 💡💡💡Yolov5/Yolov7魔术师,独家首发创新(原创),适用于…

Android和iOS应用程序加固方法详解:混淆、加壳、数据加密、动态加载和数字签名实现

目录 Android和iOS应用程序加固方法详解&#xff1a;混淆、加壳、数据加密、动态加载和数字签名实现 APP 加固方式 iOS APP加固代码实现 打开要处理的IPA文件 设置签名使用的证书和描述文件 开始ios ipa重签名 APP 加固方式 iOSAPP 加固是优化 iOS安全性的一种方法&…

三十分钟学会Shell(下)

Shell 3.1 运算符 3.1.1 算数运算符 在Shell脚本中&#xff0c;算术运算符用于执行基本的数学运算。Shell支持多种算术运算符&#xff0c;包括加、减、乘、除等。以下是关于Shell算术运算符的一些方法以及相应的示例说明&#xff1a; 加法&#xff1a; a10 b20 c$((a b)) …

Android WorldWind加载shapefile格式文件形成三维效果

目录 1 前言2 实现思路3 绘制Polygons4 读取shapefile文件5 加载立体模型6 问题1 前言 在项目中有时会加载shapefile格式的数据,要形成三维立体效果。但是查看worldwind NASA官网,在worldwind android的使用教程中并没用加载shapefile格式的教程,然后源码中也没有开发加载s…

windows事件查看器日志

Windows 事件查看器&#xff08;Event Viewer&#xff09;是 Windows 操作系统提供的一个内置工具&#xff0c;它用于管理和查看系统、应用程序和安全事件日志。在 Windows 系统中&#xff0c;各种活动和错误都会被记录到事件日志中&#xff0c;包括系统启动、应用程序崩溃、安…

永久免费!N个excel表一键合并成一个表(excel表格合并技巧)

您是否还在用手工复制粘贴来将多个EXCEL或表的数据合并到一个表里&#xff1f;那就太麻烦&#xff0c;效率太低了&#xff0c;用金鸣表格文字识别的“表格合并”功能&#xff0c;可免费将N个excel文件或N个excel表一键合并到一个表里面&#xff0c;而且这个功能永久免费&#x…

栈回溯--在栈里挑出返回地址

GNU Arm Embedded Toolchain project files : GNU Arm Embedded Toolchain arm-none-eabi-addr2line -e F103_Moduel.axf -a -f 08000350 08001d94 0800260c 汇编中&#xff1a; ;HardFault_Handler ; PROC ; EXPORT HardFault_Handler …

PTA-用天平找小球

三个球A、B、C&#xff0c;大小形状相同且其中有一个球与其他球重量不同。要求找出这个不一样的球。 输入格式&#xff1a; 输入在一行中给出3个正整数&#xff0c;顺序对应球A、B、C的重量。 输出格式&#xff1a; 在一行中输出唯一的那个不一样的球。 输入样例&#xff…