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_NAMESPACEclass loginSqlite : public QWidget {Q_OBJECTpublic: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_NAMESPACEclass TableModel : public QWidget {Q_OBJECTpublic: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_NAMESPACEclass HWTableModelApp : public QWidget {Q_OBJECTpublic: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_NAMESPACEclass TableViewApp : public QWidget {Q_OBJECTpublic: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.mzph.cn/news/163265.shtml

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

相关文章

通过Whisper模型将YouTube播放列表中的视频转换成高质量文字稿的项目

项目简介 一个通过Whisper模型将YouTube播放列表中的视频转换成高质量文字稿的项目。 这个基于 Python 的工具旨在将 YouTube 视频和播放列表转录为文本。它集成了多种技术&#xff0c;例如用于转录的 Fast-Whisper、用于自然语言处理的 SpaCy 以及用于 GPU 加速的 CUDA&…

pytest测试框架介绍(1)

又来每天进步一点点啦~~~ 一、Pytest介绍&#xff1a; pytest 是一个非常成熟的全功能的Python测试框架&#xff1b; pytest 简单、灵活、易上手&#xff1b; 支持参数化 能够支持简单的单元测试和复杂的功能测试&#xff0c;可以做接口自动化测试&#xff08;pytestrequests&…

根据商品链接获取拼多多商品详情数据接口|拼多多商品详情价格数据接口|拼多多API接口

拼多多&#xff0c;作为中国最大的社交电商之一&#xff0c;为卖家提供了丰富的商品详情接口。这些接口可以帮助卖家快速获取商品信息&#xff0c;提高销售效率。本文将详细介绍如何使用拼多多商品详情接口&#xff0c;以及它的优势和注意事项。 一、拼多多商品详情接口概述 …

大宗商品贸易集团数据治理实践,夯实数字基座 | 数字化标杆

某大型央企是首批全国供应链创新与应用示范企业&#xff0c;在“十四五”规划期内以聚焦供应链管理核心主业作为主要战略发展方向。供应链运营管理以大宗商品贸易为主&#xff0c;其交易往往具有交易量巨大、交易环节复杂、风险交易难识别、风险客商难管控等痛点。 随着集团数…

五分钟搭建开源ERP:Odoo,并实现公网远程访问

文章目录 前言1. 下载安装Odoo&#xff1a;2. 实现公网访问Odoo本地系统&#xff1a;3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件&#xff0c;是一个一站式全功能ERP及电商平台。 开源性质&#xff1a;Odoo是一个开源的ERP软件&#xff0c;这意味着企…

小猪优版的前世今生:从籍籍无名到行业瞩目,再到骤变的风暴中心

1. 前世&#xff1a;籍籍无名到行业新星的崛起 小猪优版在初创时期&#xff0c;并不被大众所知。然而&#xff0c;它凭借对短视频行业的深度洞察&#xff0c;以及独特的商业模式&#xff0c;开始在这个领域崭露头角。它提供了一个平台&#xff0c;不仅助力内容创作者更好地展现…

使用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、安装…

如何避免Steam搬砖项目中账号被盗

购买steam余额有风险吗&#xff1f;及N种被红锁的情况 相信最近很多人都已经听说过steam游戏搬砖这个项目&#xff0c;也叫CSGO游戏搬砖项目&#xff0c;还有人叫它&#xff1a;国外steam游戏汇率差项目&#xff0c;无论怎么称呼&#xff0c;都是同一个项目。 那么什么是stea…

泼天的富贵来啦,快带着你的PMP证书一起迎接

考过PMP认证的威宝们&#xff0c;这波泼天的富贵大家一定要接住呀&#xff01; 很多威宝们在学习PMP之前都在担心&#xff0c;这个证书含金量高吗&#xff1f;转岗跳槽用得上吗&#xff1f;有必要考吗&#xff1f;今天&#xff0c;喜番大声地告诉大家&#xff1a;含金量高&…

Class文件转Java文件

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

JetLinks设备接入的认识与理解【woodwhales.cn】

为了更好的阅读体验&#xff0c;建议移步至笔者的博客阅读&#xff1a;JetLinks设备接入的认识与理解 1、认识 JetLinks 1.1、官网文档 官网&#xff1a;https://www.jetlinks.cn/ JetLinks 有两个产品&#xff1a;JetLinks-lot和JetLinks-view 官方文档&#xff1a; JetLi…

没有PDF密码,如何解密?

PDF文件有两种密码&#xff0c;一个打开密码、一个限制编辑密码&#xff0c;因为PDF文件设置了密码&#xff0c;那么打开、编辑PDF文件就会受到限制。忘记了PDF密码该如何解密&#xff1f; PDF和office一样&#xff0c;可以对文件进行加密&#xff0c;但是没有提供恢复密码的功…

mac电脑文件比较工具 UltraCompare 中文for mac

UltraCompare是一款功能强大的文件和文件夹比较工具&#xff0c;用于比较和合并文本、二进制和文件夹。它提供了丰富的功能和直观的界面&#xff0c;使用户能够轻松地比较和同步文件内容&#xff0c;查找差异并进行合并操作。 以下是UltraCompare软件的一些主要特点和功能&…

为什么程序员不直接用线上环境写代码呢?

为什么程序员不直接用线上环境写代码呢&#xff1f; 有的&#xff0c;我就是直接用Linux作为主力电脑使用&#xff0c;大概从201 6年起&#xff0c;我就开始这样干了。无论是编 程、画电路板、画UI、剪视频.... 都在Linux上面完成。 编程工具大部分都有Linux版本&#xff0c;…

【【Linux 常用命令学习 之 一 】】

Linux 常用命令学习 之 一 打开终端之后的 我们会了解 所使用的 字符串含义 其中前面的 zhuxushuai 是 当前的用户名字 接下来的 zhuxushuai-virtual-machine 是 机器名字 最后的符号 $表示 当前是普通用户 输入指令 ls 是打印出当前所在目录中所有文件和文件夹 shell 操…

多个视频怎么生成一个二维码?二维码看视频的制作方法

二维码能放入多个视频吗&#xff1f;现在用二维码看视频是很流行的一种方式&#xff0c;不仅符合现在人的行为习惯&#xff0c;而且还不需要占用自身的容量空间&#xff0c;能够即时的获取视频内容。那么当有多个视频需要展示&#xff0c;但是想要放到一个二维码中&#xff0c;…

集团投融资大数据平台解决方案

一、项目背景 项目为集团型公司大数据平台项目&#xff0c;整个项目周期约为6个月&#xff0c;整体呈现了对外的数据大屏驾驶仓和对内的看板报表&#xff0c;减少了客户内部数据上报和报表制作的重复工作量&#xff0c;为集团数据决策奠定基础。 二、项目目标 战略层&#xff…

咖啡馆管理系统点餐外卖小程序效果如何

咖啡一直是很多人喜欢的饮品&#xff0c;比如有些地区的人非常喜欢&#xff0c;熬夜加班醒脑等&#xff0c;咖啡领域市场规模逐年增加&#xff0c;相应的从业商家也在增加&#xff0c;近些年随着线上生态崛起&#xff0c;传统线下咖啡馆经营痛点显露出来。 通过【雨科】平台搭建…

目标检测算法 - YOLOv4

文章目录 1. 简介2. YOLOv4整体结构3. Backbone4. Neck 1. 简介 YOLOv4是YOLOv3的改进版。YOLOv4并不是原YOLO项目的作者。发表于CVPR2020。 改进&#xff1a; 主干特征提取网络&#xff1a;Darknet53 -> CSPDarknet53特征金字塔&#xff1a;SPP&#xff0c;PAN分类回归层…

每天学习一点点之 Tomcat 是如何清除过期 Session 的

今天使用一种很临时的方案解决 Session 泄漏的问题&#xff1a;缩短 Session 的过期时间。这种方法虽然简单&#xff0c;但却非常有效。然而&#xff0c;这引发了一个问题&#xff1a;我们应该将过期时间设置为多短呢&#xff1f;在 Spring Boot 中&#xff0c;最短的过期时间是…