参考引用
- SQLite 权威指南(第二版)
- SQLite3 入门
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");
}
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();
}
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); // 删除完后要自己调用提交
}
#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();
}
#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
#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;
}