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

参考引用

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

1. Qt 数据库密码加密

  • MD5 加密在线工具
    SQLite3 数据库学习(五):Qt 数据库高级操作_第1张图片

1.1 加密流程

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

SQLite3 数据库学习(五):Qt 数据库高级操作_第2张图片

SQLite3 数据库学习(五):Qt 数据库高级操作_第3张图片

1.2 代码实现

  • loginsqlite.h

    #ifndef LOGINSQLITE_H
    #define LOGINSQLITE_H
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include   // 对密码进行 md5 加密
    #include 
    
    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 简介

SQLite3 数据库学习(五):Qt 数据库高级操作_第4张图片

  • main.cpp

    #include "tablemodel.h"
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    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 
    #include 
    
    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 实现数据的插入,查询, 更新, 删除, 事务(默认自动提交):作业提交情况表

SQLite3 数据库学习(五):Qt 数据库高级操作_第5张图片

  • main.cpp

    #include "hwtablemodelapp.h"
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    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 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    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
    SQLite3 数据库学习(五):Qt 数据库高级操作_第6张图片

3. QTableView 显示设置

SQLite3 数据库学习(五):Qt 数据库高级操作_第7张图片

3.1 main.cpp

#include "tableviewapp.h"

#include 
#include 
#include 
#include 
#include 
#include 

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 
#include 
#include 
#include 
#include 
#include 

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

你可能感兴趣的:(SQLite入门学习,数据库,sqlite,学习,QSqlTableModel,qt,QTableView)