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)建失敗,無法打開!"); 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無效時(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ù)無法打開!"); return; } //QSqlQuery構(gòu)造前,需要db已打開并連接;未指定db或者db無效時(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無效時(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無效時(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無效時(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é)合起來,用流的方式進(jìn)行文件讀寫2021-11-11Matlab實(shí)現(xiàn)簡(jiǎn)易紀(jì)念碑谷游戲的示例代碼
《紀(jì)念碑谷》是USTWO公司開發(fā)制作的解謎類手機(jī)游戲,在游戲中,通過探索隱藏小路、發(fā)現(xiàn)視力錯(cuò)覺以及躲避神秘的烏鴉人來幫助沉默公主艾達(dá)走出紀(jì)念碑迷陣。本文將用Matlab編寫簡(jiǎn)易版的紀(jì)念碑谷游戲,感興趣的可以了解一下2022-03-03C++求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