Qt下使用Sqlite数据库实现图像的读写显示

系列文章目录

提示:这里是该系列文章的所有文章的目录
第一章: 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:
共同学习,共同进步,如果还有相关问题,可在评论区留言进行讨论。

  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值