參考引用
- 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;
}