Uso de la base de datos Sqlite en Qt para realizar la visualización de lectura y escritura de imágenes

Directorio de artículos de la serie

提示:这里是该系列文章的所有文章的目录
Capítulo 1: Conecte Qt a Sqlite3 y use Qtableview para mostrar datos en tiempo real, reescriba QSqlQueryModel para realizar el centrado de texto
Capítulo 2: Use la base de datos Sqlite en Qt para realizar la visualización de lectura y escritura de imágenes



prefacio

En el último artículo de esta serie de artículos, hay introducciones y configuraciones relacionadas para usar la base de datos Sqlite3 en Qt, que también es relativamente conveniente de usar. Para obtener más detalles, haga clic en el enlace del catálogo para ver. El uso de la base de datos Sqlite en Qt puede guardar muchos tipos de datos, y también se puede usar para guardar imágenes. Aquí describiremos las funciones de guardar, leer y mostrar imágenes, y mostraremos los códigos relevantes para que todos los aprendan. Si hay cualquier error, por favor contáctenos Bienvenidos todos a criticar y corregir.

Efecto del proyecto
Por favor agregue una descripción de la imagen


提示:以下是本篇文章正文内容,下面案例可供参考

1. Inicializar la base de datos

En el constructor, cree una base de datos con la fecha del día como nombre y ábrala, y cree una tabla de datos llamada imageTable al mismo tiempo, agregue id, nombre (nombre de la imagen), datos (datos de la imagen) y marca de tiempo ( marca de tiempo) a la tabla. , donde la identificación aumentará automáticamente con la cantidad de datos insertados, y la función de búsqueda posterior también se realiza buscando la identificación.

//以当天日期为名称创建数据库并打开
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;
}

2. Obtener datos de imagen

Aquí, el método de simulación de agregar imágenes se usa para obtener datos de imágenes, abrir la carpeta especificada y seleccionar las imágenes en ella, y guardar las imágenes en la base de datos.

//从文件夹获取图像数据
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,"提示","保存成功!");
    }
}

3. Encuentra la imagen especificada

La declaración de búsqueda SELECT se usa aquí para buscar la imagen especificada de acuerdo con la identificación en la tabla de datos, obtener los datos de la imagen y varios parámetros y mostrarlos en la interfaz. Para obtener más declaraciones SQL, consulte el artículo de referencia en el artículo anterior. artículo de esta serie Tutorial detallado de 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);
    }
}

4. Ejemplo de código completo

¡No olvide agregar el módulo SQL en el archivo de proyecto Qt (archivo .pro)! (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
Por favor agregue una descripción de la imagen

4. Enlace de descarga

Mi ejemplo de enlace de disco de red Baidu: https://pan.baidu.com/s/1RmVG4FQFI9NIe9T4clTRVQ
Código de extracción: xxcj


Resumir

Este artículo se da cuenta del uso de la base de datos Sqlite bajo Qt para guardar y leer datos de imagen. La instrucción sql utilizada en la implementación de demostración es relativamente simple, pero el proyecto real será más complicado, por lo que aún debemos seguir aprendiendo a dominar más SQLite. conocimientos y habilidades.


hola:
Aprendamos juntos y progresemos juntos. Si aún tiene preguntas relacionadas, puede dejar un mensaje en el área de comentarios para la discusión.

Supongo que te gusta

Origin blog.csdn.net/XCJandLL/article/details/131009962
Recomendado
Clasificación