Qt框架下实现商品库存管理系统

一、前言

程序系统内部的内存存储是在程序关闭后进行自动清除,这对我们记录信息和使用过程都有着极大的影响,若想做出适合平时使用的系统,结合数据库进行系统开发是最普遍和常见的方式

本文通过Qt和SQL进行结合,开发出商品库存管理系统,可以记录商品的总量,剩余量,品牌,类型以及金额,并通过数据库对数据进行存储。

二、基本原理和数据表的设计

Qt中提供的QSqlQuery类适用于连接各种类型的数据库,本文连接的是MySql数据库,出现连接问题参考上文。

数据表结构的设计一定要符合系统需要,本系统设计了类型表和品牌表,结构如下:

                     类型表                                                       品牌表

Sql语句如下:

create table type(id1 int primary key,name text);

create table brand(id2 int primary key, name text,type text,price int,sum int,sell int,last int);

系统主要使用了QSqlQuery类中的方法与数据库进行联动,同时通过将ui代码载入系统进行本窗体切换不同界面,实现一个窗体完成各种功能。

首先设计不同界面的UI

主体ui界面

查询商品ui界面

ui代码生成如下:

1、打开Qt 5.12.9 for Desktop (MinGW 7.3.0 32 bit)命令行

2、切换到QT项目的路径

3、输入uic-= ui.h widget.ui

(ui文件生成.h头文件)

将生成的文件复制进入主窗体

头文件添加(选择有用的进行复制)

widget文件添加:

此时通过show()和hide()就可以控制窗体的显示和隐藏。

三、具体代码和详细设计

1.初始化

对多个界面进行初始化和隐藏,同时对数据库进行连接操作,同时写入sql语句进行建表和插入数据

void Widget::Init()
{
    setSelectForm(this);
    setPasssWdForm(this);
    wid_select->hide();
    wid_password->hide();
    QString filename = "test";
    QFileInfo info(filename);
    bool ret = info.exists();
    db = QSqlDatabase::addDatabase("QMYSQL");
    db.setDatabaseName(filename);
    db.setHostName("localhost");
    db.setUserName("root");
    db.setPassword("root");
    db.setPort(3306);
    QSqlQuery query(db);
    bool ok = db.open();
    if(ok)
    {

            //创建分类表
            QString cmd1 = "create table type(id1 int primary key,name text);";
            query.exec(cmd1);
            query.exec(QString("insert into type values('0','请选择类型')"));
            query.exec(QString("insert into type values('01','电视')"));
            query.exec(QString("insert into type values('02','空调')"));
            //创建品牌表
            QString cmd2 = "create table brand(id2 int primary key, name text,"
                           "type text,price int,sum int,sell int,last int);";
            query.exec(cmd2);
            query.exec(QString("insert into brand values('01','海信','电视',3699,50,10,40)"));
            query.exec(QString("insert into brand values('02','创维','电视',3499,20,5,15)"));
            query.exec(QString("insert into brand values('03','海尔','电视',4199,80,40,40)"));
            query.exec(QString("insert into brand values('04','王牌','电视',3999,40,10,30)"));
            query.exec(QString("insert into brand values('05','海尔','空调',2899,60,10,50)"));
            query.exec(QString("insert into brand values('06','格力','空调',2799,70,20,50)"));
            qDebug()<<ok;

    }
}

2.数据初始化

读取type数据将其载入combox,同时对自定义的信号进行绑定

void Widget::InitData()
{
    QString sel1 = "select name from type";    
    QSqlQuery query(db);
    query.exec(sel1);
    QStringList listName;
    while(query.next())
    {
        listName<<query.value("name").toString();
    }
    ui->cbox_type->addItems(listName); 
    cbox_select_type->addItems(listName);
    connect(cbox_select_type,SIGNAL(currentTextChanged(QString))
            ,this,SLOT(on_cbox_type_currentTextChanged(QString)));
    connect(btn_select_select,SIGNAL(clicked(bool)),this,SLOT(doProcessClickSelect(bool)));
}

3.设定按钮功能

将各个按钮进行槽功能绑定,分别对应隐藏和显示不同的界面,以商品入库和信息查询界面为例

void Widget::on_btn_storage_clicked()
{
    wid_select->hide();
    wid_password->hide();
    ui->wid_sell->show();
    ui->lbl_sell->setText("商品入库");
}
void Widget::on_btn_select_clicked()
{
    ui->wid_sell->hide();
    wid_password->hide();
    wid_select->show();
    ui->lbl_sell->setText("商品查询");
}

4.商品查询功能

商品查询功能通过商品的品牌和类型对已存商品进行查询

从ui控件中的combox处获取值并加入SQL语句中

QString sel2 = QString("select * from brand where name = '%1' and type='%2'")
            .arg(cbox_select_brand->currentText())
            .arg(cbox_select_type->currentText());

然后通过append在文本框进行显示信息

query.exec(sel2);
    QString msg;
    while(query.next())
    {
       msg+= "品牌名称:"+query.value(1).toString()+"\n";
       msg+= "商品类型:"+query.value(2).toString()+"\n";
       msg+= "商品价格:"+query.value(3).toString()+"\n";
       msg+= "商品总数:"+query.value(4).toString()+"\n";
       msg+= "售出数量:"+query.value(5).toString()+"\n";
       msg+= "剩余数量:"+query.value(6).toString()+"\n";
    }
    tedit_select_show->append(msg);

结果如下:

5.类型选择信号的接收

由于初始化只进行了类型的读取,为了使类型和品牌进行联动,定义一个combox中选项改变的信号传入槽中,对选中的类型进行SQL查询并添加到品牌的combox进行显示

void Widget::on_cbox_type_currentTextChanged(const QString &arg1)
{
    QSqlQuery query(db);
    QString sel2 = QString("select name from brand where type = '%1'").arg(arg1);
    query.exec(sel2);
    QStringList listProduct;
    while(query.next())
    {
        listProduct<<query.value("name").toString();
    }
    ui->cbox_brand->clear();
    ui->cbox_brand->addItems(listProduct);
    cbox_select_brand->clear();
    cbox_select_brand->addItems(listProduct);
}

6.商品添加

当点击商品添加的确定按钮时,要对添加的数据进行接收,并通过SQL语句将其传入数据库中,此处可以采用prepare方法,将SQL语句写入prepare方法中,需要替换的数据前面加上":",并通过bindValue()方法进行替换。

if(text == "商品添加")
    {
        int maxNum = 0;
        QSqlQuery query(db);
        QString cmd = "select max(id2) from brand";
        query.exec(cmd);
        if(query.next())
        {
            maxNum = query.value(0).toString().toInt();
            maxNum += 1;
            query.prepare("INSERT INTO brand (id2, name, type,price,sum,sell,last) VALUES (:id2, :name, :type,:price,:sum,:sell,:last)");
            query.bindValue(":id2", maxNum);
            query.bindValue(":name", ui->cbox_brand->currentText());
            query.bindValue(":type", ui->cbox_type->currentText());
            query.bindValue(":price", ui->ledit_price->text());
            query.bindValue(":sum", ui->sbox_num->text());
            query.bindValue(":sell", ui->sbox_num->text());
            query.bindValue(":last", ui->sbox_num->text());
            bool ret = query.exec();
            if(ret)
            {
                QMessageBox::information(this,"提示","保存成功",QMessageBox::Ok);
            }
            else
            {
                QMessageBox::information(this,"提示","保存失败",QMessageBox::Ok);
            }
        }
        else
        {
            return;
        }
    }

7.商品入库

商品入库功能主要是对已经在库的商品进行数量上的操作,因此通过SQL中的UPDATE进行相对应的操作,同样使用prepare方法,因为入库需要查询相对应的商品,因此通过类型、品牌、价格进行查询判断,并记录下商品的id,未查询到提示用户先进行商品添加。

if(text == "商品入库")
    {
        int id = 0;
        int sum = 0;
        int last = 0;
        QSqlQuery query(db);
        QString type = ui->cbox_type->currentText();
        QString brand = ui->cbox_brand->currentText();
        QString price = ui->ledit_price->text();
        QString cmd = QString("select id2,sum,last from brand where type = '%1' and name = '%2' and price = '%3'").arg(type).arg(brand).arg(price);
        query.exec(cmd);
        if(query.next())
        {
            id = query.value(0).toInt();
            sum = query.value(1).toInt();
            last = query.value(2).toInt();
            sum += ui->sbox_num->text().toUInt();
            last += ui->sbox_num->text().toUInt();
            query.prepare("UPDATE brand SET sum = :sum,last = :last WHERE id2 = :id");
            query.bindValue(":sum", sum);
            query.bindValue(":last", last);
            query.bindValue(":id", id);
            bool ret = query.exec();
            if(ret)
            {
                QMessageBox::information(this,"提示","入库成功",QMessageBox::Ok);

            }
            else
            {
                QMessageBox::information(this,"提示","入库失败",QMessageBox::Ok);
            }

        }
        else
        {
            QMessageBox::information(this,"错误","未找到商品",QMessageBox::Ok);
        }
    }

8.出售商品

出售商品与商品入库操作相似,主要是对已售出商品数量和剩余商品数量进行对应的操作,通过查询商品剩余数量对售出数量进行相应的操作,提示用户商品是否缺货。

if(text == "出售商品")
    {
        int id,sum,sell,last = 0;
        QSqlQuery query(db);
        QString type = ui->cbox_type->currentText();
        QString brand = ui->cbox_brand->currentText();
        QString price = ui->ledit_price->text();
        QString cmd = QString("select id2,sum,sell,last from brand where type = '%1' and name = '%2' and price = '%3'").arg(type).arg(brand).arg(price);
        bool ret = query.exec(cmd);
        if(query.next())
        {
            id = query.value(0).toInt();
            sum = query.value(1).toInt();
            sell = query.value(2).toInt();
            last = query.value(3).toInt();
            if(last>0)
            {
                int last1 = ui->sbox_num->text().toUInt();
                sell += ui->sbox_num->text().toUInt();
                if(last>=last1)
                {
                    last -= ui->sbox_num->text().toUInt();
                    query.prepare("update brand set sell = :sell,last = :last where id2 = :id2");
                    query.bindValue(":sell",sell);
                    query.bindValue(":last",last);
                    query.bindValue(":id2",id);
                    bool ret = query.exec();
                    if(ret)
                    {
                        QMessageBox::information(this,"提示","售出成功",QMessageBox::Ok);
                    }
                    else
                    {
                         QMessageBox::information(this,"提示","售出失败",QMessageBox::Ok);
                    }
                }
                else
                {
                    QMessageBox::information(this,"提示","商品缺货",QMessageBox::Ok);
                }
            }
            else
            {
                QMessageBox::information(this,"提示","商品缺货",QMessageBox::Ok);
            }
        }
    }
  • 18
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: QT是一款跨平台的C++应用程序开发框架,在搭建一套库存管理系统方面具有很大的优势。下面是关于如何使用QT搭建库存管理系统的简要步骤: 1. 数据库设计:首先,需要设计一个数据库库存管理系统所需的数据,包括产品信息、库数量、进货与销售记录等。可以使用SQLite数据库作为本地数据库或者MySQL等作为远程数据库。 2. 界面设计:使用QT提供的界面开发工具,设计一个用户友好的界面。可以使用QT的UI设计师来快速创建和管理界面。 3. 功能模块划分:根据库存管理系统的需求,将其拆分为不同的功能模块,例如产品管理、进货管理、销售管理、库查询等。每个功能模块对应一个或多个界面和相关的业务逻辑。 4. 业务逻辑开发:根据需求,使用C++语言编写相应的业务逻辑代码。例如,在产品管理模块中,需要实现产品的新增、编辑和删除功能;在进货管理模块中,需要实现进货记录的添加和更新功能等。 5. 数据库连接:使用QT提供的数据库模块,与所选用的数据库建立连接,并编写相关的数据库操作代码,实现数据的增删改查等功能。 6. 用户交互:在界面上添加必要的用户交互功能,例如按钮、菜单、表格等,使用户可以方便地进行数据录入、查询和操作。 7. 数据校验与处理:在数据录入的过程中,进行数据校验和处理,确保数据的有效性和准确性。例如,对于产品的数量字段,需要进行数据范围的校验。 8. 报表生成:根据需求,编写报表生成的代码,将库、进货、销售等数据按照需求生成相应的报表,方便管理者进行数据分析和决策。 以上是使用QT搭建一套库存管理系统的大致步骤,具体的实现过程需要根据实际需求进行设计和开发QT提供了丰富的开发工具和库函数,使得开发库存管理系统变得更加简单和高效。 ### 回答2: 首先,要搭建一套基于Qt库存管理系统,我们需要考虑以下几个方面: 1. 界面设计:使用Qt的界面设计功能来创建一个用户友好的界面,可以包括菜单、工具栏、表格、图表等元素,以方便用户进行库管理操作。 2. 数据库设计:使用Qt数据库模块连接和操作数据库,设计库存管理系统所需的数据库表结构,其中包括商品信息、库数量、进货信息、出货信息等。 3. 功能实现:根据实际需求,使用Qt的编程能力实现库存管理系统的各项功能,如添加新商品、编辑商品信息、查询库数量、记录进货和出货等操作。 4. 数据统计与分析:利用Qt的图表和数据处理功能,对库存管理系统中的数据进行统计和分析,生成销售报表、库报表等,以帮助用户更好地了解库情况和经营状况。 5. 部署与交付:将搭建好的库存管理系统打包成可执行文件或生成安装程序,以便用户可以方便地部署和使用。 总结起来,搭建一套基于Qt库存管理系统需要涉及界面设计、数据库设计、功能实现数据统计与分析等方面,通过充分利用Qt的强大功能和丰富的工具,可以快速高效地构建一个功能完备、界面友好、易于使用的库存管理系统。 ### 回答3: Qt是一款跨平台的C++开发框架,具有图形界面设计能力和丰富的功能库,可以用于搭建库存管理系统。以下是关于如何使用Qt搭建一套库存管理系统的简要介绍。 首先,我们需要定义库存管理系统的功能和需求。比如,我们需要记录和管理产品的信息,包括产品的名称、编号、价格、库数量等。同时,我们还需要能够进行产品的出库和入库操作,计算库余量,并生成相应的报表。 使用Qt框架,我们可以利用Qt的图形界面设计功能来创建使用者友好的界面。我们可以使用Qt的窗口类(如QMainWindow)来创建主界面,并在界面上添加所需的各种控件(如文本框、按钮、表格等)来显示和输入产品信息。我们还可以使用Qt的信号和槽机制来实现用户与界面之间的交互,比如点击按钮触发相应的操作。 在储产品信息方面,我们可以使用Qt数据库模块(如QSqlDatabase)来连接数据库,并使用SQL语句来创建和管理产品信息表。我们可以利用Qt的表格控件(如QTableView)来显示产品信息,并提供相应的操作(比如新增、编辑和删除)来对产品信息进行管理。 对于出库和入库操作,我们可以在界面上添加相应的按钮,并在点击按钮时触发相应的操作。比如,点击“出库”按钮时,系统可以弹出一个对话框供用户输入出库商品的数量,然后更新库数量并生成相应的出库记录。同样地,对于入库操作,系统也可以通过类似的方式实现。 最后,我们可以使用Qt的绘图功能来生成报表。根据需要,我们可以使用Qt提供的绘图类(如QChart)来创建柱状图或折线图,并根据产品的库数量或其他指标来可视化数据。 总之,通过使用Qt框架,我们可以在图形界面操作的基础上,利用丰富的功能库和数据库模块来搭建一套库存管理系统,满足产品信息的记录、出库入库操作及报表生成等功能需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值