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
Directorio de artículos
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
提示:以下是本篇文章正文内容,下面案例可供参考
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
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.