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.pswp.cn/news/163265.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/163265.shtml
英文地址,請注明出處:http://en.pswp.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;以及它的優勢和注意事項。 一、拼多多商品詳情接口概述 …

Picasso網絡原生PICA Token通過XCM集成進入Moonriver生態

波卡上的首選多鏈開發平臺Moonbeam宣布Moonriver和Picasso&#xff08;分別為Moonbeam和Composable Finance的Kusama對應平行鏈&#xff09;已達成XCM集成。該集成將Picasso的PICA Token引入Moonriver生態系統使用&#xff0c;并允許用戶在Picasso網絡上使用MOVR。兩條平行鏈都…

大宗商品貿易集團數據治理實踐,夯實數字基座 | 數字化標桿

某大型央企是首批全國供應鏈創新與應用示范企業&#xff0c;在“十四五”規劃期內以聚焦供應鏈管理核心主業作為主要戰略發展方向。供應鏈運營管理以大宗商品貿易為主&#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、安裝…

6:kotlin 空值安全(Null safety)

在Kotlin中&#xff0c;是可以有空值的。為了防止程序中出現空值問題&#xff0c;Kotlin實施了空值安全。空值安全在編譯時而不是運行時檢測到可能的空值問題。 空值安全是一組功能的組合&#xff0c;允許您&#xff1a; 明確聲明程序中允許空值的地方。檢查空值。對可能包含…

如何避免Steam搬磚項目中賬號被盜

購買steam余額有風險嗎&#xff1f;及N種被紅鎖的情況 相信最近很多人都已經聽說過steam游戲搬磚這個項目&#xff0c;也叫CSGO游戲搬磚項目&#xff0c;還有人叫它&#xff1a;國外steam游戲匯率差項目&#xff0c;無論怎么稱呼&#xff0c;都是同一個項目。 那么什么是stea…

2022-4-10 臺大機器人學 軌跡

臺大機器人學 運動學 軌跡規劃 多段 linear function with parabolic blends 直線轉二次曲線平滑過多個中間via points

Fuzzy c-means

Fuzzy c-means ? 模糊C-均值聚類算法&#xff1a;是一種模糊聚類算法&#xff0c;是K均值算法聚類的推廣形式&#xff0c;隸屬度取值為[0,1]區間內的任意一個數&#xff0c;提出的基本依據是“類內加權誤差平方和最小化”準則。 ? 這兩個方法都是迭代求取最終的聚類劃分&am…

潑天的富貴來啦,快帶著你的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、在文件夾下打…

夜天之書 #88 Elastic License 2.0 與開源協議的發展

譯序 我在此前的多篇文章中討論了商業開源的話題&#xff1a; 《企業開源的軟件協議模型實踐》《企業實踐開源的動機》《商業源碼協議為何得到 HashiCorp 等企業的垂青&#xff1f;》《企業如何實踐開源協同》《中國不缺好的開源開發者》“商業探索與可持續”一節《開源不是商業…

JetLinks設備接入的認識與理解【woodwhales.cn】

為了更好的閱讀體驗&#xff0c;建議移步至筆者的博客閱讀&#xff1a;JetLinks設備接入的認識與理解 1、認識 JetLinks 1.1、官網文檔 官網&#xff1a;https://www.jetlinks.cn/ JetLinks 有兩個產品&#xff1a;JetLinks-lot和JetLinks-view 官方文檔&#xff1a; JetLi…

【自然語言處理】正向最大匹配算法(FMM),反向最大匹配算法(BMM)和雙向最大匹配算法(BM)原理及實現

目錄 一&#xff0c;正向最大匹配算法&#xff08;FMM&#xff09; 二&#xff0c;反向最大匹配算法&#xff08;RMM) 一&#xff0c;正向最大匹配算法&#xff08;FMM&#xff09; 正向最大匹配分詞&#xff08;Forward maximum matching segmentation&#xff09;通常簡稱為…

沒有PDF密碼,如何解密?

PDF文件有兩種密碼&#xff0c;一個打開密碼、一個限制編輯密碼&#xff0c;因為PDF文件設置了密碼&#xff0c;那么打開、編輯PDF文件就會受到限制。忘記了PDF密碼該如何解密&#xff1f; PDF和office一樣&#xff0c;可以對文件進行加密&#xff0c;但是沒有提供恢復密碼的功…

powshell 不能運行腳本

1、先執行&#xff1a; Set-ExecutionPolicy -Scope CurrentUser 2、再輸入&#xff1a; remotesigned