Qt使用SQLite數(shù)據(jù)庫(kù)存儲(chǔ)管理圖片文件
1、效果演示
1)增刪改查效果

2)數(shù)據(jù)庫(kù)內(nèi)容


2、創(chuàng)建數(shù)據(jù)庫(kù)及表格
2.1 創(chuàng)建數(shù)據(jù)庫(kù)
首先在.pro文件添加對(duì)sql的支持:QT += core gui sql
QString g_connectName = "mySQL_connection";
bool MainWindow::createDatabase()
{
//檢測(cè)已連接的方式 - 自定義連接名
if(QSqlDatabase::contains(g_connectName))
{
m_Projdb = QSqlDatabase::database(g_connectName);
}
else
{
m_Projdb = QSqlDatabase::addDatabase("QSQLITE",g_connectName);
//設(shè)置數(shù)據(jù)庫(kù)路徑
QString sDir = QApplication::applicationDirPath();
QString sDataPath = sDir + "/mySql.db";
m_Projdb.setDatabaseName(sDataPath);
}
//打開數(shù)據(jù)庫(kù)
if(!m_Projdb.open())
{
QMessageBox::information(this,"提示","數(shù)據(jù)庫(kù)創(chuàng)建失敗,無(wú)法打開!");
return false;
}
// 創(chuàng)建表格
createImageTable();
//關(guān)閉數(shù)據(jù)庫(kù)
m_Projdb.close();
return true;
}
2.2 創(chuàng)建數(shù)據(jù)庫(kù)表格
bool MainWindow::createImageTable()
{
…………………………
//如果不存在則創(chuàng)建my_table表,id自增,name唯一
const QString cmdSql = R"(
CREATE TABLE IF NOT EXISTS image_table (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
imagename TEXT NOT NULL,
type CHAR(50) NOT NULL,
notes TEXT,
imagedata BLOB NOT NULL
);)";
//QSqlQuery構(gòu)造前,需要db已打開并連接;未指定db或者db無(wú)效時(shí)使用默認(rèn)連接進(jìn)行操作
QSqlQuery myQuery(m_Projdb);
if(!myQuery.exec(cmdSql))
{
QString sError = myQuery.lastError().text();
sError = "數(shù)據(jù)庫(kù)表格插入數(shù)據(jù)失敗:" + sError;
QMessageBox::information(this,"提示",sError);
m_Projdb.close();
return false;
}
…………………………
return true;
}
3、增刪改查
3.1 增加記錄
void MainWindow::on_pushBtn_add_clicked()
{
QString strImag = ui->lineEdit_file->text();
QFileInfo fileInfo(strImag);
………………
QString sName = fileInfo.fileName();
QString sType = fileInfo.suffix();
QString strNote = ui->plainTextEdit_add->toPlainText();
if(ImageFileExist(sName))
{
QMessageBox::information(this,"提示","圖片文件已經(jīng)存在!");
return;
}
//將數(shù)據(jù)轉(zhuǎn)換為QByteArray類型存儲(chǔ)到數(shù)據(jù)庫(kù)中
QFile* pFile = new QFile(strImag);
pFile->open(QIODevice::ReadOnly);
QByteArray imageData = pFile->readAll();
pFile->fileName();
pFile->close();
if(!m_Projdb.open())
{
QMessageBox::information(this,"提示","數(shù)據(jù)庫(kù)無(wú)法打開!");
return;
}
//QSqlQuery構(gòu)造前,需要db已打開并連接;未指定db或者db無(wú)效時(shí)使用默認(rèn)連接進(jìn)行操作
QSqlQuery myQuery(m_Projdb);
QString cmdSql = "insert into image_table(imagename,type,notes,imagedata) values( '%1','%2','%3',:imagedata)";
cmdSql = QString(cmdSql).arg(sName).arg(sType).arg(strNote);
qDebug() << cmdSql;
myQuery.prepare(cmdSql);
myQuery.bindValue(":imagedata",imageData);
if(!myQuery.exec())
{
QString sError = myQuery.lastError().text();
sError = "數(shù)據(jù)庫(kù)表格插入數(shù)據(jù)失敗:" + sError;
QMessageBox::information(this,"提示",sError);
m_Projdb.close();
return;
}
QMessageBox::information(this,"提示","添加成功!");
m_Projdb.close();
// 刷新界面
…………………………
}
3.2 刪除記錄
void MainWindow::on_pushBtn_del_clicked()
{
…………………………
//QSqlQuery構(gòu)造前,需要db已打開并連接;未指定db或者db無(wú)效時(shí)使用默認(rèn)連接進(jìn)行操作
QSqlQuery myQuery(m_Projdb);
QString cmdSql = "DELETE from image_table where imagename = '%1'";
cmdSql = QString(cmdSql).arg(sFileName);
qDebug() << cmdSql;
if(!myQuery.exec(cmdSql))
{
QString sError = myQuery.lastError().text();
sError = "數(shù)據(jù)庫(kù)表格刪除數(shù)據(jù)失敗:" + sError;
QMessageBox::information(this,"提示",sError);
m_Projdb.close();
return;
}
…………………………
// 刷新界面
………………………………
}
3.3 修改記錄
void MainWindow::on_pushBtn_modify_clicked()
{
……………………
QString sNote = dlg.GetNoteString();
QSqlQuery myQuery(m_Projdb);
QString cmdSql = "UPDATE image_table SET notes = '%2' where imagename = '%1'";
cmdSql = QString(cmdSql).arg(sFileName).arg(sNote);
…………………………
// 刷新界面
…………………………
}
3.4 查找記錄
void MainWindow::on_pushBtn_preview_clicked()
{
………………………………
//QSqlQuery構(gòu)造前,需要db已打開并連接;未指定db或者db無(wú)效時(shí)使用默認(rèn)連接進(jìn)行操作
QSqlQuery myQuery(m_Projdb);
QString cmdSql = "select * from image_table where imagename = '%1'";
cmdSql = QString(cmdSql).arg(sFileName);
qDebug() << cmdSql;
if(!myQuery.exec(cmdSql))
{
QString sError = myQuery.lastError().text();
sError = "數(shù)據(jù)庫(kù)表格查詢數(shù)據(jù)失敗:" + sError;
QMessageBox::information(this,"提示",sError);
m_Projdb.close();
return;
}
while (myQuery.next())
{
QString strFileName = myQuery.value(1).toString();
QString strFileType = myQuery.value(2).toString();
QString strNote = myQuery.value(3).toString();
QByteArray bytes = myQuery.value(4).toByteArray();
QBuffer buffer(&bytes);
buffer.open(QIODevice::ReadOnly);
QImageReader reader(&buffer,strFileType.toLatin1());
QImage img = reader.read();
img.save(strFileName);
break;
}
m_Projdb.close();
}
3.5 遍歷表格記錄
bool MainWindow::GetAllImageRecord()
{
………………………………
// 查詢表格數(shù)據(jù)
const QString cmdSql = R"(SELECT * FROM image_table;)";
//QSqlQuery構(gòu)造前,需要db已打開并連接;未指定db或者db無(wú)效時(shí)使用默認(rèn)連接進(jìn)行操作
QSqlQuery myQuery(m_Projdb);
if(!myQuery.exec(cmdSql))
{
QString sError = myQuery.lastError().text();
sError = "數(shù)據(jù)庫(kù)表格插入數(shù)據(jù)失敗:" + sError;
QMessageBox::information(this,"提示",sError);
m_Projdb.close();
return false;
}
while (myQuery.next())
{
QString sFileName, sFileType,sNotes;
for (int i = 0; i < myQuery.record().count(); i++)
{
QString strFieldName = myQuery.record().fieldName(i);
QVariant value = myQuery.record().value(i);
if(strFieldName == "imagename")
{
QString strValue = value.toString();
sFileName = strValue;
}
if(strFieldName == "type")
{
QString strValue = value.toString();
sFileType = strValue;
}
if(strFieldName == "notes")
{
QString strValue = value.toString();
sNotes = strValue;
}
}
if (!sFileName.isEmpty() && !sFileType.isEmpty())
{
FileInfo fileInfo;
fileInfo.sName = sFileName;
fileInfo.sType = sFileType;
fileInfo.sNotes = sNotes;
m_vecImageFile.push_back(fileInfo);
}
}
…………………………
}
到此這篇關(guān)于Qt使用SQLite數(shù)據(jù)庫(kù)存儲(chǔ)管理圖片文件的文章就介紹到這了,更多相關(guān)Qt SQLite管理圖片文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C/C++ Qt 基本文件讀寫的基本使用(2種實(shí)現(xiàn))
文件的讀寫是很多應(yīng)用程序具有的功能,本文主要介紹了兩種實(shí)現(xiàn)方法,第一種使用QFile類的IODevice讀寫功能直接讀寫,第二種是利用 QFile和QTextStream結(jié)合起來(lái),用流的方式進(jìn)行文件讀寫2021-11-11
Matlab實(shí)現(xiàn)簡(jiǎn)易紀(jì)念碑谷游戲的示例代碼
《紀(jì)念碑谷》是USTWO公司開發(fā)制作的解謎類手機(jī)游戲,在游戲中,通過(guò)探索隱藏小路、發(fā)現(xiàn)視力錯(cuò)覺以及躲避神秘的烏鴉人來(lái)幫助沉默公主艾達(dá)走出紀(jì)念碑迷陣。本文將用Matlab編寫簡(jiǎn)易版的紀(jì)念碑谷游戲,感興趣的可以了解一下2022-03-03
C++求1到n中1出現(xiàn)的次數(shù)以及數(shù)的二進(jìn)制表示中1的個(gè)數(shù)
這篇文章主要介紹了C++求1到n中1出現(xiàn)的次數(shù)以及數(shù)的二進(jìn)制表示中1的個(gè)數(shù),兩道基礎(chǔ)的算法題目,文中也給出了解題思路,需要的朋友可以參考下2016-02-02

