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

参考引用

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

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

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

使用whisper实现语音转文本

项目地址&#xff1a;GitHub - openai/whisper: Robust Speech Recognition via Large-Scale Weak Supervision 1、需要py3.8环境 conda activate p38 2、安装 pip install -U openai-whisper 3、下载项目 pip install githttps://github.com/openai/whisper.git 4、安装…

Class文件转Java文件

目录 1、下载一个反编译工具2、在文件夹下打开命令窗口3、在此目录下随意建一个文件夹4、在打开的命令窗口输入命令5、返回解压目录下 1、下载一个反编译工具 下载链接&#xff1a;https://varaneckas.com/jad/ 下载的是第一个 下载后放至任意目录下解压即可 2、在文件夹下打…

E-R图与关系模式

1. E-R模型 英文全称&#xff1a;Entity-relationship model&#xff0c;即实体关系模型 把现实世界的 实体模型通过建模转换为信息世界的概念模型&#xff0c;这个概念模型就是E-R模型 2. 数据库设计流程 一般设计数据库分为三个步骤 把现实世界的实体模型&#xff0c;通…

手把手教你如何提交App备案

手把手教你如何提交App备案 随着工信部出台了《工业和信息化部关于开展移动互联网应用程序备案工作的通知》对于我司所使用的到的移动应用APP就需要做app备案&#xff0c;今天用游戏app手把手教你如何提交App备案。 基本操作流程 运营、市场 提供需要备案的APP名称、主体、A…

市场是变化的?这种悖论fpmarkets澳福一秒打破

你是不是始终认为市场是经常变化的&#xff0c;其实这是不对的&#xff0c;这种认识fpmarkets澳福今天一秒打破。 市场经常变化吗?众多投资者无需过多思考&#xff0c;就认为答案是肯定的。因为无论是在互联网的哪个角落&#xff0c;都可以看到这样的信息。即使我们没有深入研…

mysql查询统计最近12个月的数据

项目场景&#xff1a; mysql查询统计最近12个月的数据&#xff0c;按每个月纵向展示&#xff0c;效果图 sql语句 注意&#xff1a;count( v.uuid ) 这里的是被统计那张表的id SELECT m.month,count( v.uuid ) AS total FROM (SELECT DATE_FORMAT(( CURDATE()), %Y-%m ) AS mon…

【实用】mysql配置 及将线上数据导入本地 问题解决及记录

[ERR] 1292 - Incorrect datetime value: ‘0000-00-0000:00:00‘ for column ‘BIRTH_DATE‘ at row 1 此问题是mysql当前配置不支持日期为空&#xff0c;或者为‘0000-00-0000:00:00‘得情况 1、直接在数据库执行 # 修改全局 set global.sql_mode ONLY_FULL_GROUP_BY,STR…

vue2生命周期

前言 vue的生命周期其实可以分为两块,一个是vue实例的生命周期,一个是组件的生命周期。 vue实例的生命周期方法共有4个:$mout,$forceUpdate,$nextTick,$destroy vue组件的生命周期钩子共有8个:beforeCreate,created,beforeMount,mounted,beforeUpdate, updated,beforeDestr…

Element UI的Tabs 标签页位置导航栏去除线条

在实际开发中&#xff0c;我们调整了相关样式&#xff0c;导致导航栏的相关样式跟随不上&#xff0c;如下图所示&#xff1a; 因为我跳转了前边文字的样式并以在导航栏添加了相关头像&#xff0c;导致右边的线条定位出现问题&#xff0c;我在想&#xff0c;要不我继续调整右边…

抖音汽车租赁小程序技术指南:开发高效便捷的租赁系统

为了更好地满足用户需求&#xff0c;抖音汽车租赁小程序成为一个备受关注的技术解决方案。本文将深入探讨开发高效便捷的汽车租赁系统所需的技术要点&#xff0c;为开发者提供一份实用的技术指南。 小程序架构选择 在搭建抖音汽车租赁小程序时&#xff0c;选择合适的小程序架构…

TIDB拓扑结构

TiDB Server&#xff1a;SQL层&#xff0c;负责接受客户端的连接&#xff0c;执行SQL解析和优化&#xff0c;最终生成分布式执行计划。TiDB Server为无状态的&#xff0c;可增加节点负载均衡。 PD (Placement Driver) Server&#xff1a;整个TiDB集群的元信息管理模块&#xf…

露营管理系统预约小程序效果如何

旅游经济已经复苏&#xff0c;并且市场规模增速加快&#xff0c;近一年来远途/周边游客户增多&#xff0c;不少旅游景区在节假日常常面对客流爆满现象。同时露营作为近几年突然火热的项目&#xff0c;其需求也是日渐上升。 然而在高需求的同时&#xff0c;我们也看到露营经营痛…

修改QtCreator/QDesigner的对象指示器高亮颜色

一、前言 QtCreator的设计中&#xff0c;高亮颜色太接近了&#xff0c;在左边点一个对象后&#xff0c;很难在右边对上&#xff0c;体验极差。 二、解决方案 创建一份style.qss&#xff0c;写入以下的样式&#xff1a; /* for QtCreator */ QDockWidget #ObjectInspector …

线上问题排查实例分析|关于 Redis 内存泄漏

Redis 作为高性能的 key-value 内存型数据库&#xff0c;普遍使用在对性能要求较高的系统中&#xff0c;同时也是滴滴内部的内存使用大户。本文从 KV 团队对线上 Redis 内存泄漏定位的时间线维度&#xff0c;简要介绍 Linux 上内存泄漏的问题定位思路和工具。 16:30 问题暴露 业…

快来考试拿证书!KubeSphere 个人技能专业考试认证上线啦!

以容器技术和容器编排为基础的云原生应用&#xff0c;被越来越多的企业用户接受和使用&#xff0c;并且在生产环境中使用容器技术的比例逐年增加。Kubernetes 无疑已经成为容器编排的事实基础&#xff0c;而依托于 Kubernetes 开发的开源容器平台 KubeSphere 也收获了一众拥趸。…

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

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

论文《Unsupervised Dialog Structure Learning》笔记:详解DD-VRNN

D-VRNN模型和DD-VRNN模型 总体架构 离散-可变循环变分自编码器&#xff08;D-VRNN&#xff09;和直接-离散-可变循环变分自编码器&#xff08;DD-VRNN&#xff09;概述。D-VRNN和DD-VRNN使用不同的先验分布来建模 z t z_t zt​之间的转换&#xff0c;如红色实线所示。 x t x_t…

【Effective C++】 (六) 继承与面向对象设计

【六】继承与面向对象设计 条款32 &#xff1a; 确保public继承是"is a"的关系 Item 32: Make sure public inheritance models “is-a”. C面向对象程序设计中&#xff0c;最重要的规则便是&#xff1a;public继承应当是"is-a"的关系。当Derived public继…

设计师不能忽视的几个宝藏图标设计工具

在这个快速变化的时代&#xff0c;设计师对创新和实用工具的需求越来越大。这就要求我们及时跟上潮流&#xff0c;不断探索和尝试最新、最有价值的图标设计工具。只有这样&#xff0c;我们才能在竞争激烈的设计市场中脱颖而出。以下是我们精心挑选的2024年值得一试的图标设计工…