您的位置:首页 > 编程语言 > Qt开发

基于QT的水果管理系统

2017-10-16 01:34 387 查看

基于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.项目开发过程

[b](1)部署Qt开发环境[/b]

早期的Qt版本需要分三步:

安装编译器:gcc、g++、gdb调试器

安装Qt库

安装QtCreator集成开发环境

最新版的QtCreator已经把这三个部分综合到一个安装文件中,所以只需要一路Next就可以完成Qt开发环境的部署。

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

[b](2) UI界面绘制[/b]

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

[b](3) 代码编写和功能实现[/b]

连接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(in
e49a
stance == 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
);


[b](3).打包发布[/b]

工具

windeployqt.exe

Enigma Virtual Box

步骤

1、配置windeploy.exe环境变量

windeploy.exe是Qt官方的打包工具,在Qt/bin目录下

把/bin目录添加到高级系统设置的path里

参考:http://blog.csdn.net/iw1210/article/details/51253458

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

官网:http://enigmaprotector.com/en/downloads.html

默认安装

参考:http://www.51hei.com/mcu/3195.html







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

问题大多是由不知道某个技术,或者说是某个知识点不知道造成的。每个人的情况不同。

在写逻辑上我没有碰到棘手的问题,绘制界面上也没有遇到问题。但是在怎么把后台数据和界面上的控件建立连接上,却让我费了不少劲。

但是问题总是要去解决的,目前我的办法是百度上找相关控件的使用案例,然后模仿别人的代码,找里面的接口方法,运用到自己的程序中。

虽然问题得到解决,但是发挥了太多的时间和精力,有点不敢情愿。

我仔细想想,主要问题出在没有去看Qt的帮助文档。Qt的帮助文档里有所有的类、方法、信号、槽的介绍和使用。但是就是因为太过全面,导致看帮助手册也是非常费时。

两者之间需要权衡一下,目前在看开发手册和帮助文档这块,我还是没有形成好的方法,但是我会努力去看,大家有什么好的方法或者建议可以留言讨论。

7.源代码

GitHub :
git clone https://github.com/grahamitdev/FruitManageSystem.git[/code] 
百度网盘: 链接:http://pan.baidu.com/s/1mhNkhgW 密码:rj0f
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  qt sqlite3 c++ 数据库