Qt使用SQLite数据库存储管理图片文件

 更新时间:2023年04月14日 10:50:30   作者:欧特克_Glodon  
这篇文章主要为大家详细介绍了Qt如何使用SQLite数据库实现存储管理图片文件的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下

1、效果演示

1)增删改查效果

2)数据库内容

2、创建数据库及表格

2.1 创建数据库

首先在.pro文件添加对sql的支持:QT += core gui sql

QString g_connectName = "mySQL_connection";

bool MainWindow::createDatabase()
{
    //检测已连接的方式 - 自定义连接名
    if(QSqlDatabase::contains(g_connectName))
    {
        m_Projdb = QSqlDatabase::database(g_connectName);
    }
    else
    {
        m_Projdb = QSqlDatabase::addDatabase("QSQLITE",g_connectName);

        //设置数据库路径
        QString sDir = QApplication::applicationDirPath();
        QString sDataPath = sDir + "/mySql.db";
        m_Projdb.setDatabaseName(sDataPath);
    }

    //打开数据库
    if(!m_Projdb.open())
    {
        QMessageBox::information(this,"提示","数据库创建失败,无法打开!");
        return false;
    }

	// 创建表格
    createImageTable();

    //关闭数据库
    m_Projdb.close();

    return true;
}

2.2 创建数据库表格

bool MainWindow::createImageTable()
{
     …………………………
     
    //如果不存在则创建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构造前,需要db已打开并连接;未指定db或者db无效时使用默认连接进行操作
    QSqlQuery myQuery(m_Projdb);

    if(!myQuery.exec(cmdSql))
    {
        QString sError = myQuery.lastError().text();
        sError = "数据库表格插入数据失败:" + 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,"提示","图片文件已经存在!");
        return;
    }

	//将数据转换为QByteArray类型存储到数据库中
    QFile* pFile = new QFile(strImag);
    pFile->open(QIODevice::ReadOnly);
    
    QByteArray imageData = pFile->readAll();
    pFile->fileName();
    pFile->close();
    if(!m_Projdb.open())
    {
        QMessageBox::information(this,"提示","数据库无法打开!");
        return;
    }
    //QSqlQuery构造前,需要db已打开并连接;未指定db或者db无效时使用默认连接进行操作
    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 = "数据库表格插入数据失败:" + sError;
        QMessageBox::information(this,"提示",sError);
        m_Projdb.close();
        return;
    }

    QMessageBox::information(this,"提示","添加成功!");

    m_Projdb.close();

    // 刷新界面
    …………………………
}

3.2 删除记录

void MainWindow::on_pushBtn_del_clicked()
{
    …………………………
    //QSqlQuery构造前,需要db已打开并连接;未指定db或者db无效时使用默认连接进行操作
    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 = "数据库表格删除数据失败:" + 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构造前,需要db已打开并连接;未指定db或者db无效时使用默认连接进行操作
    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 = "数据库表格查询数据失败:" + 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()
{
     ………………………………
    
    // 查询表格数据
    const QString cmdSql = R"(SELECT * FROM image_table;)";

    //QSqlQuery构造前,需要db已打开并连接;未指定db或者db无效时使用默认连接进行操作
    QSqlQuery myQuery(m_Projdb);
    if(!myQuery.exec(cmdSql))
    {
        QString sError = myQuery.lastError().text();
        sError = "数据库表格插入数据失败:" + 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);
		}
    }

   …………………………
   
}

到此这篇关于Qt使用SQLite数据库存储管理图片文件的文章就介绍到这了,更多相关Qt SQLite管理图片文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言详细讲解const的用法

    C语言详细讲解const的用法

    今天探讨const,首先来说是将变量常量化。为什么要将变量常量化,原因有诸多好处有诸多。比如可以使数据更加安全不会被修改
    2022-05-05
  • 电脑开机时间的计算代码

    电脑开机时间的计算代码

    这几天我琢磨着一件事,那就是怎么计算我的PC从开机到现在的总时间。终于,看看这个函数:GetTickCount();
    2013-05-05
  • C++中的STL常用算法之遍历算法详解

    C++中的STL常用算法之遍历算法详解

    这篇文章主要介绍了C++中的STL常用算法之遍历算法详解,ransform() 可以将函数应用到容器的元素上,并将这个函数返回的值保存到另一个容器中,它返回的迭代器指向输出容器所保存的最后一个元素的下一个位置,需要的朋友可以参考下
    2023-12-12
  • 深入浅析STL vector用法

    深入浅析STL vector用法

    这篇文章给大家介绍 stl vector用法,主要知识点在如何恰当的使用它们的成员函数,涉及到条件函数和函数指针在迭代算法中的使用,对stl vector用法感兴趣的朋友可以参考下本文
    2015-10-10
  • C,C++中常用的操作字符串的函数

    C,C++中常用的操作字符串的函数

    这篇文章主要介绍了C,C++中常用的操作字符串的函数,需要的朋友可以参考下
    2017-09-09
  • C 转移表/转换表的深入分析

    C 转移表/转换表的深入分析

    本篇文章是对c语言中转移表/转换表进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++while和do-while语句求和详解

    C++while和do-while语句求和详解

    对于C语言中的while与do-while,相信很多都再熟悉不过了,最近在工作中就用到了,所以想着总结一下,方便自己或者有需要的朋友们参考借鉴,文中通过示例代码介绍的很详细,感兴趣的朋友们下面来一起学习学习吧
    2021-08-08
  • C++浅拷贝与深拷贝及引用计数分析

    C++浅拷贝与深拷贝及引用计数分析

    这篇文章主要介绍了C++浅拷贝与深拷贝及引用计数分析的相关资料,需要的朋友可以参考下
    2017-06-06
  • C++结合OpenCV实现RRT算法(路径规划算法)

    C++结合OpenCV实现RRT算法(路径规划算法)

    这篇文章主要介绍了C++结合OpenCV实现RRT算法,RRT算法整体框架主要分为rand、near、new三点的建立和near与new之间的安全性检查,需要的朋友可以参考下
    2022-05-05
  • C语言的函数概念与规则你了解吗

    C语言的函数概念与规则你了解吗

    这篇文章主要介绍了C语言中的函数概念与规则,本文给大家介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下,希望能给你带来帮助
    2021-08-08

最新评论