第16章【綜合實(shí)例】:汽車銷售管理系統(tǒng)_第1頁
第16章【綜合實(shí)例】:汽車銷售管理系統(tǒng)_第2頁
第16章【綜合實(shí)例】:汽車銷售管理系統(tǒng)_第3頁
第16章【綜合實(shí)例】:汽車銷售管理系統(tǒng)_第4頁
第16章【綜合實(shí)例】:汽車銷售管理系統(tǒng)_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第16章 【綜合實(shí)例】:汽車銷售管理系統(tǒng)功能介紹與界面設(shè)計(jì)功能介紹與界面設(shè)計(jì)16.116.2實(shí)現(xiàn)品牌車管理功能實(shí)現(xiàn)品牌車管理功能銷售統(tǒng)計(jì)圖表功能銷售統(tǒng)計(jì)圖表功能16.316.4添加登錄界面添加登錄界面16.1 功能介紹與界面設(shè)計(jì)功能介紹與界面設(shè)計(jì)16.1.1 功能簡介功能簡介運(yùn)行程序后會(huì)出現(xiàn)登錄界面,需要輸入密碼才可登錄,該功能將在本章的后面進(jìn)行講解。進(jìn)入主界面后有兩個(gè)菜單:“銷售管理”和“修改密碼”,在“銷售管理”主菜單下有三個(gè)子菜單,即“品牌車管理”、“銷售統(tǒng)計(jì)”和“退出”。選擇“銷售管理”“品牌車管理”子菜單,進(jìn)入“品牌車管理”界面,該界面實(shí)現(xiàn)了不同廠商不同品牌汽車的管理和出售操作,還顯

2、示了當(dāng)日的銷售記錄。其中,車輛數(shù)據(jù)信息使用了數(shù)據(jù)庫進(jìn)行存儲(chǔ),而銷售記錄則使用XML文檔存儲(chǔ)。選擇“銷售管理”“銷售統(tǒng)計(jì)”子菜單,進(jìn)入“銷售統(tǒng)計(jì)”界面,這個(gè)界面上通過自定義視圖實(shí)現(xiàn)了各款車的銷量的圖表顯示。16.1.2 主界面設(shè)計(jì)在Tool Box的“出售車輛”頁面中添加Label、Combo Box、Line Edit、Spin Box和Push Button等部件,效果如圖16.1所示。16.1.2 主界面設(shè)計(jì)更改部分部件的objectName屬性,見表16.1。部 件objectName屬性“廠家:”右面的Combo BoxsellFactoryComboBox“品牌:”右面的Combo

3、BoxsellBrandComboBox“報(bào)價(jià):”右面的Line EditsellPriceLineEdit“數(shù)量:”右面的Spin BoxsellNumSpinBox“剩余數(shù)量:000”LabelsellLastNumLabel“金額:”右面的Line EditsellSumLineEdit“確定”Push ButtonsellOkBtn“取消”Push ButtonsellCancelBtn顯示日銷售清單的List WidgetdailyList16.1.3 菜單設(shè)計(jì)在文件“widget.h”中添加頭文件:#include #include 修改Widget的基類為QMainWindow,

4、并添加主菜單、動(dòng)作Action的定義:class Widget : public QMainWindow Q_OBJECTpublic: explicit Widget(QWidget *parent = 0); Widget(); QMenu *manageMenu;/“銷售管理”主菜單 QMenu *passwordMenu;/“修改密碼”主菜單/動(dòng)作Action定義 QAction *manageAction; QAction *chartAction; QAction *quitAction;private slots: void on_manageMenu_clicked();/實(shí)現(xiàn)

5、“品牌車管理”子菜單功能函數(shù) void on_chartMenu_clicked();/實(shí)現(xiàn)“銷售統(tǒng)計(jì)”子菜單功能函數(shù) void on_quitMenu_clicked();/實(shí)現(xiàn)“退出”子菜單功能函數(shù)private: Ui:Widget *ui; void createMenuBar();/用于生成菜單欄的函數(shù);16.1.3 菜單設(shè)計(jì)將Widget類的構(gòu)造函數(shù)修改為:Widget:Widget(QWidget *parent) : QMainWindow(parent), ui(new Ui:Widget) ui-setupUi(this); setFixedSize(750,500); c

6、reateMenuBar();/生成菜單欄16.1.3 菜單設(shè)計(jì)createMenuBar()函數(shù)用于生成菜單欄,代碼如下:void Widget:createMenuBar() manageAction = new QAction(tr(品牌車管理), this); chartAction = new QAction(tr(銷售統(tǒng)計(jì)), this); quitAction = new QAction(tr(退出), this); manageAction-setShortcut(tr(Ctrl+M); chartAction-setShortcut(tr(Ctrl+C); quitActio

7、n-setShortcut(tr(Ctrl+Q); manageMenu = menuBar()-addMenu(tr(銷售管理); manageMenu-addAction(manageAction); manageMenu-addAction(chartAction); manageMenu-addSeparator(); manageMenu-addAction(quitAction); passwordMenu = menuBar()-addMenu(tr(修改密碼); connect(manageAction,SIGNAL(triggered(),this,SLOT(on_manag

8、eMenu_ clicked(); connect(chartAction,SIGNAL(triggered(),this,SLOT(on_chartMenu_ clicked(); connect(quitAction,SIGNAL(triggered(),this,SLOT(on_quitMenu_ clicked();16.1.3 菜單設(shè)計(jì)最后三行connect()函數(shù)代碼為操作菜單的功能函數(shù)添加事件關(guān)聯(lián),這三個(gè)函數(shù)的實(shí)現(xiàn)代碼如下:void Widget:on_manageMenu_clicked() ui-stackedWidget-setCurrentIndex(0);void Wi

9、dget:on_chartMenu_clicked() ui-stackedWidget-setCurrentIndex(1);void Widget:on_quitMenu_clicked() this-close();運(yùn)行程序,菜單設(shè)計(jì)效果如圖16.2所示。16.2 實(shí)現(xiàn)品牌車管理功能實(shí)現(xiàn)品牌車管理功能16.2.1 出售車輛出售車輛1創(chuàng)建廠家表(創(chuàng)建廠家表(factory)和品牌表()和品牌表(brand)首先創(chuàng)建兩張表,在前面項(xiàng)目的基礎(chǔ)上進(jìn)行。因?yàn)樵诔绦蛑幸褂肣tSql和QtXml模塊,所以在項(xiàng)目文件“manager. Pro”中添加如下代碼:QT += sql xml向項(xiàng)目中添加新的

10、C+頭文件“connection.h”,完成后將其內(nèi)容更改。16.2.1 出售車輛2加載廠家名稱加載廠家名稱下面進(jìn)入“main.cpp”文件,添加頭文件:#include connection.h在主函數(shù)中第一行代碼的下面添加如下代碼:if(!createConnection()return 0;16.2.1 出售車輛下面進(jìn)入“widget.cpp”文件,添加相關(guān)的頭文件包含。在構(gòu)造函數(shù)中添加如下代碼:setFixedSize(750,500);ui-stackedWidget-setCurrentIndex(0);QSqlQueryModel *factoryModel = new QSql

11、QueryModel(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

12、);splitter-setStretchFactor(1,1);16.2.1 出售車輛這里首先固定了窗口的大小,然后使用factory表的name字段為“廠家”組合框提供條目,最后對(duì)toolBox和dailyList兩個(gè)部件進(jìn)行布局。現(xiàn)在可以運(yùn)行程序,將發(fā)現(xiàn)“廠家”組合框中已經(jīng)可以顯示三家汽車生產(chǎn)商了,如圖16.3所示。16.2.1 出售車輛3加載某廠家對(duì)應(yīng)的品牌名加載某廠家對(duì)應(yīng)的品牌名若在“廠家”組合框中選擇任意一家,則應(yīng)在下面的品牌組合框中顯示相應(yīng)廠商生產(chǎn)的所有品牌的汽車。為了實(shí)現(xiàn)這個(gè)功能,需要從設(shè)計(jì)模式進(jìn)入sellFactoryComboBox部件的currentIndexChange

13、d(QString)信號(hào)對(duì)應(yīng)的槽,添加如下代碼:void Widget:on_sellFactoryComboBox_currentIndexChanged(const QString &arg1) if(arg1 = 請(qǐng)選擇廠家) /進(jìn)行其他部件的狀態(tài)設(shè)置 on_sellCancelBtn_clicked(); else ui-sellBrandComboBox-setEnabled(true); QSqlQueryModel *model = new QSqlQueryModel(this); model-setQuery(QString(select name from brand wh

14、ere factory= %1).arg(arg1); ui-sellBrandComboBox-setModel(model); ui-sellCancelBtn-setEnabled(true); 16.2.1 出售車輛現(xiàn)在運(yùn)行程序,如選擇“一汽大眾”,這時(shí)“品牌”組合框中顯示一汽大眾生產(chǎn)的全部四個(gè)品牌汽車,如圖16.4所示。16.2.1 出售車輛4加載某品牌的報(bào)價(jià)和數(shù)量加載某品牌的報(bào)價(jià)和數(shù)量當(dāng)選擇了品牌后需要自動(dòng)在下方的“報(bào)價(jià)”和“數(shù)量”欄顯示相應(yīng)的信息。從設(shè)計(jì)模式進(jìn)入sellBrandComboBox部件的currentIndexChanged(QString)信號(hào)對(duì)應(yīng)的槽,添加代碼。

15、運(yùn)行程序,效果如圖16.5所示。16.2.1 出售車輛5顯示購車總價(jià)顯示購車總價(jià)更改購買數(shù)量后會(huì)自動(dòng)顯示總的金額。從設(shè)計(jì)模式進(jìn)入sellNumSpinBox部件的valueChanged(int)信號(hào)對(duì)應(yīng)的槽,添加如下代碼:void Widget:on_sellNumSpinBox_valueChanged(int arg1) if(arg1 = 0) ui-sellSumLineEdit-clear(); ui-sellSumLineEdit-setEnabled(false); ui-sellOkBtn-setEnabled(false); else ui-sellSumLineEdit-

16、setEnabled(true); ui-sellSumLineEdit-setReadOnly(true); qreal sum = arg1*ui-sellPriceLineEdit-text().toInt(); ui-sellSumLineEdit-setText(QString:number(sum); ui-sellOkBtn-setEnabled(true); 16.2.1 出售車輛這里首先獲取了單價(jià)和購買數(shù)量,然后計(jì)算出總價(jià),進(jìn)行顯示,程序運(yùn)行效果如圖16.6所示。16.2.1 出售車輛6實(shí)現(xiàn)購車實(shí)現(xiàn)購車從設(shè)計(jì)模式進(jìn)入“取消”按鈕的單擊信號(hào)所對(duì)應(yīng)的槽,更改如下:void Wid

17、get:on_sellCancelBtn_clicked() ui-sellFactoryComboBox-setCurrentIndex(0); ui-sellBrandComboBox-clear();這里對(duì)各個(gè)部件進(jìn)行了初始化設(shè)置。返回到前面的on_sellFactoryComboBox_currentIndexChanged()槽中,在“進(jìn)行其他部件的狀態(tài)設(shè)置”注釋的地方添加該槽的調(diào)用:on_sellCancelBtn_clicked();在構(gòu)造函數(shù)末尾也添加該槽的調(diào)用,用于初始化界面。進(jìn)入“確定”按鈕的單擊信號(hào)所對(duì)應(yīng)的槽,更改為。16.2.2 日銷售清單汽車的銷售記錄使用XML文檔保

18、存,而在List Widget中只顯示當(dāng)日的銷售記錄。在該XML文檔中按日期和時(shí)間存儲(chǔ)了所出售汽車的數(shù)量和金額等信息,如圖16.7所示是該文檔中的三條典型記錄的例子。16.2.2 日銷售清單1創(chuàng)建創(chuàng)建XML文件文件首先在“connection.h”文件中添加頭文件,然后在其中添加一個(gè)創(chuàng)建XML文件的函數(shù)的定義:static bool createXml() QFile file(data.xml); if(file.exists()return true; if(!file.open(QIODevice:WriteOnly|QIODevice:Truncate) return false; Q

19、DomDocument doc; QDomProcessingInstruction instruction; instruction = doc.createProcessingInstruction(xml,version= 1.0encoding=UTF-8); doc.appendChild(instruction); QDomElement root = doc.createElement(QString(日銷售清單); doc.appendChild(root); QTextStream out(&file); doc.save(out,4); file.close(); retu

20、rn true;16.2.2 日銷售清單這里創(chuàng)建了一個(gè)“data.xml”文件,并在其中添加了根元素。為了不重復(fù)創(chuàng)建該文件,在創(chuàng)建前先使用QFile:exists()函數(shù)判斷該文件是否已存在。首先在主函數(shù)中調(diào)用該函數(shù),到“main. cpp”文件中將以前的createConnection()函數(shù)調(diào)用的代碼更改為:if(!createConnection()|!createXml()return 0;然后到“widget.h”文件中,添加頭文件包含,定義一個(gè)public函數(shù)和枚舉變量用于獲取當(dāng)前的時(shí)間和日期:enum DateTimeTypeTime,Date,DateTime;QString

21、getDateTime(DateTimeType type);16.2.2 日銷售清單添加幾個(gè)私有對(duì)象和私有函數(shù)的定義聲明:private: Ui:Widget *ui; QDomDocument doc; bool docRead(); bool docWrite(); void writeXml(); void createNodes(QDomElement &date); void showDailyList();在“widget.cpp”文件中添加這幾個(gè)函數(shù)的實(shí)現(xiàn)。16.2.2 日銷售清單2獲取時(shí)間日期獲取時(shí)間日期首先添加獲取時(shí)間和日期的函數(shù)的代碼: QString Widget:ge

22、tDateTime(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 retu

23、rn dateAndTime;16.2.2 日銷售清單3讀寫讀寫XML文件文件添加讀取和寫入XML文件的函數(shù),這兩個(gè)函數(shù)也是為了可以在其他地方重復(fù)使用。4修改修改XML文檔文檔添加修改XML文檔的writeXml()函數(shù),該函數(shù)在售車成功時(shí)被調(diào)用,將銷售的汽車信息保存到XML文件中。這里首先判斷是否有日期節(jié)點(diǎn)。如果是第一次操作,則沒有日期節(jié)點(diǎn),需要?jiǎng)?chuàng)建。如果有日期節(jié)點(diǎn),則判斷是否有今天的日期節(jié)點(diǎn)。若沒有,則創(chuàng)建今天的日期節(jié)點(diǎn),否則在今天的日期節(jié)點(diǎn)下直接添加銷售車輛的信息。這里使用createNodes()函數(shù)創(chuàng)建銷售汽車信息的節(jié)點(diǎn),添加該函數(shù)的定義。16.2.2 日銷售清單5顯示日銷售清單顯示

24、日銷售清單添加顯示日銷售清單的函數(shù)的定義,在該函數(shù)中讀取了XML文檔中今天的銷售記錄信息并以一定的格式進(jìn)行顯示。將on_sellOkBtn_clicked()函數(shù)中的writeXml()和showDailyList()函數(shù)調(diào)用的注釋去掉,再到構(gòu)造函數(shù)中添加showDailyList()函數(shù)的調(diào)用,即添加如下代碼:Widget:Widget(QWidget *parent) : QWidget(parent), ui(new Ui:Widget). showDailyList();16.2.2 日銷售清單運(yùn)行程序,進(jìn)行某款品牌汽車的銷售操作,完成后將在界面右邊的列表部件中顯示出銷售記錄,效果如圖

25、16.8所示。16.3 銷售統(tǒng)計(jì)圖表功能銷售統(tǒng)計(jì)圖表功能16.3.1 視圖設(shè)計(jì)視圖設(shè)計(jì)向項(xiàng)目中添加新的C+類,類名設(shè)置為PieView,基類設(shè)為QAbstractItemView,類型信息選擇“繼承自QWidget”。完成后在“pieview.h”和“pieview.cpp”文件中添加代碼,與視圖顯示有關(guān)的最主要的是其中的paintEvent()函數(shù),該函數(shù)的定義。首先要說明的是,為這個(gè)視圖傳入的數(shù)據(jù)模型需要有兩個(gè)字段:第一個(gè)字段是汽車品牌名稱,它含有一個(gè)顏色數(shù)據(jù)角色;第二個(gè)字段是銷售數(shù)量。下面的代碼從模型的第二個(gè)字段中獲取了銷售數(shù)量值:QModelIndex index=model()-in

26、dex(row,1,rootIndex();int sell=model()-data(index).toDouble();16.3.1 視圖設(shè)計(jì)根據(jù)該值的大小來確定直方的高度。而顏色是從模型的第一個(gè)字段中獲取的:QModelIndex colorIndex = model()-index(row,0,rootIndex();QColor color = QColor(model()-data(colorIndex,Qt:DecorationRole). toString();為了方便讀者自己實(shí)現(xiàn),下面給出頭文件“pieview.h”的完整代碼。相應(yīng)“pieview.cpp”文件的完整代碼。1

27、6.3.2 界面設(shè)計(jì)首先進(jìn)入設(shè)計(jì)模式,單擊Stacked Widget右上角的小箭頭進(jìn)入下一頁。然后更改當(dāng)前頁的名稱,即將Stacked Widget的currentPageName屬性更改為chartPage。完成后向當(dāng)前頁上拖入一個(gè)Push Button、一個(gè)Combo Box和一個(gè)Label,最終效果如圖16.9所示。16.3.2 界面設(shè)計(jì)進(jìn)入“widget.h”文件中,首先添加類的前置聲明:class QStandardItemModel;然后添加一個(gè)私有對(duì)象定義:QStandardItemModel *chartModel;再添加兩個(gè)私有函數(shù)聲明:void createChartMo

28、delView();void showChart();現(xiàn)在進(jìn)入“widget.cpp”文件中,首先添加“#include pieview.h”頭文件包含,然后在構(gòu)造函數(shù)中添加如下代碼:ui-factoryComboBox-setModel(factoryModel);createChartModelView();16.3.2 界面設(shè)計(jì)這里的createChartModeIView()函數(shù)是用于創(chuàng)建銷售數(shù)據(jù)的模型和視圖的,下面添加該函數(shù)的代碼?,F(xiàn)在為數(shù)據(jù)模型添加數(shù)據(jù),這是在showChart()函數(shù)中完成的,它的定義為。下面分別從設(shè)計(jì)模式進(jìn)入factoryComboBox的currentInde

29、xChanged(QString)信號(hào)所對(duì)應(yīng)的槽和updateBtn的clicked()信號(hào)所對(duì)應(yīng)的槽,編寫代碼如下:void Widget:on_factoryComboBox_currentIndexChanged(const QString &arg1) if(arg1!=請(qǐng)選擇廠家) showChart();void Widget:on_updateBtn_clicked() if(ui-factoryComboBox-currentText()!=請(qǐng)選擇廠家) showChart();16.3.2 界面設(shè)計(jì)現(xiàn)在可以運(yùn)行程序了,效果如圖16.10所示。16.4 添加登錄界面添加登錄界面首先創(chuàng)建密碼表。在“connection.h”文件的createConnecti

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論