Qt上でSqliteデータベースを利用して画像の読み書き表示を実現する

シリーズ記事ディレクトリ

提示:这里是该系列文章的所有文章的目录
第1章:QtをSqlite3に接続しQtableviewを使ってデータをリアルタイム表示、QSqlQueryModelを書き換えてテキストセンタリングを実現
第2章:Qt上でSqliteデータベースを使って画像の読み書き表示を実現



序文

このシリーズの前回の記事では、Qt で Sqlite3 データベースを使用する方法の紹介と設定があり、これも比較的便利に使用できます。詳細については、カタログのリンクをクリックしてご覧ください。Qt で Sqlite データベースを使用すると、さまざまな種類のデータを保存でき、画像の保存にも使用できます。ここでは、画像の保存、読み取り、表示の機能を説明し、誰もが学習できるように関連するコードを表示します。間違いがあれば、ご連絡ください。批判や修正を歓迎します。

事業効果
画像の説明を追加してください


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

1. データベースを初期化する

コンストラクターでその日の日付を入れたデータベースを作成して開き、同時にimageTableという名前のデータテーブルを作成し、そこにid、name(画像名)、data(画像データ)、timestamp(タイムスタンプ)を追加します。 table. では、挿入されたデータの量に応じて自動的に 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;
}

2.画像​​データを取得する

ここでは、画像の追加をシミュレートする方法を使用して、画像データを取得し、指定したフォルダーを開いてその中の画像を選択し、データベースに画像を保存します。

//从文件夹获取图像数据
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. 指定した画像を検索します

ここでは、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);
    }
}

4. 完全なコードの例

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.ウィジェット.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.ウィジェット.ui
画像の説明を追加してください

4. ダウンロードリンク

私の Baidu ネットワーク ディスク リンクの例: https://pan.baidu.com/s/1RmVG4FQFI9NIe9T4clTRVQ
抽出コード: xxcj


要約する

この記事では、Qt 上で Sqlite データベースを使用して画像データの保存と読み取りを実現します。デモの実装で使用される SQL ステートメントは比較的単純ですが、実際のプロジェクトはより複雑になるため、SQLite をさらに習得するために引き続き学習する必要があります。知識とスキル。


こんにちは:
一緒に学び、一緒に進歩しましょう。関連する質問がまだある場合は、ディスカッションのためにコメント領域にメッセージを残すことができます。

おすすめ

転載: blog.csdn.net/XCJandLL/article/details/131009962