Qt界面程序数据模型使用MySQL数据库保存

示例

基本框架

设计一个用来储存LAB颜色空间的数据类对象。
h文件:

#ifndef COLORSPACE_H
#define COLORSPACE_H

#include <QString>
#include <QUuid>

class ColorSpace
{
private:
    QUuid mId;
    QString mColorName;
    QString mL;
    QString mA;
    QString mB;

public:
    ColorSpace();
    ColorSpace(QUuid uuid);

    QUuid getId(){ return mId;}
    QString getColorName(){return mColorName;}
    QString getL(){return mL;}
    QString getA(){return mA;}
    QString getB(){return mB;}

    void setColorName(QString colorname){mColorName = colorname;}
    void setL(QString l) {mL = l;}
    void setA(QString a) {mA = a;}
    void setB(QString b) {mB = b;}

    void setLABint(int l, int a, int b)
    {
        setL(QString::number(l));
        setA(QString::number(a));
        setB(QString::number(b));
    }
};

#endif // COLORSPACE_H

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

cpp文件:

#include "colorspace.h"

ColorSpace::ColorSpace()
{
    mId = QUuid::createUuid().toString();
    mColorName = "A";
    mL = "0";
    mA = "127";
    mB = "127";
}

ColorSpace::ColorSpace(QUuid uuid)
{
    mId = uuid.toString();
    mColorName = "A";
    mL = "0";
    mA = "127";
    mB = "127";
}

这个数据模型用来储存一个颜色以及它对应的LAB颜色空间的L,A,B通道的值,UUID是保存数据库时用到的一个数据。

一个应用中会用到多个颜色,那么需要设计一个ColorSpaceLab类来管理。

h文件:

#ifndef COLORSPACELAB_H
#define COLORSPACELAB_H
#include <QList>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>
#include "colorspace.h"
#include "basehelper.h"

class ColorSpaceLab
{
public:
    ColorSpaceLab();
    static ColorSpaceLab* get();
    BaseHelper* mbh;

private:
    static ColorSpaceLab* pColorSpaceLab;

public:
    void addColorSpace(ColorSpace c);
    void deleteColorSpaceByUuid(ColorSpace c);
    void deleteAllColorSpace();
    QList<ColorSpace> getColorSpaces();
    ColorSpace getColorSpaceByUuid(QUuid id);
    ColorSpace getColorSpaceByColorName(QString color);
    void updateColorSpacebyUuid(ColorSpace colorSpace);
    void updateColorSpacebyName(ColorSpace colorSpace);
    static QString AnalyzeColor(int l, int a, int b);
};

#endif // COLORSPACELAB_H

cpp文件:

#include "colorspacelab.h"

ColorSpaceLab* ColorSpaceLab::pColorSpaceLab = nullptr;

ColorSpaceLab::ColorSpaceLab()
{
    mbh = BaseHelper::get();
}

ColorSpaceLab* ColorSpaceLab::get()
{
    if (pColorSpaceLab == nullptr) {
        pColorSpaceLab = new ColorSpaceLab();
    }
    return pColorSpaceLab;
}

void ColorSpaceLab::addColorSpace(ColorSpace c)      //测试通过
{
    QSqlQuery query(mbh->db);
    query.prepare("INSERT INTO COLORSPACE VALUES(:_id,:uuid,:color_name,:l,:a,:b)");
    query.bindValue(":uuid",c.getId().toString());
    query.bindValue(":color_name",c.getColorName());
    query.bindValue(":l",c.getL());
    query.bindValue(":a",c.getA());
    query.bindValue(":b",c.getB());
    bool success = query.exec();
    if(!success)
    {
        QSqlError lastError = query.lastError();
        QMessageBox msgBox;
        msgBox.setText("database insert failed:" + lastError.driverText() + lastError.databaseText());
        msgBox.exec();
        return;
    }
}

void ColorSpaceLab::deleteColorSpaceByUuid(ColorSpace c)   //测试通过
{
    QSqlQuery query(mbh->db);
    query.prepare("DELETE FROM COLORSPACE WHERE uuid = ?");
    query.bindValue(0,c.getId().toString());
    bool success = query.exec();
    if(!success)
    {
        QSqlError lastError = query.lastError();
        QMessageBox msgBox;
        msgBox.setText("database delete failed:" + lastError.driverText() + lastError.databaseText());
        msgBox.exec();
    }
}

void ColorSpaceLab::deleteAllColorSpace()             //测试通过
{
    //先查出所有的记录,再根据uuid删除
    QList<ColorSpace> listcs;
    listcs = getColorSpaces();
    for(int i = 0;i<listcs.size();i++)
        deleteColorSpaceByUuid(listcs.at(i));
}

QList<ColorSpace> ColorSpaceLab::getColorSpaces()           //测试通过
{
    QList<ColorSpace> listcs;
    QSqlQuery query(mbh->db);
    query.exec("SELECT * FROM COLORSPACE");

    while(query.next())
    {
        QUuid uuid(query.value(1).toString());
        ColorSpace cs(uuid);
        cs.setColorName(query.value(2).toString());
        cs.setL(query.value(3).toString());
        cs.setA(query.value(4).toString());
        cs.setB(query.value(5).toString());
        listcs.append(cs);
    }
    return listcs;
}

ColorSpace ColorSpaceLab::getColorSpaceByUuid(QUuid id)       //测试通过
{
    QSqlQuery query(mbh->db);
    query.prepare("SELECT * FROM COLORSPACE WHERE uuid = ?");
    query.bindValue(0,id.toString());
    query.exec();

    if(query.next())
    {
        QUuid uuid(query.value(1).toString());
        ColorSpace cs(uuid);
        cs.setColorName(query.value(2).toString());
        cs.setL(query.value(3).toString());
        cs.setA(query.value(4).toString());
        cs.setB(query.value(5).toString());
        return cs;
    }
    else
        return NULL;
}

ColorSpace ColorSpaceLab::getColorSpaceByColorName(QString color)      //测试通过
{
    QSqlQuery query(mbh->db);
    query.prepare("SELECT * FROM COLORSPACE WHERE color_name = ?");
    query.bindValue(0,color);
    bool success = query.exec();
    if(!success)
    {
        QSqlError lastError = query.lastError();
        QMessageBox msgBox;
        msgBox.setText("database query failed:" + lastError.driverText() + lastError.databaseText());
        msgBox.exec();
    }
    if(query.next())
    {
        QUuid uuid(query.value(1).toString());
        ColorSpace cs(uuid);
        cs.setColorName(query.value(2).toString());
        cs.setL(query.value(3).toString());
        cs.setA(query.value(4).toString());
        cs.setB(query.value(5).toString());
        return cs;
    }
    else
    {
        ColorSpace cs(QUuid::createUuid());
        cs.setA("0");
        return cs;
    }
}

void ColorSpaceLab::updateColorSpacebyUuid(ColorSpace colorSpace)    //测试通过
{
    QSqlQuery query(mbh->db);
    query.prepare("UPDATE COLORSPACE SET color_name = ?,l = ?, a = ?, b = ?  WHERE uudi = ?");
    query.bindValue(0,colorSpace.getColorName());
    query.bindValue(1,colorSpace.getL());
    query.bindValue(2,colorSpace.getA());
    query.bindValue(3,colorSpace.getB());
    query.bindValue(4,colorSpace.getId().toString());
    bool success = query.exec();
    if(!success)
    {
        QSqlError lastError = query.lastError();
        QMessageBox msgBox;
        msgBox.setText("database update failed:" + lastError.driverText() + lastError.databaseText());
        msgBox.exec();
    }
}

void ColorSpaceLab::updateColorSpacebyName(ColorSpace colorSpace)   //测试通过
{
    QSqlQuery query(mbh->db);
    query.prepare("UPDATE COLORSPACE SET l = ?, a = ?, b = ?  WHERE color_name = ?");
    query.bindValue(0,colorSpace.getL());
    query.bindValue(1,colorSpace.getA());
    query.bindValue(2,colorSpace.getB());
    query.bindValue(3,colorSpace.getColorName());
    bool success = query.exec();
    if(!success)
    {
        QSqlError lastError = query.lastError();
        QMessageBox msgBox;
        msgBox.setText("database update failed:" + lastError.driverText() + lastError.databaseText());
        msgBox.exec();
    }
}

类的中指向自身的静态指针变量pColorSpaceLab,表明这个类在使用时只被实例化一次,因为一个应用只需要一个颜色管理类。

需要说明的是,QMessageBox 弹出的消息框只能在界面线程中实现,如果在QT的main函数对lab类进行操作,消息可以正常弹出。如果用在其他地方,需要把消息框换成qDebug方式。

BaseHelper也是一个类,该类实现数据库的连接和表创建等功能。

在颜色管理类ColorSpaceLab中实现的功能有查询,增加,删除,按UUID和按颜色名称更新。

用到的底层类定义

该类用到了一些更加底层的操作BaseHelper。

h文件:

#ifndef BASEHELPER_H
#define BASEHELPER_H

#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>
#include <QVariant>
#include <QString>

class BaseHelper
{
public:
    BaseHelper();
    static BaseHelper* get();
    QSqlDatabase db;
private:
    static BaseHelper* pBaseHelper;


};

#endif // BASEHELPER_H

cpp文件:

#include "basehelper.h"

BaseHelper* BaseHelper::pBaseHelper = nullptr;

BaseHelper* BaseHelper::get()
{
    if (pBaseHelper == nullptr) {
        pBaseHelper = new BaseHelper();
    }
    return pBaseHelper;
}

BaseHelper::BaseHelper()
{
    db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("localhost");
    db.setPort(3306);
    db.setDatabaseName("csd");       //这里输入你的数据库名
    db.setUserName("root");
    db.setPassword("123456");   //这里输入你的密码
    if (!db.open())
    {
        QMessageBox::critical(0, QObject::tr("can't open database"),
        "can't connect to database! ", QMessageBox::Cancel);
    }

    //查看表是否存在
    QSqlQuery query(db);
    query.exec("SELECT table_name FROM information_schema.TABLES WHERE table_name ='colorspace'");
    if(query.next())
    {
       QVariant var = query.value(0);
       QString str = var.toString();
    }
    else
    {
        bool success = query.exec("CREATE TABLE COLORSPACE (_id int primary key AUTO_INCREMENT, uuid  varchar(50), color_name  varchar(20), l  varchar(10), a  varchar(10), b  varchar(10))");
        QMessageBox msgBox;
        if(success)
            msgBox.setText("The data table was created successfully.");
        else
            msgBox.setText("Cannot create data table");
        msgBox.exec();
    }

    query.exec("SELECT table_name FROM information_schema.TABLES WHERE table_name ='template'");
    if(query.next())
    {
       QVariant var = query.value(0);
       QString str = var.toString();
    }
    else
    {
        bool success = query.exec("CREATE TABLE TEMPLATE (_id int primary key AUTO_INCREMENT, uuid  varchar(50), title  varchar(20), colors  varchar(300))");
        QMessageBox msgBox;
        if(success)
            msgBox.setText("The data table was created successfully.");
        else
            msgBox.setText("Cannot create data table");
        msgBox.exec();
    }
}

BaseHelper在实例化时进行数据库的连接和表的创建(如果不存在)。

数据模型的使用

ColorSpace* cs = new ColorSpace();
ColorSpaceLab* pcsl = ColorSpaceLab::get();
QList<ColorSpace> listcs = pcsl->getColorSpaces();
pcsl->deleteColorSpaceByUuid(listcs.at(0));
pcsl->addColorSpace(*cs);
ColorSpace cs1 =  listcs.at(0);
ColorSpace cs2 =  listcs.at(1);
cs1.setA("1");
cs1.setB("1");
cs2.setA("200");
cs2.setB("201");

ColorSpace cs1reture = pcsl->getColorSpaceByColorName(cs1.getColorName());
pcsl->updateColorSpacebyName(cs2);

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值