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

简单汽车管理系统

2017-08-06 11:52 393 查看
登陆界面



品牌车管理界面



销售统计界面



源代码:

注意在.pro中加入

QT += sql xml

main.cpp

#include "widget.h"
#include <QApplication>
#include "connection.h"
#include "logindialog.h"

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//创建数据库和xml文件
if(!createConnection()||!createXml())return 0;
Widget w;
//登陆界面
LoginDialog dlg;
if(dlg.exec()==QDialog::Accepted){
//登陆成功
w.show();
return a.exec();
}else{
return 0;
}
}


connection.h

#ifndef CONNECTION_H
#define CONNECTION_H

#include <QtSql>
#include <QDebug>
#include "qdom.h"

static bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");

db.setHostName("easybook-3313b0");
db.setDatabaseName("data.db");
db.setUserName("zhouhejun");
db.setPassword("123456");
if(!db.open()){
//提示出错
return false;
}

QSqlQuery query;

//创建厂家表
query.exec("create table factory(id varchar primary key,name varchar)");
query.exec(QString("insert into factory values('0','请选择厂家')"));
query.exec(QString("insert into factory values('01','一汽大众')"));
query.exec(QString("insert into factory values('02','二汽神龙')"));
query.exec(QString("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("insert into brand values('01','奥迪A6','一汽大众',36,50,10,40)"));
query.exec(QString("insert into brand values('02','捷达','一汽大众',34,20,5,15)"));
query.exec(QString("insert into brand values('03','宝来','一汽大众',41,80,20,60)"));
query.exec(QString("insert into brand values('04','奔驰','一汽大众',83,40,15,25)"));
query.exec(QString("insert into brand values('05','毕加索','二汽神龙',39,50,15,35)"));
query.exec(QString("insert into brand values('06','富康','二汽神龙',28,60,10,50)"));
query.exec(QString("insert into brand values('07','标致307','二汽神龙',27,70,20,50)"));
query.exec(QString("insert into brand values('08','桑塔纳','上海大众',25,75,25,50)"));
query.exec(QString("insert into brand values('09','帕萨特','上海大众',27,65,20,45)"));

//创建密码表
query.exec("create table password(pwd varchar primary key)");
query.exec("insert into password values('123456')");

return true;
}

static bool createXml()
{
QFile file("data.xml");
if(file.exists())return true;
if(!file.open(QIODevice::WriteOnly|QIODevice::Truncate))
return false;
QDomDocument doc;
QDomProcessingInstruction instruction;
instruction = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
doc.appendChild(instruction);
QDomElement root = doc.createElement(QString("日销售清单"));
doc.appendChild(root);
QTextStream out(&file);
doc.save(out,4);
file.close();
return true;
}

#endif // CONNECTION_H


logindialog.h

#ifndef LOGINDIALOG_H
#define LOGINDIALOG_H

#include <QDialog>

namespace Ui {
class LoginDialog;
}

class LoginDialog : public QDialog
{
Q_OBJECT

public:
explicit LoginDialog(QWidget *parent = 0);
~LoginDialog();

private slots:
void on_loginBtn_clicked();

void on_quitBtn_clicked();

private:
Ui::LoginDialog *ui;
};

#endif // LOGINDIALOG_H


logindialog.cpp

#include "logindialog.h"
#include "ui_logindialog.h"
#include <QMessageBox>
#include <QtSql>

LoginDialog::LoginDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::LoginDialog)
{
ui->setupUi(this);
setFixedSize(400,300);
setWindowTitle(tr("登录"));
ui->pwdLineEdit->setFocus();
ui->loginBtn->setDefault(true);
}

LoginDialog::~LoginDialog()
{
delete ui;
}

void LoginDialog::on_loginBtn_clicked()
{
if(ui->pwdLineEdit->text().isEmpty()){
QMessageBox::information(this,tr("请输入密码"),tr("请先输入密码再登录!"),QMessageBox::Ok);
ui->pwdLineEdit->setFocus();
}else{
//从数据库读取密码
QSqlQuery query;
query.exec("select pwd from password");
query.next();
if(query.value(0).toString() == ui->pwdLineEdit->text()){
QDialog::accept();
}else{
QMessageBox::warning(this,tr("密码错误"),tr("请输入正确的密码再登录!"),QMessageBox::Ok);
ui->pwdLineEdit->clear();
ui->pwdLineEdit->setFocus();
}
}
}

void LoginDialog::on_quitBtn_clicked()
{
QDialog::reject();
}


widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "qdom.h"
#include <QMainWindow>
#include <QMenuBar>

class QStandardItemModel;
namespace Ui {
class Widget;
}

class Widget : public QMainWindow
{
Q_OBJECT

public:
explicit Widget(QWidget *parent = 0);
~Widget();
enum DateTimeType{Time,Date,DateTime};
QString getDateTime(DateTimeType type);
QMenu *manageMenu;
QMenu *passwordMenu;
QAction *manageAction;
QAction *chartAction;
QAction *quitAction;

private slots:
void on_sellBrandComboBox_currentIndexChanged(const QString &arg1);

void on_sellNumSpinBox_valueChanged(int arg1);

void on_sellCancelBtn_clicked();

void on_sellOkBtn_clicked();

void on_updateBtn_clicked();

//void on_manageBtn_clicked();

//void on_chartBtn_clicked();

//品牌车管理
void on_manageMenu_clicked();
//销售统计
void on_chartMenu_clicked();
//退出
void on_quitMenu_clicked();

void on_sellFactoryComboBox_currentIndexChanged(const QString &arg1);

void on_factoryComboBox_currentIndexChanged(const QString &arg1);

private:
Ui::Widget *ui;
QDomDocument doc;
bool docRead();
bool docWrite();
void writeXml();
void createNodes(QDomElement &date);
void showDailyList();
QStandardItemModel *chartModel;
void createChartModelView();
void showChart();
void createMenuBar();//创建菜单
};

#endif // WIDGET_H


widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "connection.h"
#include <QtWidgets>
#include "pieview.h"

Widget::Widget(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);

setFixedSize(750,500);
//创建菜单栏
createMenuBar();
ui->stackedWidget->setCurrentIndex(0);

//厂家的combox
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();
//显示日销售清单
showDailyList();
ui->factoryComboBox->setModel(factoryModel);

//销售统计界面
createChartModelView();
}

Widget::~Widget()
{
delete ui;
}

void Widget::on_sellBrandComboBox_currentIndexChanged(const QString &arg1)
{
ui->sellNumSpinBox->setValue(0);
ui->sellNumSpinBox->setEnabled(false);
ui->sellSumLineEdit->clear();
ui->sellSumLineEdit->setEnabled(false);
ui->sellOkBtn->setEnabled(false);

QSqlQuery query;
query.exec(QString("select price from brand where name='%1' and factory='%2'").arg(arg1).arg(ui->sellFactoryComboBox->currentText()));
query.next();
ui->sellPriceLineEdit->setEnabled(true);
ui->sellPriceLineEdit->setReadOnly(true);
ui->sellPriceLineEdit->setText(query.value(0).toString());

query.exec(QString("select last from brand where name='%1' and factory='%2'").arg(arg1).arg(ui->sellFactoryComboBox->currentText()));
query.next();
int num = query.value(0).toInt();
if(num == 0){
QMessageBox::information(this,tr("提示"),tr("该品牌汽车已经售完!"),QMessageBox::Ok);
}
else{
ui->sellNumSpinBox->setEnabled(true);
ui->sellNumSpinBox->setMaximum(num);
ui->sellLastNumLabel->setText(tr("剩余数量:%1").arg(num));
ui->sellLastNumLabel->setVisible(true);
}
}

void Widget::on_sellNumSpinBox_valueChanged(int arg1)
{
if(arg1 == 0){
ui->sellSumLineEdit->clear();
ui->sellSumLineEdit->setEnabled(false);
ui->sellOkBtn->setEnabled(false);
}
else{
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);
}
}
//点击品牌车管理界面取消按钮
void Widget::on_sellCancelBtn_clicked()
{
ui->sellFactoryComboBox->setCurrentIndex(0);
ui->sellBrandComboBox->clear();
}
//点击确定按钮
void Widget::on_sellOkBtn_clicked()
{
QString factory = ui->sellFactoryComboBox->currentText();
QString name = ui->sellBrandComboBox->currentText();
int value = ui->sellNumSpinBox->value();
//sellNumSpinBox 的最大值就是以前的剩余量
int last = ui->sellNumSpinBox->maximum()-value;

QSqlQuery query;
//获取以前的销售量
query.exec(QString("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("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("提示"),tr("购车成功!"),QMessageBox::Ok);
writeXml();
showDailyList();
on_sellCancelBtn_clicked();
}
else{
QSqlDatabase::database().rollback();
}
}
//获取时间
QString Widget::getDateTime(DateTimeType type)
{
QDateTime datetime = QDateTime::currentDateTime();
QString date = datetime.toString("yyyy-MM-dd");
QString time = datetime.toString("hh:mm");
QString dateAndTime = datetime.toString("yyyy-MM-dd dddd hh:mm");
if(type == Date)return date;
else if(type == Time)return time;
else return dateAndTime;
}

//读取 XML 文档
bool Widget::docRead()
{
QFile file("data.xml");
if(!file.open(QIODevice::ReadOnly))
return false;
if(!doc.setContent(&file)){
file.close();
return false;
}
file.close();
return true;
}

//写入 XML 文档
bool Widget::docWrite()
{
QFile file("data.xml");
if(!file.open(QIODevice::WriteOnly|QIODevice::Truncate))
return false;
QTextStream out(&file);
doc.save(out,4);
file.close();
return true;
}

//将销售车辆信息保存到 XML 文件中
void Widget::writeXml()
{
//先从文件读取
if(docRead()){
QString currentDate = getDateTime(Date);
QDomElement root = doc.documentElement();
//根据是否有日期节点进行处理
if(!root.hasChildNodes()){
QDomElement date = doc.createElement(QString("日期"));
QDomAttr curDate = doc.createAt
11260
tribute("date");
curDate.setValue(currentDate);
date.setAttributeNode(curDate);
root.appendChild(date);
createNodes(date);
}else{
QDomElement date = root.lastChild().toElement();
//根据是否已经有今天的日期节点进行处理
if(date.attribute("date") == currentDate){
createNodes(date);
}else{
QDomElement date = doc.createElement(QString("日期"));
QDomAttr curDate = doc.createAttribute("date");
curDate.setValue(currentDate);
date.setAttributeNode(curDate);
root.appendChild(date);
createNodes(date);
}
}
//写入到文件
docWrite();
}
}

//创建销售车辆信息的节点
void Widget::createNodes(QDomElement &date)
{
QDomElement time = doc.createElement(QString("时间"));
QDomAttr curTime = doc.createAttribute("time");
curTime.setValue(getDateTime(Time));
time.setAttributeNode(curTime);
date.appendChild(time);
QDomElement factory = doc.createElement(QString("厂家"));
QDomElement brand = doc.createElement(QString("品牌"));
QDomElement price = doc.createElement(QString("报价"));
QDomElement num = doc.createElement(QString("数量"));
QDomElement sum = doc.createElement(QString("金额"));
QDomText text;
text = doc.createTextNode(QString("%1").arg(ui->sellFactoryComboBox->currentText()));
factory.appendChild(text);
text = doc.createTextNode(QString("%1").arg(ui->sellBrandComboBox->currentText()));
brand.appendChild(text);
text = doc.createTextNode(QString("%1").arg(ui->sellPriceLineEdit->text()));
price.appendChild(text);
text = doc.createTextNode(QString("%1").arg(ui->sellNumSpinBox->value()));
num.appendChild(text);
text = doc.createTextNode(QString("%1").arg(ui->sellSumLineEdit->text()));
sum.appendChild(text);
time.appendChild(factory);
time.appendChild(brand);
time.appendChild(price);
time.appendChild(num);
time.appendChild(sum);
}

//显示日销售清单
void Widget::showDailyList()
{
ui->dailyList->clear();
//读取xml文件
if(docRead()){
QDomElement root = doc.documentElement();
QString title = root.tagName();
QListWidgetItem *titleItem = new QListWidgetItem;
titleItem->setText(QString("-----%1-----").arg(title));
titleItem->setTextAlignment(Qt::AlignCenter);
ui->dailyList->addItem(titleItem);
if(root.hasChildNodes()){
//获取当前日期--判断只显示当日的销售情况
QString currentDate = getDateTime(Date);
QDomElement dateElement = root.lastChild().toElement();
QString date = dateElement.attribute("date");
if(date == currentDate){
ui->dailyList->addItem("");
ui->dailyList->addItem(QString("日期:%1").arg(date));
ui->dailyList->addItem("");
QDomNodeList children = dateElement.childNodes();
//遍历当日销售的所有汽车
for(int i=0;i<children.count();i++){
QDomNode node = children.at(i);
QString time = node.toElement().attribute("time");
QDomNodeList list = node.childNodes();
QString factory = list.at(0).toElement().text();
QString brand = list.at(1).toElement().text();
QString price = list.at(2).toElement().text();
QString num = list.at(3).toElement().text();
QString sum = list.at(4).toElement().text();
QString str = time + "出售" + brand + factory + " " + num + "辆," + "成交价:" + price + "万,共" + sum + "万元";
QListWidgetItem *tempItem = new QListWidgetItem;
tempItem->setText("**************************");
tempItem->setTextAlignment(Qt::AlignCenter);
ui->dailyList->addItem(tempItem);
ui->dailyList->addItem(str);
}
}
}
}
}
//销售统计界面
void Widget::createChartModelView()
{
chartModel = new QStandardItemModel(this);
chartModel->setColumnCount(2);
chartModel->setHeaderData(0,Qt::Horizontal,QString("品牌"));
chartModel->setHeaderData(1,Qt::Horizontal,QString("销售数量"));

//界面布局
QSplitter *splitter = new QSplitter(ui->chartPage);
splitter->resize(700,320);
splitter->move(0,80);
QTableView *table = new QTableView;
PieView *pieChart = new PieView;
splitter->addWidget(table);
splitter->addWidget(pieChart);
splitter->setStretchFactor(0,1);
splitter->setStretchFactor(1,2);

table->setModel(chartModel);
pieChart->setModel(chartModel);

//模块选中
QItemSelectionModel *selectionModel = new QItemSelectionModel(chartModel);
table->setSelectionModel(selectionModel);
pieChart->setSelectionModel(selectionModel);
}
//显示销售统计表格
void Widget::showChart()
{
QSqlQuery query;
query.exec(QString("select name,sell from brand where factory='%1'").arg(ui->factoryComboBox->currentText()));
chartModel->removeRows(0,chartModel->rowCount(QModelIndex()),QModelIndex());
int row = 0;

while(query.next()){
int r = qrand()%256;
int g = qrand()%256;
int b = qrand()%256;

chartModel->insertRows(row,1,QModelIndex());
chartModel->setData(chartModel->index(row,0,QModelIndex()),query.value(0).toString());
chartModel->setData(chartModel->index(row,1,QModelIndex()),query.value(1).toInt());
chartModel->setData(chartModel->index(row,0,QModelIndex()),QColor(r,g,b),Qt::DecorationRole);
row++;
}
}
//点击更新按钮
void Widget::on_updateBtn_clicked()
{
if(ui->factoryComboBox->currentText()!="请选择厂家")
showChart();
}
/*
void Widget::on_manageBtn_clicked()
{
ui->stackedWidget->setCurrentIndex(0);
}

void Widget::on_chartBtn_clicked()
{
ui->stackedWidget->setCurrentIndex(1);
}
*/
//品牌车管理
void Widget::on_manageMenu_clicked()
{
ui->stackedWidget->setCurrentIndex(0);
}
//销售统计
void Widget::on_chartMenu_clicked()
{
ui->stackedWidget->setCurrentIndex(1);
}
//退出
void Widget::on_quitMenu_clicked()
{
this->close();
}
//创建菜单
void Widget::createMenuBar()
{
//添加菜单
manageMenu = menuBar()->addMenu(tr("销售管理"));
passwordMenu = menuBar()->addMenu(tr("修改密码"));
//添加菜单按钮
manageAction = new QAction(tr("品牌车管理"), this);
chartAction = new QAction(tr("销售统计"), this);
quitAction = new QAction(tr("退出"), this);
//设置快捷方式
manageAction->setShortcut(tr("Ctrl+M"));
chartAction->setShortcut(tr("Ctrl+C"));
quitAction->setShortcut(tr("Ctrl+Q"));
//为菜单添加action按钮
manageMenu->addAction(manageAction);
manageMenu->addAction(chartAction);
//添加分隔符
manageMenu->addSeparator();
manageMenu->addAction(quitAction);

//菜单响应事件
connect(manageAction,SIGNAL(triggered()),this,SLOT(on_manageMenu_clicked()));
connect(chartAction,SIGNAL(triggered()),this,SLOT(on_chartMenu_clicked()));
connect(quitAction,SIGNAL(triggered()),this,SLOT(on_quitMenu_clicked()));
}

//厂家改变时改变品牌
void Widget::on_sellFactoryComboBox_currentIndexChanged(const QString &arg1)
{
if(arg1 == "请选择厂家"){
//进行其他部件的状态设置
on_sellCancelBtn_clicked();
}
else{
ui->sellBrandComboBox->setEnabled(true);
QSqlQueryModel *model = new QSqlQueryModel(this);
model->setQuery(QString("select name from brand where factory='%1'").arg(arg1));
ui->sellBrandComboBox->setModel(model);
ui->sellCancelBtn->setEnabled(true);
}
}
//厂家改变时改变表格
void Widget::on_factoryComboBox_currentIndexChanged(const QString &arg1)
{
if(arg1!="请选择厂家")
showChart();
}


pieview.h

#ifndef PIEVIEW_H
#define PIEVIEW_H

#include <QAbstractItemView>

class PieView : public QAbstractItemView
{
Q_OBJECT
public:
explicit PieView(QWidget *parent = 0);
void paintEvent(QPaintEvent *);
//为selections赋初值
void setSelectionModel(QItemSelectionModel *selectionModel);
QRegion itemRegion(QModelIndex index);

QRect visualRect(const QModelIndex &index) const;
void scrollTo(const QModelIndex &index, ScrollHint hint=EnsureVisible);
QModelIndex indexAt(const QPoint &point) const;
QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers);
int horizontalOffset()const;
int verticalOffset()const;
bool isIndexHidden(const QModelIndex &index) const;
void setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command);
QRegion visualRegionForSelection(const QItemSelection &selection) const;
private:
QItemSelectionModel *selections;
QList<QRegion> RegionList;
signals:

public slots:

};

#endif // PIEVIEW_H


pieview.cpp

#include "pieview.h"
#include <QPainter>

PieView::PieView(QWidget *parent) :
QAbstractItemView(parent)
{
}

void PieView::paintEvent(QPaintEvent *)
{
QPainter painter(viewport());
painter.setPen(Qt::black);
int x0=40;
int y0=250;
//y坐标轴
painter.drawLine(x0,y0,40,30);
painter.drawLine(38,32,40,30);
painter.drawLine(40,30,42,32);
painter.drawText(20,30,tr("销售数量"));
for(int i=1;i<5;i++)
{
painter.drawLine(-1,-i*50,1,-i*50);
painter.drawText(-20,-i*50,tr("%1").arg(i*5));
}
//x 坐标轴
painter.drawLine(x0,y0,540,250);
painter.drawLine(538,248,540,250);
painter.drawLine(540,250,538,252);
painter.drawText(545,250,tr("品牌"));

int pos=x0+20;
int row;
for(row=0;row<model()->rowCount(rootIndex());row++)
{
QModelIndex index=model()->index(row,0,rootIndex());
QString dep=model()->data(index).toString();

painter.drawText(pos,y0+20,dep);
pos+=50;
}
int posN=x0+20;
for(row=0;row<model()->rowCount(rootIndex());row++)
{
QModelIndex index=model()->index(row,1,rootIndex());
int sell=model()->data(index).toDouble();

int width=10;
QModelIndex colorIndex = model()->index(row,0,rootIndex());
QColor color = QColor(model()->data(colorIndex,Qt::DecorationRole).toString());
if(selections->isSelected(index))
painter.setBrush(QBrush(color,Qt::Dense3Pattern));
else
painter.setBrush(QBrush(color));

painter.drawRect(QRect(posN,y0-sell*10,width,sell*10));
QRegion regionM(posN,y0-sell*10,width,sell*10);
RegionList<<regionM;

posN+=50;
}
}

void PieView::setSelectionModel(QItemSelectionModel *selectionModel)
{
selections = selectionModel;
}

QRegion PieView::itemRegion(QModelIndex index)
{
QRegion region;
if (index.column() == 1)        // 销售数量
region = RegionList[index.row()];
return region;
}

QModelIndex PieView::indexAt(const QPoint &point) const
{
QPoint newPoint(point.x(),point.y());
QRegion region;
foreach(region,RegionList)              // 销售数量 列
{
if (region.contains(newPoint))
{
int row = RegionList.indexOf(region);
QModelIndex index = model()->index(row,1,rootIndex());
return index;
}
}
return QModelIndex();
}

QRect PieView::visualRect(const QModelIndex &index) const{}
void PieView::scrollTo(const QModelIndex &index, ScrollHint hint){}
QModelIndex PieView::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers){}
int PieView::horizontalOffset()const{}
int PieView::verticalOffset()const{}
bool PieView::isIndexHidden(const QModelIndex &index) const{}
void PieView::setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command){}
QRegion PieView::visualRegionForSelection(const QItemSelection &selection) const{}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  qt