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