基于QT的水果管理系统

5 篇文章 0 订阅
1 篇文章 0 订阅

基于QT的水果管理系统


1.前言

最近一直在学习Qt,编程语言使用的是C++,我发现这样的组合既可以写逻辑算法,也可以很方便的写出漂亮的界面。更令我惊叹的是,用Qt编写的程序可以在几乎所有的Unix、Windows、MacOS、Android系统上编译运行。出于实践的目的,我就用Qt写了这个水果管理系统。那么Qt和C++究竟是什么关系呢?

2.Qt和C++的关系

Qt是一个功能非常完善的c++跨平台图形库,其实与其说图形库倒不如说它是一个与MFC类似的应用框架。Qt本身就是使用c++语言实现。

QT理论上是跨平台的,MFC只是windows下的架构。
QT是一个完全的C++程序开发框架,包含类库和跨平台国际化开发工具。QT API和开发工具对所有支持平台都是一致的,从而可以进行独立于平台的程序开发和配置。使得跨平台软件编程直观、简易和方便。

QT是一种c++语言的方言。
因为它要使用自己的预处理器处理代码后,才能用C++编译器编译代码。

qt基于c++语言实现,c++本身只是为开发人员提供了一种编程手段,而Qt正是利用了它实现了一个半成品的应用框架。c++语言自身实现非常复杂,比如多态、继承、虚函数等语言特性的实现就较为底层,只能由天才级的it人士完成。而Qt相对c++而言属于高层次的应用,普通的Qt开发人员做的应用程序相对Qt而言又高了一个层此。

qt里的类都是由c++写的,你用qt编程的时候和c++不同点在于:很大一部分和信号与槽有关的c++代码不用你自己来写,是由qt sdk提供的一个程序自动生成的。
总之无论qt自动生成的代码还是你写的调用qt的代码或者qt类库底层的代码都是c++。qt开源。

QT是一个高层的类库,OpenGL是底层的库。
如果相互调用的话,是QT调用OpenGL。
OpenGL只是负责画出来一个图像,可能会细节到设计出来具体哪一个像素怎么画出来的,至于其他的事情完全不管。
QT则会做更多的事情,比如画出一个完整的对话框,并且替你把对话框的一些点击事件、关闭事件处理一下。而且QT画东西的时候,它并不一定是自己直接画,多半会通过调用OpenGL等库来画出来。
用木头盖房子来打比方的话,OpenGL负责帮你把树种出来,保证木材是结实耐用的。而QT帮你把木材加工好,做成一个木门,保证木门能够正确地安装和使用。
你需要的就是把这个做好的木门安装到你的房子上。

C++中的类,接口在QT中是可以使用的,和在C++中一样

C++是一个语言,而Qt是一个图形界面库(GUI)
除去界面相关操作,实际的编程回归c++中来。

参考:http://www.cnblogs.com/zhangke95/articles/4677156.html

3.项目介绍

这个水果管理系统,可以永久存储水果的:商品编号、名称、单价、库存数量等信息,只要在主界面点击插入按钮,然后在二级界面输入相应的数据保存即可,点击删除按钮输入商品编号就可以删除相应水果的信息,同时点击修改按钮可以修改水果的信息。点击查询按钮会跳出二级界面,然后选择查新的依据和目标值,点击查询就可以以类似于excle表格的形式显示出查询结果。这个水果管理系统,可以给水果销售带来极大的方便,提高管理的效率。

4.项目UI界面展示

  • 主界面

这里写图片描述

  • 插入数据界面

这里写图片描述

  • 删除数据界面

这里写图片描述

  • 修改数据界面

这里写图片描述

  • 查询数据界面

这里写图片描述

  • 导出数据界面

这里写图片描述

4.项目开发工具

  • 操作系统:windows10
  • IDE:QtCreator 4.3.1 Based on Qt 5.9.1
  • 数据库:Sqlite3
5.项目开发过程

(1)部署Qt开发环境
  • 早期的Qt版本需要分三步:
    • 安装编译器:gcc、g++、gdb调试器
    • 安装Qt库
    • 安装QtCreator集成开发环境
  • 最新版的QtCreator已经把这三个部分综合到一个安装文件中,所以只需要一路Next就可以完成Qt开发环境的部署。

部署过程参考:http://blog.csdn.net/csdn_lsd/article/details/78116081

(2) UI界面绘制

QtCreator集成了QtDesigner,在QtDesigner里可以选择需要的控件,然后合理的分配布局,可以很方便的绘制出漂亮实用的界面。在水果管理系统中,为了清晰的显示每条记录,我先择了TableWidget控件来转载数据。具体的数据需要在C++代码里里面set。Qt的界面和逻辑代码关系就是这样若即若离。

(3) 代码编写和功能实现
  • 连接Sqlite3数据库
/*
* 文件名:DBHelper.cpp
* 功能:提供连接和断开Sqlite3的接口
*/
#ifndef DBHELPER_H
#define DBHELPER_H
#include <QSqlDatabase>

//单例类
class DBHelper
{
public:
    static DBHelper *getInstance();
    void connectDatabase();
    void disconnectDatabase();
private:
    static DBHelper *instance;
    DBHelper();
    QSqlDatabase db;

};

#endif // DBHELPER_H
/*
* 文件名:DBHelper.cpp
* 功能:提供连接和断开Sqlite3的接口
*/
#include "DBHelper.h"
#include <QDebug>
DBHelper *DBHelper::instance = NULL;

DBHelper::DBHelper()
{
    db = QSqlDatabase::addDatabase("QSQLITE");
}
void DBHelper::connectDatabase()
{
    db.setDatabaseName("fruit.db");
    bool ret = db.open();
    if(ret){qDebug()<<"open db success";}
    else{qDebug()<<"open db failed";}
}

void DBHelper::disconnectDatabase()
{
    db.close();
    db.removeDatabase("fruit.db");
}

DBHelper *DBHelper::getInstance()
{
    if(instance == NULL)
    {
        instance = new DBHelper();
    }
    return instance;
}
  • 操作数据库的增删改查抽象基类
/*
* 文件名:fruitDao.h
* 功能:操作数据库的抽象基类,用于派生出更多的数据库操作类型
*/
#ifndef FRUITDAO_H
#define FRUITDAO_H
#include "Fruit.h"
#include <vector>
#include <QSqlQuery>
using namespace std;

class FruitDao
{
public:
    FruitDao();
    virtual QSqlQuery *selectFruitById(QSqlQuery *,int id) = 0;
    virtual QSqlQuery *selectFruitByName(QSqlQuery *,QString name) = 0;
    virtual QSqlQuery *selectFruitByPrice(QSqlQuery *,double price) = 0;
    virtual QSqlQuery *selectFruitByNum(QSqlQuery *,double num) = 0;

    virtual bool insertFruit(const Fruit &fruit) = 0;
    virtual bool deleteFruit(const QString &name) = 0;
    virtual bool updateFruit(const int &id,const Fruit &fruit) = 0;
    virtual ~FruitDao();
    //~FruitDao();
    //warning: deleting object of abstract class type 'FruitDao'
    //which has non-virtual destructor will cause undefined behaviour [-Wdelete-non-virtual-dtor] delete(fd);

};

#endif // FRUITDAO_H
/*
* 文件名:fruitDao.h
* 功能:操作数据库的抽象基类,用于派生出更多的数据库操作类型
*/
#include "FruitDao.h"
#include <QDebug>
FruitDao::FruitDao()
{

}
FruitDao::~FruitDao()
{
    qDebug()<<"虚析构";
}
  • 建表语句
create table if not exists tb_fruit(
id integer primary key autoincrement,
name text not null,
price real not null,                     
num real not null
);                    
(3).打包发布

  • 工具
    • windeployqt.exe
    • Enigma Virtual Box
  • 步骤

    • 1、配置windeploy.exe环境变量

    • 2、在QtCreator中编译出软件的release版

      • 把.exe文件拷贝到单独文件夹中,在当前目录下进入cmd
      • 执行windeploy ***.exe
      • 此时工具自动把程序运行所需的.dll文件都拷贝到当前文件夹中
      • 但是还缺少三个.dll文件
        • libwinpthread-1.dll
        • libstdc++-6.dll
        • libgcc_s_dw2-1.dll
      • 把这三个.dll文件也拷贝到当前目录下
    • 3、下载Enigma Virtual Box

这里写图片描述

这里写图片描述

这里写图片描述

6.项目开发过程中遇到的问题

问题大多是由不知道某个技术,或者说是某个知识点不知道造成的。每个人的情况不同。
在写逻辑上我没有碰到棘手的问题,绘制界面上也没有遇到问题。但是在怎么把后台数据和界面上的控件建立连接上,却让我费了不少劲。
但是问题总是要去解决的,目前我的办法是百度上找相关控件的使用案例,然后模仿别人的代码,找里面的接口方法,运用到自己的程序中。
虽然问题得到解决,但是发挥了太多的时间和精力,有点不敢情愿。
我仔细想想,主要问题出在没有去看Qt的帮助文档。Qt的帮助文档里有所有的类、方法、信号、槽的介绍和使用。但是就是因为太过全面,导致看帮助手册也是非常费时。
两者之间需要权衡一下,目前在看开发手册和帮助文档这块,我还是没有形成好的方法,但是我会努力去看,大家有什么好的方法或者建议可以留言讨论。

7.源代码
  • 3
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值