项目介绍
这次练习的项目是汽车信息管理系统,项目参考Qt5开发及实例(第3版)中的汽车销售管理系统,写到博客上的目的是为了梳理自己的思路,所以代码很大程度上是参照书上的实例。
项目实现了车辆与销售的的管理,运行程序出现登录界面,输入正确的密码才能登录,进入主界面后有两个菜单,【销售管理】和【修改密码】,【销售管理】菜单下有三个子菜单,【车辆管理】、【销售统计】、【退出】。其中车辆信息使用数据库进行存储,销售记录使用XML文档存储。
功能实现
因为要使用QtSql,并且在后续的功能中要使用QtXml,所以在项目文件.Pro中添加下面代码:
QT += sql xml
1.创建数据库
向项目中添加头文件“connection.h”过程和代码如下:
#ifndef CONNECTION
#define CONNECTION
#include<QtSql>
#include<QDebug>
#include"qdom.h"static bool createConnection(){QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");//设置数据库主机名db.setHostName("win7Test-sql");//设置数据库名db.setDatabaseName("testDB.db");//设置数据库用户名db.setUserName("MackTang");//设置数据库密码db.setPassword("123456");if(!db.open()){//如果打开数据库失败,返回falsereturn false;}QSqlQuery query;//创建厂家表并插入数据query.exec("create table factory (id varchar primary key,name varchar)");query.exec(QString::fromLocal8Bit("insert into factory values('0','请选择厂家')"));query.exec(QString::fromLocal8Bit("insert into factory values('01','一汽大众')"));query.exec(QString::fromLocal8Bit("insert into factory values('02','二汽神龙')"));query.exec(QString::fromLocal8Bit("insert into factory values('03','上海大众')"));//创建品牌表并插入数据query.exec("create table brand(id varchar primary key,name varchar,factory varchar,price int,sum int,sell int,last int)");query.exec(QString::fromLocal8Bit("insert into brand values('01','奥迪A6','一汽大众',36,50,10,40)"));query.exec(QString::fromLocal8Bit("insert into brand values('02','捷达','一汽大众',34,20,5,15)"));query.exec(QString::fromLocal8Bit("insert into brand values('03','宝来','一汽大众',41,80,20,60)"));query.exec(QString::fromLocal8Bit("insert into brand values('04','奔驰','一汽大众',83,40,15,25)"));query.exec(QString::fromLocal8Bit("insert into brand values('05','毕加索','二汽神龙',39,50,15,35)"));query.exec(QString::fromLocal8Bit("insert into brand values('06','富康','二汽神龙',28,60,10,50)"));query.exec(QString::fromLocal8Bit("insert into brand values('07','标致307','二汽神龙',27,70,20,50)"));query.exec(QString::fromLocal8Bit("insert into brand values('08','桑塔纳','上海大众',25,75,25,50)"));query.exec(QString::fromLocal8Bit("insert into brand values('09','帕萨特','上海大众',27,65,20,45)"));return true;
}#endif // CONNECTION
2.加载厂家
先进入main.cpp,带入上面我们写的数据库的头文件(connection.h),并添加一行代码:
if(!createConnection())return 0;
下面进入widget.cpp,添加相关的头文件,并在构造函数中添加下面代码:
ui->stackedWidget->setCurrentIndex(0);//为控件设置模型(模型来自查询语句在数据库表中查询的结果)QSqlQueryModel *factoryModel = new QSqlQueryModel(this);factoryModel->setQuery("select name from factory");ui->sellFactoryComboBox->setModel(factoryModel);//重新设置画面布局QSplitter *splitter = new QSplitter(ui->managePage);splitter->resize(700,360);splitter->move(0,50);splitter->addWidget(ui->toolBox);splitter->addWidget(ui->dailyList);splitter->setStretchFactor(0,1);splitter->setStretchFactor(1,1);on_sellCancelBtn_clicked();
3.加载厂家对应的车辆型号
为了实现选择厂家组合框中任意一家,则在下面的车辆型号组合框中显示相应厂家的汽车型号,需要从设计模式中进入sellFactoryComboBox部件的currentIndexChanged(QString)信号对应的槽函数,并添加下面的代码:
//判断如果sellFactoryComboBox的值是“请选择厂家”就设置页面初始化(和取消按钮按下相同)if(arg1=="请选择厂家"){on_sellCancelBtn_clicked();}else {//根据厂家(factory)查询相应的型号ui->sellBrandComboBox->setEnabled(true);QSqlQueryModel *model = new QSqlQueryModel(this);model->setQuery(QString::fromLocal8Bit("select name from brand where factory = '%1'").arg(arg1));ui->sellBrandComboBox->setModel(model);ui->sellCancelBtn->setEnabled(true);}
4.显示购车总价
实现更改购买数量后会自动显示金额,从设计模式中进入sellNumSpinBox部件的valueChanged(int)信号对应的槽函数:
if(arg1==0){//如果数量为0,则清空相关控件的值,锁定相应的功能ui->sellSumLineEdit->clear();ui->sellSumLineEdit->setEnabled(false);ui->sellOkBtn->setEnabled(false);}else {//如果数量不是0,解锁相应功能,并将数据显示到显影控件上ui->sellSumLineEdit->setEnabled(true);ui->sellSumLineEdit->setReadOnly(true);qreal sum = arg1*ui->sellPriceLineEdit->text().toInt();ui->sellSumLineEdit->setText(QString::number(sum));ui->sellOkBtn->setEnabled(true);}
5.实现购车
从设计模式中进入取消按钮的单击信号所对应的槽函数,代码如下:
//恢复页面初始化状态ui->sellFactoryComboBox->setCurrentIndex(0);ui->sellBrandComboBox->clear();ui->sellPriceLineEdit->clear();
从设计模式中进入确定按钮的单击信号所对应的槽函数,代码如下:
//获取页面上的厂家和型号QString factory = ui->sellFactoryComboBox->currentText();QString name = ui->sellBrandComboBox->currentText();//获取数量并计算购买后的剩余数量int value = ui->sellNumSpinBox->value();int last = ui->sellNumSpinBox->maximum()-value;//查询该型号的销售量QSqlQuery query;query.exec(QString::fromLocal8Bit("select sell from brand where name='%1' and factory='%2'").arg(name).arg(factory));query.next();//销售量加上购买数量就是最新的销售量int sell = query.value(0).toInt()+value;//连接数据库,并更新销售量和剩余数量QSqlDatabase::database().transaction();bool rtn = query.exec(QString::fromLocal8Bit("update brand set sell=%1,last=%2 where name='%3'and factory='%4'").arg(sell).arg(last).arg(name).arg(factory));//判断是否更新数据成功if(rtn){//成功则弹出提示信息QSqlDatabase::database().commit();QMessageBox::information(this,tr("Tip"),tr("Successful car purchase"),QMessageBox::Ok);//并将页面恢复到初始状态on_sellCancelBtn_clicked();}else {//如果失败则进行数据回滚,在sql语句执行失败时,使用了此语句,可以将数据回滚到sql语句执行前的状态。QSqlDatabase::database().rollback();}
来看一下效果:
目前来说已经完成大半了,继续努力~!