这次练习的项目是汽车信息管理系统,项目参考Qt5开发及实例(第3版)中的汽车销售管理系统,写到博客上的目的是为了梳理自己的思路,所以代码很大程度上是参照书上的实例。
项目实现了车辆与销售的的管理,运行程序出现登录界面,输入正确的密码才能登录,进入主界面后有两个菜单,【销售管理】和【修改密码】,【销售管理】菜单下有三个子菜单,【车辆管理】、【销售统计】、【退出】。其中车辆信息使用数据库进行存储,销售记录使用XML文档存储。
因为要使用QtSql,并且在后续的功能中要使用QtXml,所以在项目文件.Pro中添加下面代码:
QT += sql xml
1.创建数据库
向项目中添加头文件“connection.h”过程和代码如下:
#ifndef CONNECTION
#define CONNECTION
#include
#include
#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()){
//如果打开数据库失败,返回false
return 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();
}
来看一下效果:
目前来说已经完成大半了,继续努力~!