qt界面程序数据模型使用MYSQL数据库保存

背景

在包含大量数据的PC应用程序中,结构化数据的保存最好交给数据库。对于只有少量数据的PC应用程序,考虑到将来的扩展和代码的简洁,仍然可以使用数据库的方式,不过在部署和维护阶段会比较复杂。
https://blog.csdn.net/iamqianrenzhan/article/details/83686196 ,本文继承了原来写的一篇在Android应用中使用数据库的文章,使用了一样的数据模型,但用QT的数据库相关类实现。

示例

基本框架

设计一个用来储存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

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);
哈哈哈,小白在学校期间的练手作品,很粗糙,很简陋,bug也有,但是对于新手来说还是很具有参考价值的,不喜勿喷,指出问题,共同进步。 项目简介: 1.项目名称:学生信息管理与收发系统(客户端+服务器)-(学生端-服务器-教师端) 2.使用工具:QT Creator 5.6 + Mysql5.6; 3.使用技术:C/S(客户端-服务器)、TCP/IP(协议)、socket、多线程、数据库; 4.项目描述:1)服务器:服务器监听一个IP地址,用来连接教师端和学生端,用于数据转发(eg:教师端发消息到服务器,在由服务器发消息到学生端); 2)教师端:教师端的主要功能是选择需要发送的学生(可以发送给不在线学生),输入将要发送给一部分学生的表格名(标题),和1-8个字段名(不能重复,因为数据库中的字段名不能重复),在点击发送后由服务器转发给学生端。在学生端收到消息并且提交消息后可以查询学生的信息和提交的信息,还可以将数据表导出成xls文件。文件发送还没有完成0.0…… 3)学生端:学生端可以编辑个人信息。学生端可以查询收到的并未提交的数据表并且提交信息。(可以收到离线信息)(在线学生收到消息提示后从数据库中查找教师端所发出的数据)(不在线学生在上线后从数据库中查找数据)。文件发送还没有完成0.0…… 5.注意事项:本系统只能用于局域网中的数据传输,并且由于本项目是在学校完成后并没有改动,所以服务器所监听的地址为我本身的地址,在下载后本系统是不可用的。还有就是数据库的问题,数据库是我在花钱买的一个远程服务器上搭建的,所以数据库也是不可用的。因此 1)在拿到本系统的代码时应该修改IP地址(服务器-教师端-学生端)改为你所需要的。 2)在拿到本系统的代码时应该把我所发的数据库加入到你的数据库中,并且修改代码中跟数据库有关的代码。 代码我就不贴了,自己下载看吧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仟人斩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值