简单汽车管理系统

xiaoxiao2021-02-28  69

登陆界面

品牌车管理界面

销售统计界面

源代码: 注意在.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.createAttribute("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{}
转载请注明原文地址: https://www.6miu.com/read-46393.html

最新回复(0)