系列文章目录
提示:这里是该系列文章的所有文章的目录
第一章: Qt连接Sqlite3并使用Qtableview实时显示数据,重写QSqlQueryModel实现文本居中
第二章: Qt下使用Sqlite数据库实现图片的读写显示
文章目录
- 系列文章目录
- 前言
- 一、初始化数据库
- 二、获取图像数据
- 三、查找指定图像
- 四、示例完整代码
- 四、下载链接
- 总结
前言
在本系列文章的上一篇文章中,有对在Qt中使用Sqlite3数据库的相关介绍及配置,使用起来也是比较方便的,详情可以点击目录链接查看。在Qt中使用Sqlite数据库可以保存很多类型的数据,其中还可以用来保存图像,这里对图像的保存和读取显示功能进行讲述,并将相关代码展现出来以便大家学习,如有错误之处,欢迎大家批评指正。
项目效果
提示:以下是本篇文章正文内容,下面案例可供参考
一、初始化数据库
在构造函数内以当天日期为名称创建数据库并打开,同时创建名为imageTable的数据表,在表中添加了id、name(图像名)、data(图像数据)、timestamp(时间戳)四个数据,其中id会跟随插入的数据量自动递增,后面的查找功能也是通过查找id来实现的。
//以当天日期为名称创建数据库并打开
QString dbName = QDate::currentDate().toString("yyyyMMdd") + ".db";
m_db = QSqlDatabase::addDatabase("QSQLITE");
m_db.setDatabaseName(dbName);
if(!m_db.open())
{
QMessageBox::information(this,"提示",m_db.lastError().text());
return;
}
//创建名为imageTable的数据表
QSqlQuery query(m_db);
if(!query.exec("CREATE TABLE IF NOT EXISTS imageTable (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, data BLOB, timestamp TEXT)"))
{
QMessageBox::information(this,"提示",query.lastError().text());
return;
}
二、获取图像数据
这里使用了模拟添加图像的方式来获取图像数据,打开指定文件夹并选中其中的图像,将图像保存到数据库。
//从文件夹获取图像数据
void Widget::on_pb_getImage_clicked()
{
//选择图像
QString fileName = QFileDialog::getOpenFileName(this,"open file dialog","D:/QT/Project/my_Project/28_iamgeSqlite","jpg files(*.jpg)");
if(fileName == "")
{
return;
}
//获取图像名
m_imageName = QFileInfo(fileName).fileName();
ui->lb_name->setText(m_imageName);
//界面显示
QImage image;
image.load(fileName);
ui->lb_image->setPixmap((QPixmap::fromImage(image)).scaled(ui->lb_image->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));
//获取图像数据
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly))
{
QMessageBox::information(this,"提示",file.errorString());
return;
}
m_imageData = file.readAll();
file.close();
}
//保存图像到数据库
void Widget::on_pb_saveDb_clicked()
{
QString timestamp = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
ui->lb_dateTime->setText(timestamp);
//插入图像和时间戳
QSqlQuery query(m_db);
query.prepare("INSERT INTO imageTable (name, data, timestamp) VALUES (:name, :data, :timestamp)");
query.bindValue(":name",m_imageName);
query.bindValue(":data",m_imageData);
query.bindValue(":timestamp",timestamp);
if(!query.exec())
{
QMessageBox::information(this,"提示",query.lastError().text());
return;
}
else
{
QMessageBox::information(this,"提示","保存成功!");
}
}
三、查找指定图像
这里使用了SELECT查找语句,根据数据表中的id来进行指定图像的查找,获取图像数据及各参数并显示在界面上,更多SQL语句可以查看本系列上一篇文章中的参考文章,有详细的SQLite教程。
//根据id提取图像
void Widget::getImageData(int id)
{
QSqlQuery query(m_db);
if(!query.exec(QString("SELECT name, data, timestamp FROM imageTable WHERE id = %1").arg(id)))
{
QMessageBox::information(this,"提示",query.lastError().text());
return;
}
if(query.next())
{
//图像名
QString imageName = query.value(0).toString();
ui->lb_name->setText(imageName);
//显示图像
QByteArray imageData = query.value(1).toByteArray();
QPixmap pixmap;
if(pixmap.loadFromData(imageData))
{
ui->lb_image->setPixmap(pixmap.scaled(ui->lb_image->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));
}
//时间戳
QString timestamp = query.value(2).toString();
ui->lb_dateTime->setText(timestamp);
}
}
四、示例完整代码
别忘记在Qt项目文件(.pro文件)中,加入SQL模块哦!(QT += sql)
1.widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QFile>
#include <QFileDialog>
#include <QDateTime>
#include <QMessageBox>
#include <QDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
void initWidget();
void getImageData(int id);
private slots:
void on_pb_getImage_clicked();
void on_pb_saveDb_clicked();
void on_pb_find_clicked();
void on_pb_last_clicked();
void on_pb_next_clicked();
private:
Ui::Widget *ui;
QSqlDatabase m_db; //数据库对象
QString m_imageName; //图像名
QByteArray m_imageData; //图像数据
};
#endif // WIDGET_H
2.widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->initWidget();
}
Widget::~Widget()
{
delete ui;
}
//初始化界面
void Widget::initWidget()
{
//初始化变量
m_imageName = "";
m_imageData = "";
//以当天日期为名称创建数据库并打开
QString dbName = QDate::currentDate().toString("yyyyMMdd") + ".db";
m_db = QSqlDatabase::addDatabase("QSQLITE");
m_db.setDatabaseName(dbName);
if(!m_db.open())
{
QMessageBox::information(this,"提示",m_db.lastError().text());
return;
}
//创建名为imageTable的数据表
QSqlQuery query(m_db);
if(!query.exec("CREATE TABLE IF NOT EXISTS imageTable (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, data BLOB, timestamp TEXT)"))
{
QMessageBox::information(this,"提示",query.lastError().text());
return;
}
}
//根据id提取图像
void Widget::getImageData(int id)
{
QSqlQuery query(m_db);
if(!query.exec(QString("SELECT name, data, timestamp FROM imageTable WHERE id = %1").arg(id)))
{
QMessageBox::information(this,"提示",query.lastError().text());
return;
}
if(query.next())
{
//图像名
QString imageName = query.value(0).toString();
ui->lb_name->setText(imageName);
//显示图像
QByteArray imageData = query.value(1).toByteArray();
QPixmap pixmap;
if(pixmap.loadFromData(imageData))
{
ui->lb_image->setPixmap(pixmap.scaled(ui->lb_image->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));
}
//时间戳
QString timestamp = query.value(2).toString();
ui->lb_dateTime->setText(timestamp);
}
}
//从文件夹获取图像数据
void Widget::on_pb_getImage_clicked()
{
//选择图像
QString fileName = QFileDialog::getOpenFileName(this,"open file dialog","D:/QT/Project/my_Project/28_iamgeSqlite","jpg files(*.jpg)");
if(fileName == "")
{
return;
}
//获取图像名
m_imageName = QFileInfo(fileName).fileName();
ui->lb_name->setText(m_imageName);
//界面显示
QImage image;
image.load(fileName);
ui->lb_image->setPixmap((QPixmap::fromImage(image)).scaled(ui->lb_image->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));
//获取图像数据
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly))
{
QMessageBox::information(this,"提示",file.errorString());
return;
}
m_imageData = file.readAll();
file.close();
}
//保存图像到数据库
void Widget::on_pb_saveDb_clicked()
{
QString timestamp = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
ui->lb_dateTime->setText(timestamp);
//插入图像和时间戳
QSqlQuery query(m_db);
query.prepare("INSERT INTO imageTable (name, data, timestamp) VALUES (:name, :data, :timestamp)");
query.bindValue(":name",m_imageName);
query.bindValue(":data",m_imageData);
query.bindValue(":timestamp",timestamp);
if(!query.exec())
{
QMessageBox::information(this,"提示",query.lastError().text());
return;
}
else
{
QMessageBox::information(this,"提示","保存成功!");
}
}
//查找指定图像
void Widget::on_pb_find_clicked()
{
//判断是否输入正确
int id = ui->le_id->text().toInt();
//获取图像数
QSqlQuery query(m_db);
query.exec("SELECT COUNT(id) FROM imageTable");
query.next();
int idMax = query.value(0).toInt();
qDebug()<<idMax;
if(id < 1)
{
getImageData(1);
ui->le_id->setText(QString::number(1));
QMessageBox::information(this,"提示","id超限!");
}
else if(id > idMax)
{
getImageData(idMax);
ui->le_id->setText(QString::number(idMax));
QMessageBox::information(this,"提示","id超限!");
}
else
{
getImageData(idMax);
}
}
//上一张
void Widget::on_pb_last_clicked()
{
int id = ui->le_id->text().toInt();
if(id <= 1)
{
getImageData(1);
ui->le_id->setText(QString::number(1));
QMessageBox::information(this,"提示","当前图像为第一张!");
return;
}
int idLast = id-1;
getImageData(idLast);
ui->le_id->setText(QString::number(idLast));
}
//下一张
void Widget::on_pb_next_clicked()
{
//获取图像数
QSqlQuery query(m_db);
query.exec("SELECT COUNT(id) FROM imageTable");
query.next();
int idMax = query.value(0).toInt();
int id = ui->le_id->text().toInt();
if(id >= idMax)
{
getImageData(idMax);
ui->le_id->setText(QString::number(idMax));
QMessageBox::information(this,"提示","当前图像为最后一张!");
return;
}
int idNext = id+1;
getImageData(idNext);
ui->le_id->setText(QString::number(idNext));
}
3.widget.ui
四、下载链接
我的示例百度网盘链接:https://pan.baidu.com/s/1RmVG4FQFI9NIe9T4clTRVQ
提取码:xxcj
总结
本文实现了Qt下使用Sqlite数据库来进行图像的数据保存及读取,demo实现使用的sql语句也是比较简单的,实际项目的话会比较复杂,所以我们还是需要不断的学习,以此掌握更多SQLite的知识技能。
hello:
共同学习,共同进步,如果还有相关问题,可在评论区留言进行讨论。