最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt使用SQLite數(shù)據(jù)庫(kù)存儲(chǔ)管理圖片文件

 更新時(shí)間:2023年04月14日 10:50:30   作者:歐特克_Glodon  
這篇文章主要為大家詳細(xì)介紹了Qt如何使用SQLite數(shù)據(jù)庫(kù)實(shí)現(xiàn)存儲(chǔ)管理圖片文件的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下

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語(yǔ)言詳細(xì)講解const的用法

    C語(yǔ)言詳細(xì)講解const的用法

    今天探討const,首先來(lái)說(shuō)是將變量常量化。為什么要將變量常量化,原因有諸多好處有諸多。比如可以使數(shù)據(jù)更加安全不會(huì)被修改
    2022-05-05
  • 電腦開機(jī)時(shí)間的計(jì)算代碼

    電腦開機(jī)時(shí)間的計(jì)算代碼

    這幾天我琢磨著一件事,那就是怎么計(jì)算我的PC從開機(jī)到現(xiàn)在的總時(shí)間。終于,看看這個(gè)函數(shù):GetTickCount();
    2013-05-05
  • C++中的STL常用算法之遍歷算法詳解

    C++中的STL常用算法之遍歷算法詳解

    這篇文章主要介紹了C++中的STL常用算法之遍歷算法詳解,ransform() 可以將函數(shù)應(yīng)用到容器的元素上,并將這個(gè)函數(shù)返回的值保存到另一個(gè)容器中,它返回的迭代器指向輸出容器所保存的最后一個(gè)元素的下一個(gè)位置,需要的朋友可以參考下
    2023-12-12
  • 深入淺析STL vector用法

    深入淺析STL vector用法

    這篇文章給大家介紹 stl vector用法,主要知識(shí)點(diǎn)在如何恰當(dāng)?shù)氖褂盟鼈兊某蓡T函數(shù),涉及到條件函數(shù)和函數(shù)指針在迭代算法中的使用,對(duì)stl vector用法感興趣的朋友可以參考下本文
    2015-10-10
  • C,C++中常用的操作字符串的函數(shù)

    C,C++中常用的操作字符串的函數(shù)

    這篇文章主要介紹了C,C++中常用的操作字符串的函數(shù),需要的朋友可以參考下
    2017-09-09
  • C 轉(zhuǎn)移表/轉(zhuǎn)換表的深入分析

    C 轉(zhuǎn)移表/轉(zhuǎn)換表的深入分析

    本篇文章是對(duì)c語(yǔ)言中轉(zhuǎn)移表/轉(zhuǎn)換表進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++while和do-while語(yǔ)句求和詳解

    C++while和do-while語(yǔ)句求和詳解

    對(duì)于C語(yǔ)言中的while與do-while,相信很多都再熟悉不過了,最近在工作中就用到了,所以想著總結(jié)一下,方便自己或者有需要的朋友們參考借鑒,文中通過示例代碼介紹的很詳細(xì),感興趣的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • C++淺拷貝與深拷貝及引用計(jì)數(shù)分析

    C++淺拷貝與深拷貝及引用計(jì)數(shù)分析

    這篇文章主要介紹了C++淺拷貝與深拷貝及引用計(jì)數(shù)分析的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C++結(jié)合OpenCV實(shí)現(xiàn)RRT算法(路徑規(guī)劃算法)

    C++結(jié)合OpenCV實(shí)現(xiàn)RRT算法(路徑規(guī)劃算法)

    這篇文章主要介紹了C++結(jié)合OpenCV實(shí)現(xiàn)RRT算法,RRT算法整體框架主要分為rand、near、new三點(diǎn)的建立和near與new之間的安全性檢查,需要的朋友可以參考下
    2022-05-05
  • C語(yǔ)言的函數(shù)概念與規(guī)則你了解嗎

    C語(yǔ)言的函數(shù)概念與規(guī)則你了解嗎

    這篇文章主要介紹了C語(yǔ)言中的函數(shù)概念與規(guī)則,本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下,希望能給你帶來(lái)幫助
    2021-08-08

最新評(píng)論

蒙山县| 图片| 新干县| 商都县| 永泰县| 通榆县| 张掖市| 开原市| 新乡县| 陇南市| 龙游县| 建平县| 铜梁县| 剑河县| 六安市| 长兴县| 雷州市| 平塘县| 酒泉市| 田东县| 安徽省| 怀集县| 仁怀市| 嘉兴市| 舒城县| 包头市| 田林县| 疏附县| 盖州市| 会理县| 柳河县| 南昌县| 玉林市| 常德市| 博野县| 崇左市| 加查县| 阳高县| 淮安市| 永济市| 保亭|