QT肝8天07--连接数据库
1、sqlite数据库介绍
SQLite是一款轻量级、自包含的关系型数据库管理系统(RDBMS),以其零配置、单文件存储和嵌入式特性著称。以下是其核心特点和应用场景:
核心特性
- 无服务器架构
直接嵌入应用程序进程内,无需独立服务进程,通过API调用操作数据库文件。
单文件存储
整个数据库(表、索引、事务等)存储于单一磁盘文件,便于备份和传输23。ACID事务支持
完整支持原子性、一致性、隔离性和持久性,确保数据安全34。跨平台兼容
支持Windows、Linux、macOS及移动端(如Android/iOS)2。
技术优势
- 轻量化:库文件仅几百KB,内存占用低3。
- 标准SQL支持:兼容大部分SQL-92语法,支持视图、触发器等功能23。
- 零配置:无需安装或管理,开箱即用14。
适用场景
- 嵌入式设备:如物联网终端、智能硬件3。
- 移动应用:Android/iOS本地数据存储。
- 桌面程序:小型工具软件的配置管理2。
- 开发测试:快速搭建轻量级数据库环境
与其他数据库对比
2、qt连接sqlite思路
Qt连接SQLite数据库的核心思路可分为以下几个关键步骤
环境配置
首先需在项目配置文件(.pro)中添加SQL模块依赖:QT += sql
,并包含必要的头文件如QSqlDatabase
、QSqlQuery
等14。
数据库连接建立
- 创建连接:通过
QSqlDatabase::addDatabase("QSQLITE")
指定SQLite驱动,该驱动为Qt内置无需额外安装 。 - 设置数据库文件:使用
setDatabaseName()
指定数据库文件路径(如"mydatabase.db"
),若文件不存在将自动创建 。 - 打开连接:调用
open()
方法验证连接是否成功,失败时可利用lastError()
获取错误信息 。
数据库操作
- 执行SQL语句:通过
QSqlQuery
执行建表、插入等操作,例如CREATE TABLE IF NOT EXISTS
创建表结构 。 - 数据绑定:使用
prepare()
和bindValue()
实现参数化查询,提升安全性和性能 。 - 事务处理:通过
transaction()
和commit()
确保批量操作的原子性 。
连接管理
操作完成后需显式调用close()
关闭连接,但通常程序退出时会自动释放资源46。对于多连接场景,可通过QSqlDatabase::database()
管理命名连接 。
示例流程
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("test.db");
if (!db.open()) {qDebug() << "Error:" << db.lastError();return;
}
QSqlQuery query;
query.exec("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)");
db.close();
3、躺平舒服,行动更酷
1、创建目录
在项目根目录下创建目录sqlite3的目的是分类管理文件资源,而不是一大堆文件放在根目录下,显得乱七八糟的,连接数据库采用的是sqlite这种类型的数据库,它是内存数据库,效率高,前面第一个文章介绍过,采用的是sqlite3,怎么获取配置可以百度或我。
2、修改配置
3、添加新文件
要注意的这里添加文件类型是C++类,而不是QT选项中的类型
4、添加方法
5、实现方法
实现头文件中某个方法的快捷键是alt+enter,会弹出一个窗体,一看就明白
#ifndef SQLITE3DB_H
#define SQLITE3DB_H
#include <QDateTime>
#include <QObject>// 定义一个结构--表示用户
typedef struct {quint32 id; // 用户IdQByteArray icon; // 用户图标QString username; // 用户名QString password; // 密码QString name; // 名称int gender; // 性别QString addr; // 地址QString phoneNo; // 手机号
} OperatorInfo;class Sqlite3Db
{
public:Sqlite3Db();
public:bool isContain(QString userName, QString passWord, OperatorInfo &infos); //根据用户和密码判断是否存在};#endif // SQLITE3DB_H
#include "sqlite3db.h"
#include <QDebug>
#include <QtSql>
#include <QSqlDatabase>
#include <QSqlQuery>Sqlite3Db::Sqlite3Db() {}// Qt访问Sqlite的步骤:
// 1. 引入一个模块 QT += core gui sql
// 2. 引入头文件
// 3. 使用QSqlDatabase 来进行操作// 根据用户名和密码来判断,当前的用户是否存在Sqlite数据库中
bool Sqlite3Db::isContain(QString userName, QString passWord, OperatorInfo &infos) {QSqlDatabase db;db.setHostName("localhost");//设置主机名db = QSqlDatabase::addDatabase("QSQLITE");//添加数据库类型db.setDatabaseName("warehouse.db"); // 设置数据库名称bool isOpen = db.open();//打开连接//输出错误信息qDebug() << isOpen ;qDebug() << db.isValid(); // trueqDebug() << db.isOpen(); // true// 1.准备查询QSqlQuery 对象QSqlQuery query(db);// 2. 准备Sql语句? :占位符---避免sql注入QString sqlCmd = QString("SELECT * from operatorInfo where username=? and password=?");// 3.准备参数化占位符的数据query.prepare(sqlCmd);query.bindValue(0, userName);query.bindValue(1, passWord);//4.开始执行语句bool success = query.exec();if (success == false) {db.close(); // 网络资源,需要回收return false;}if (query.next() == false) {db.close(); // 网络资源,需要回收return false;}// 如果继续往后执行,就是已经买查询到对象了,返回这个对象的每个属性值OperatorInfo i;i.id = query.value(0).toInt();i.icon = query.value(1).toByteArray();i.username = query.value(2).toString();i.password = query.value(3).toString();i.addr = query.value(4).toString();i.gender = query.value(5).toInt();i.name = query.value(6).toString();i.phoneNo = query.value(7).toString();infos = i;db.close();return true;
}
6、完善登录
#include "loginwin.h"
#include "ui_loginwin.h"
#include <QPushButton>
#include <QDebug>
#include <QPainter>
#include <QRandomGenerator>
#include <sqlite3/sqlite3db.h>
#include <QMessageBox>LoginWin::LoginWin(QWidget *parent): QWidget(parent), ui(new Ui::LoginWin)
{ui->setupUi(this);//设置密码框的字符显示ui->editpass->setEchoMode(QLineEdit::Password);//创建基类窗体对象if(m_baseWind==nullptr){m_baseWind=new BaseWin(parent);}// m_baseWind->resize(600,200);m_baseWind->setContentWidget(this);//将当前登录窗体放到基类的内容控件中m_baseWind->setTitle("用户登录");QPushButton *login=m_baseWind->getButton();if(login==nullptr){return;}else{login->setText("登录系统");//绑定单击和槽函数connect(login,&QPushButton::clicked,this,&LoginWin::onLogin);}//初始化面板样式ui->edituser->setPlaceholderText("请输入您的帐号");ui->editpass->setPlaceholderText("请输入您的密码");ui->editcode->setPlaceholderText("请输入验证码");//默认隐藏错误提示,字体样式为红色ui->msguser->setStyleSheet("color:red");ui->msguser->hide();ui->msgpass->setStyleSheet("color:red");ui->msgpass->hide();ui->msgcode->setStyleSheet("color:red");ui->msgcode->hide();// 二维码初始化m_captcha = getCaptcha();}LoginWin::~LoginWin()
{delete ui;
}//登录
void LoginWin::onLogin()
{//获取验证码QString verCode=ui->editcode->text();//校验证用户名不能为空QString username = ui->edituser->text();if (username.isNull() || username.isEmpty()) {ui->msguser->setText("请输入用户名");ui->msguser->show();return;}//校验证密码不能为空QString password = ui->editpass->text();if (password.isNull() || password.isEmpty()) {ui->msgpass->setText("请输入密码");ui->msgpass->show();//initVerCode();return;}//校验验证码不能为空if(verCode.isNull()||verCode.isEmpty()){ui->msgcode->setText("验证码不能为空");ui->msgcode->show();return;}//校验验证码是否正确if (m_captcha.compare(verCode, Qt::CaseInsensitive)) {ui->msgcode->setText("验证码错误");ui->msgcode->show();return;}//连接数据库Sqlite3Db db;OperatorInfo user;bool success=db.isContain(username,password,user);//信息提示if(success){QMessageBox::information(this,"信息提示","登录成功,欢迎使用本系统.");}else{QMessageBox::critical(this,"错误提示","帐号或密码错误!");}}//显示窗体
void LoginWin::showLogin()
{m_baseWind->show();//调用基类的显示方法
}// 绘图--绘制验证码
void LoginWin::paintEvent(QPaintEvent *event) {QPainter painter(this);// 填充背景为白色painter.fillRect(ui->Codelab->x() + ui->widgetVer->x(),ui->Codelab->y() + ui->widgetVer->y(),ui->Codelab->width(),ui->Codelab->height(), Qt::white);// 设置字体样式painter.setFont(QFont("Lucida Console", 20, QFont::Bold));// 绘制验证码字符for (int i = 0; i < 4; i++) {QColor color = generateRandomColor(); // 随机获取颜色// 生成随机颜色QPen pen(color);pen.setWidth(1);painter.setPen(pen);painter.drawText(ui->Codelab->x() + ui->widgetVer->x() + 20 * i,ui->Codelab->y() + ui->widgetVer->y(), 20,ui->Codelab->height(), Qt::AlignCenter,QString(m_captcha[i]));}// 绘制噪点for (int i = 0; i < 400; i++) {QColor color = generateRandomColor();// 生成随机颜色QPen pen(color);pen.setWidth(1);painter.setPen(pen);painter.drawPoint(ui->Codelab->x() + ui->widgetVer->x() +(rand() % ui->Codelab->width()),ui->Codelab->y() + ui->widgetVer->y() +(rand() % ui->Codelab->height()));}// 注册事件过滤器ui->Codelab->installEventFilter(this);
}// 在字符串中随机获取四个字符
QString LoginWin::getCaptcha() {const QString possibleCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";const int captchaLength = 4;QString result = "";// 生成验证码字符串for (int i = 0; i < captchaLength; ++i) {int index = QRandomGenerator::global()->bounded(possibleCharacters.length());// 生成一个0到possibleCharacters长度之间的随机整数result.append(possibleCharacters.at(index));// 将随机位置的字符添加到结果字符串中}return result;
}// 刷新验证码
void LoginWin::initVerCode() {m_captcha = getCaptcha(); // 获取新的验证码m_color = generateRandomColor(); // 生成随机颜色repaint(); // 重新绘制窗口update();ui->Codelab->setText("");
}// 随机获取颜色
QColor LoginWin::generateRandomColor() {int red = QRandomGenerator::global()->bounded(256);// 生成0到255之间的随机整数作为红色通道的值int green = QRandomGenerator::global()->bounded(256);// 生成0到255之间的随机整数作为绿色通道的值int blue = QRandomGenerator::global()->bounded(256);// 生成0到255之间的随机整数作为蓝色通道的值return QColor(red, green, blue);// 使用生成的RGB值创建并返回一个QColor对象
}// 事件过滤器
bool LoginWin::eventFilter(QObject *obj, QEvent *event) {if (event->type() == QEvent::MouseButtonPress) {if (obj == ui->Codelab) {// 初始化,重新生成验证码initVerCode();return false;}}return false;
}
7、sqlitestudio介绍
SQLiteStudio 是一款免费开源的跨平台 SQLite 数据库管理工具,提供图形化界面简化数据库操作以下是其核心功能与特点:
核心功能
数据库管理
- 支持创建、连接、导出/导入数据库文件,并提供备份与还原功能。
- 可通过右键菜单或工具栏快速操作数据库(如新建表、修改表结构)。
数据操作
- 支持浏览、编辑表数据,并提供导入/导出功能(格式包括 CSV、SQL、XML 等)。
- 支持二进制字段的查看与编辑。
SQL 支持
- 内置高级 SQL 编辑器,提供语法高亮、自动补全、错误检查及历史记录功能。
- 支持跨数据库查询,可同时操作多个数据库文件。
扩展功能
- 支持加密数据库(如 SQLCipher)和自定义 SQL 函数(通过 JavaScript/Python 实现)。
- 提供事务处理、日志查看及权限管理工具。
特点与优势
- 跨平台:兼容 Windows、Linux、macOS,提供免安装便携版本。
- 轻量高效:界面简洁,资源占用低,适合嵌入式或移动开发场景。
- 开源免费:基于 GPLv3 协议,可商用且代码开放。
使用示例
- 导出表数据:选择表 → 点击“导出数据” → 设置格式(如 CSV)。
- 创建表:右键数据库 → 选择“Create Table” → 定义列名、数据类型及主键
这里介绍一下SQLiteStudio,这是连接sqlite数据库的客户端图形工具,有很多工具可以连接sqlite数据库,这里就不举例了,反正能连接使用操作就行。
4、运行效果
原创不易,打字不易,截图不易,撸码不易,整理不易,走过路过,不要错过,欢迎点赞,收藏,转载,复制,抄袭,留言,灌水,动动你的金手指,祝您早日实现财务自由。