Qt usa la base de datos SQLITE para almacenar y administrar archivos de imagen: agregar, eliminar, modificar y verificar

1. Demostración de efectos

1) Efecto CRUD
inserte la descripción de la imagen aquí
2) Contenido de la base de datos
inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

2. Crear base de datos y tablas

2.1 Crear una base de datos

  Primero agregue soporte para sql en el archivo .pro: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 Crear una tabla de base de datos

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. CRUD

3.1 Agregar registro

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 Eliminar registros

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 Registros de modificación

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 Buscar registros

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 Registros de la tabla de desplazamiento

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);
		}
    }

   …………………………
   
}

4. Dirección de descarga del código fuente: dirección de descarga

Supongo que te gusta

Origin blog.csdn.net/m0_37251750/article/details/130135781
Recomendado
Clasificación