当前位置:   article > 正文

基于QT的水果管理系统_创建qt项目,并以“无人超市水果采集系统”为例,设计两个应用程序,其中服务端负责

创建qt项目,并以“无人超市水果采集系统”为例,设计两个应用程序,其中服务端负责

基于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数据库
  1. /*
  2. * 文件名:DBHelper.cpp
  3. * 功能:提供连接和断开Sqlite3的接口
  4. */
  5. #ifndef DBHELPER_H
  6. #define DBHELPER_H
  7. #include <QSqlDatabase>
  8. //单例类
  9. class DBHelper
  10. {
  11. public:
  12. static DBHelper *getInstance();
  13. void connectDatabase();
  14. void disconnectDatabase();
  15. private:
  16. static DBHelper *instance;
  17. DBHelper();
  18. QSqlDatabase db;
  19. };
  20. #endif // DBHELPER_H
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  1. /*
  2. * 文件名:DBHelper.cpp
  3. * 功能:提供连接和断开Sqlite3的接口
  4. */
  5. #include "DBHelper.h"
  6. #include <QDebug>
  7. DBHelper *DBHelper::instance = NULL;
  8. DBHelper::DBHelper()
  9. {
  10. db = QSqlDatabase::addDatabase("QSQLITE");
  11. }
  12. void DBHelper::connectDatabase()
  13. {
  14. db.setDatabaseName("fruit.db");
  15. bool ret = db.open();
  16. if(ret){qDebug()<<"open db success";}
  17. else{qDebug()<<"open db failed";}
  18. }
  19. void DBHelper::disconnectDatabase()
  20. {
  21. db.close();
  22. db.removeDatabase("fruit.db");
  23. }
  24. DBHelper *DBHelper::getInstance()
  25. {
  26. if(instance == NULL)
  27. {
  28. instance = new DBHelper();
  29. }
  30. return instance;
  31. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 操作数据库的增删改查抽象基类
  1. /*
  2. * 文件名:fruitDao.h
  3. * 功能:操作数据库的抽象基类,用于派生出更多的数据库操作类型
  4. */
  5. #ifndef FRUITDAO_H
  6. #define FRUITDAO_H
  7. #include "Fruit.h"
  8. #include <vector>
  9. #include <QSqlQuery>
  10. using namespace std;
  11. class FruitDao
  12. {
  13. public:
  14. FruitDao();
  15. virtual QSqlQuery *selectFruitById(QSqlQuery *,int id) = 0;
  16. virtual QSqlQuery *selectFruitByName(QSqlQuery *,QString name) = 0;
  17. virtual QSqlQuery *selectFruitByPrice(QSqlQuery *,double price) = 0;
  18. virtual QSqlQuery *selectFruitByNum(QSqlQuery *,double num) = 0;
  19. virtual bool insertFruit(const Fruit &fruit) = 0;
  20. virtual bool deleteFruit(const QString &name) = 0;
  21. virtual bool updateFruit(const int &id,const Fruit &fruit) = 0;
  22. virtual ~FruitDao();
  23. //~FruitDao();
  24. //warning: deleting object of abstract class type 'FruitDao'
  25. //which has non-virtual destructor will cause undefined behaviour [-Wdelete-non-virtual-dtor] delete(fd);
  26. };
  27. #endif // FRUITDAO_H
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  1. /*
  2. * 文件名:fruitDao.h
  3. * 功能:操作数据库的抽象基类,用于派生出更多的数据库操作类型
  4. */
  5. #include "FruitDao.h"
  6. #include <QDebug>
  7. FruitDao::FruitDao()
  8. {
  9. }
  10. FruitDao::~FruitDao()
  11. {
  12. qDebug()<<"虚析构";
  13. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 建表语句
  1. create table if not exists tb_fruit(
  2. id integer primary key autoincrement,
  3. name text not null,
  4. price real not null,
  5. num real not null
  6. );
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
(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.源代码
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/233484
推荐阅读
相关标签
  

闽ICP备14008679号