参考引用
- 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_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 简介
-
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_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 实现数据的插入,查询, 更新, 删除, 事务(默认自动提交):作业提交情况表
-
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_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
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_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;
}