示例
基本框架
设计一个用来储存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模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓