シリーズ記事ディレクトリ
提示:这里是该系列文章的所有文章的目录
第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 をさらに習得するために引き続き学習する必要があります。知識とスキル。
こんにちは:
一緒に学び、一緒に進歩しましょう。関連する質問がまだある場合は、ディスカッションのためにコメント領域にメッセージを残すことができます。