版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第17章
【綜合實(shí)例】電子商城系統(tǒng)——商品管理系統(tǒng)功能需求第17章【綜合實(shí)例】電子商城系統(tǒng)——商品管理系統(tǒng)功能需求電子商城商品管理系統(tǒng)的主要功能如下:(1)管理員口令登錄,密碼采用MD5加密算法封裝驗(yàn)證。(2)瀏覽庫(kù)存商品信息,采用Qt數(shù)據(jù)網(wǎng)格控件實(shí)現(xiàn)。(3)商品入庫(kù)和清倉(cāng),用表單錄入商品信息(可指定商品類別、進(jìn)價(jià)、售價(jià)、入庫(kù)數(shù)量等,還可上傳商品樣照)。(4)預(yù)售訂單功能。選擇指定數(shù)量的庫(kù)存商品出售,系統(tǒng)自動(dòng)計(jì)算出應(yīng)付款總金額并顯示銷售清單,用戶一次可預(yù)售多種商品,然后統(tǒng)一下訂單。商品管理系統(tǒng)功能需求電子商城商品管理系統(tǒng)的主要功能如下:商品管理系統(tǒng)功能需求201登
錄
功
能01登錄功能3登
錄
功
能初始啟動(dòng)程序,顯示登錄界面(如圖17.1所示)。輸入管理員賬號(hào)及口令,單擊“登錄”按鈕執(zhí)行驗(yàn)證,口令用Qt內(nèi)置的MD5算法做加密處理后先存于MySQL數(shù)據(jù)庫(kù)中,若驗(yàn)證不通過(guò)則彈出警告提示框。登錄功能初始啟動(dòng)程序,顯示登錄界面(如圖17.1402新品入庫(kù)功能02新品入庫(kù)功能5新品入庫(kù)功能在“新品入庫(kù)”頁(yè)上可看到全部庫(kù)存的商品信息(商品名稱、進(jìn)價(jià)、售價(jià)和庫(kù)存量),用戶可輸入(或選擇)新品信息,將其錄入系統(tǒng)中;也可選擇庫(kù)中已有的商品執(zhí)行清倉(cāng)操作,如圖17.2所示。新品入庫(kù)功能在“新品入庫(kù)”頁(yè)上可看到全部庫(kù)存的商品信息(商品603預(yù)售訂單功能03預(yù)售訂單功能7預(yù)售訂單功能在“預(yù)售訂單”頁(yè)上,用戶從左邊表單下拉列表中選擇要預(yù)售的商品類別和名稱,表單會(huì)自動(dòng)聯(lián)動(dòng)顯示出該商品的單價(jià)、庫(kù)存、照片,并根據(jù)用戶所指定的售出數(shù)量算出總價(jià),如圖17.3所示。預(yù)售訂單功能在“預(yù)售訂單”頁(yè)上,用戶從左邊表單下拉列表中選擇8第17章
【綜合實(shí)例】電子商城系統(tǒng)——項(xiàng)目開發(fā)準(zhǔn)備第17章【綜合實(shí)例】電子商城系統(tǒng)——項(xiàng)目開發(fā)準(zhǔn)備01項(xiàng)
目
配
置01項(xiàng)目配置10項(xiàng)目配置(1)創(chuàng)建Qt桌面應(yīng)用程序項(xiàng)目,項(xiàng)目名稱為“eMarket”。創(chuàng)建完成在QtCreator開發(fā)環(huán)境中單擊左側(cè)欄的
按鈕切換至項(xiàng)目配置模式,如圖17.4所示。(2)修改項(xiàng)目的.pro配置文件,在其中添加配置項(xiàng)。配置文件eM內(nèi)容如下(加黑處為需要修改添加的地方)。項(xiàng)目配置(1)創(chuàng)建Qt桌面應(yīng)用程序項(xiàng)目,項(xiàng)目名稱為“eMar1102數(shù)據(jù)庫(kù)準(zhǔn)備1.創(chuàng)建數(shù)據(jù)庫(kù)2.設(shè)計(jì)表3.創(chuàng)建視圖02數(shù)據(jù)庫(kù)準(zhǔn)備1.創(chuàng)建數(shù)據(jù)庫(kù)2.設(shè)計(jì)表3.創(chuàng)建視圖12數(shù)據(jù)庫(kù)準(zhǔn)備1.創(chuàng)建數(shù)據(jù)庫(kù)在MySQL中創(chuàng)建數(shù)據(jù)庫(kù),名稱為emarket,其中建立5個(gè)表,分別為category表(商品類別表)、commodity表(商品表)、member表(會(huì)員表)、orders表(訂單表)和orderitems表(訂單項(xiàng)表)。2.設(shè)計(jì)表(1)表結(jié)構(gòu)設(shè)計(jì)對(duì)以上建好的各表設(shè)計(jì)其表結(jié)構(gòu)字段屬性如下。category表設(shè)計(jì)見表17.1。列
名類
型長(zhǎng)
度允許空值說(shuō)
明CategoryIDint6否商品類別編號(hào),主鍵,自動(dòng)遞增Namechar16否商品類別名稱數(shù)據(jù)庫(kù)準(zhǔn)備1.創(chuàng)建數(shù)據(jù)庫(kù)列名類型長(zhǎng)度13數(shù)據(jù)庫(kù)準(zhǔn)備commodity表設(shè)計(jì)見表17.2。列
名類
型長(zhǎng)
度允許空值說(shuō)
明CommodityIDint6否商品編號(hào),主鍵,自動(dòng)遞增CategoryIDint6否商品類別編號(hào)Namechar32否商品名稱Pictureblob默認(rèn)是商品圖片InputPricefloat6,2位小數(shù)否商品購(gòu)入價(jià)格(進(jìn)價(jià))OutputPricefloat6,2位小數(shù)否商品售出價(jià)格(單價(jià))Amountint6否商品庫(kù)存量數(shù)據(jù)庫(kù)準(zhǔn)備commodity表設(shè)計(jì)見表17.2。列名14數(shù)據(jù)庫(kù)準(zhǔn)備member表設(shè)計(jì)見表17.3。列
名類
型長(zhǎng)
度允許空值說(shuō)
明MemberIDchar16否會(huì)員賬號(hào),主鍵PassWordchar50否登錄口令(以MD5加密存儲(chǔ))Namevarchar32否會(huì)員名Sexbit1否性別:1表示男,0表示女,默認(rèn)1Emailvarchar32是電子郵箱Addressvarchar128是聯(lián)系地址Phonechar16是聯(lián)系電話RegisterDatedate默認(rèn)否注冊(cè)日期數(shù)據(jù)庫(kù)準(zhǔn)備member表設(shè)計(jì)見表17.3。列名類15數(shù)據(jù)庫(kù)準(zhǔn)備orders表設(shè)計(jì)見表17.4。列
名類
型長(zhǎng)
度允許空值說(shuō)
明OrderIDint6否訂單編號(hào),主鍵,自動(dòng)遞增MemberIDchar16否會(huì)員賬號(hào)PaySumfloat6,2位小數(shù)是付款總金額PayWayvarchar32是付款方式OTimedatetime默認(rèn)是下單日期時(shí)間orderitems表設(shè)計(jì)見表17.5。列
名類
型長(zhǎng)
度允許空值說(shuō)
明OrderIDint6否訂單編號(hào),主鍵CommodityIDint6否商品編號(hào),主鍵Countint11否數(shù)量Affirmbit1否是否確認(rèn):0沒(méi)有確認(rèn),1確認(rèn),默認(rèn)0SendGoodsbit1否是否發(fā)貨:0沒(méi)有發(fā)貨,1發(fā)貨,默認(rèn)0數(shù)據(jù)庫(kù)準(zhǔn)備orders表設(shè)計(jì)見表17.4。列名類16數(shù)據(jù)庫(kù)準(zhǔn)備(2)外鍵關(guān)聯(lián)設(shè)計(jì)好表結(jié)構(gòu)之后,為表之間建立外鍵關(guān)聯(lián)。本例要在commodity、orders和orderitems表上建立4個(gè)外鍵關(guān)聯(lián)。①commodity表外鍵CategoryID引用category表主鍵,在NavicatforMySQL數(shù)據(jù)庫(kù)可視化工具的commodity表設(shè)計(jì)窗口中選擇“外鍵”選項(xiàng)卡,如圖17.5所示設(shè)置即可。數(shù)據(jù)庫(kù)準(zhǔn)備(2)外鍵關(guān)聯(lián)17數(shù)據(jù)庫(kù)準(zhǔn)備②orders表外鍵MemberID引用member表主鍵,在orders表設(shè)計(jì)窗口中選擇“外鍵”選項(xiàng)卡,按如圖17.6所示進(jìn)行設(shè)置即可。數(shù)據(jù)庫(kù)準(zhǔn)備②orders表18數(shù)據(jù)庫(kù)準(zhǔn)備③orderitems表在該表上要設(shè)置兩個(gè)外鍵:OrderID引用orders表的主鍵OrderID,CommodityID引用commodity表的主鍵CommodityID。在orderitems表設(shè)計(jì)窗口中選擇“外鍵”選項(xiàng)卡,按如圖17.7所示進(jìn)行設(shè)置即可。數(shù)據(jù)庫(kù)準(zhǔn)備③orderitems表19數(shù)據(jù)庫(kù)準(zhǔn)備(3)數(shù)據(jù)錄入設(shè)計(jì)好表及其關(guān)聯(lián)之后,往各表中預(yù)先錄入一些數(shù)據(jù)記錄以供后面測(cè)試運(yùn)行程序之用,如圖17.8~圖17.10所示。數(shù)據(jù)庫(kù)準(zhǔn)備(3)數(shù)據(jù)錄入20數(shù)據(jù)庫(kù)準(zhǔn)備圖17.10member表數(shù)據(jù)為體現(xiàn)實(shí)際應(yīng)用,本章實(shí)例所用的商品信息皆是從真實(shí)的電商網(wǎng)站選取,各商品的樣品圖片由本書隨源代碼提供,讀者可預(yù)先編寫以下代碼將其錄入數(shù)據(jù)庫(kù)commodity表的Picture字段。數(shù)據(jù)庫(kù)準(zhǔn)備圖17.10member表數(shù)據(jù)為體現(xiàn)實(shí)際應(yīng)用,21數(shù)據(jù)庫(kù)準(zhǔn)備3.創(chuàng)建視圖根據(jù)應(yīng)用需要,本例要?jiǎng)?chuàng)建一個(gè)視圖commodity_inf,用于顯示商品的基本信息(商品名稱、進(jìn)價(jià)、售價(jià)和庫(kù)存),創(chuàng)建視圖的操作如下。展開數(shù)據(jù)庫(kù)節(jié)點(diǎn),右擊“視圖”→“新建視圖”,打開MySQL的視圖創(chuàng)建工具,如圖17.11所示。數(shù)據(jù)庫(kù)準(zhǔn)備3.創(chuàng)建視圖22第17章
【綜合實(shí)例】電子商城系統(tǒng)——商品管理系統(tǒng)界面設(shè)計(jì)第17章【綜合實(shí)例】電子商城系統(tǒng)——商品管理系統(tǒng)界面設(shè)計(jì)01總
體
設(shè)
計(jì)01總體設(shè)計(jì)24總體設(shè)計(jì)在開發(fā)環(huán)境項(xiàng)目目錄樹狀視圖中,雙擊mainwindow.ui切換至可視化界面設(shè)計(jì)模式,如圖17.12所示,在其上拖曳設(shè)計(jì)出商品管理系統(tǒng)的整個(gè)圖形界面。總體設(shè)計(jì)在開發(fā)環(huán)境項(xiàng)目目錄樹狀視圖中,雙擊mainwindo2502“新品入庫(kù)”頁(yè)02“新品入庫(kù)”頁(yè)26“新品入庫(kù)”頁(yè)“新品入庫(kù)”頁(yè)界面設(shè)計(jì)效果如圖17.13所示?!靶缕啡霂?kù)”頁(yè)界面上各控件的屬性設(shè)置見表17.6。“新品入庫(kù)”頁(yè)“新品入庫(kù)”頁(yè)界面設(shè)計(jì)效果如圖17.13所示。27“新品入庫(kù)”頁(yè)表17.6“新品入庫(kù)”頁(yè)界面上各控件的屬性設(shè)置序
號(hào)名
稱類
型屬性設(shè)置①newCategoryComboBoxQComboBox—②newNameLineEditQLineEdit—③newInputPriceLineEditQLineEdit—④newOutputPriceLineEditQLineEdit—⑤newCountSpinBoxQSpinBoxalignment:水平的,AlignHCenter;value:1⑥newUploadPushButtonQPushButtontext:上傳...⑦newPictureLabelQLabelgeometry:寬度151,高度151;frameShape:Box;frameShadow:Sunken;text:空;scaledContents:勾選⑧newPutinStorePushButtonQPushButtontext:入庫(kù)⑨newClearancePushButtonQPushButtontext:清倉(cāng)⑩commodityTableViewQTableViewhorizontalHeaderVisible:勾選;horizontalHeaderDefaultSectionSize:120;horizontalHeaderMinimumSectionSize:25;horizontalHeaderStretchLastSection:勾選;verticalHeaderVisible:取消勾選“新品入庫(kù)”頁(yè)表17.6“新品入庫(kù)”頁(yè)界面上各控件的屬性設(shè)2803“預(yù)售訂單”頁(yè)03“預(yù)售訂單”頁(yè)29“預(yù)售訂單”頁(yè)“預(yù)售訂單”頁(yè)界面設(shè)計(jì)效果如圖17.14所示。“預(yù)售訂單”頁(yè)界面上各個(gè)控件的屬性設(shè)置見表17.7?!邦A(yù)售訂單”頁(yè)“預(yù)售訂單”頁(yè)界面設(shè)計(jì)效果如圖17.14所示。30“預(yù)售訂單”頁(yè)表17.7“預(yù)售訂單”頁(yè)界面上各控件的屬性設(shè)置序
號(hào)名
稱類
型屬性設(shè)置①preCategoryComboBoxQComboBox—②preNameComboBoxQComboBox—③preOutputPriceLabelQLabelframeShape:Box;frameShadow:Sunken;text:空④preAmountLabelQLabelframeShape:Box;frameShadow:Sunken;text:空⑤preCountSpinBoxQSpinBoxalignment:水平的,AlignHCenter;value:1⑥preTotalLabelQLabelframeShape:Box;frameShadow:Sunken;text:空⑦prePictureLabelQLabelgeometry:寬度151,高度151;frameShape:Box;frameShadow:Sunken;text:空;scaledContents:勾選⑧preSellPushButtonQPushButtontext:出售⑨prePlaceOrderPushButtonQPushButtonenabled:取消勾選;text:下單⑩sellListWidgetQListWidgetgeometry:寬度441,高度311“預(yù)售訂單”頁(yè)表17.7“預(yù)售訂單”頁(yè)界面上各控件的屬性設(shè)3104登
錄
窗
口1.創(chuàng)建步驟2.窗口設(shè)計(jì)04登錄窗口1.創(chuàng)建步驟2.窗口設(shè)計(jì)321.創(chuàng)建步驟(1)右擊項(xiàng)目名,選擇“添加新文件”菜單項(xiàng),彈出“新建文件”對(duì)話框,如圖17.15所示,選擇模板“Qt”→“Qt設(shè)計(jì)師界面類”,單擊“Choose...”按鈕。1.創(chuàng)建步驟(1)右擊項(xiàng)目名,選擇“添加新文件”菜單項(xiàng),彈出331.創(chuàng)建步驟(2)在“Qt設(shè)計(jì)器界面類”對(duì)話框中,選擇界面模板為“DialogwithoutButtons”,如圖17.16所示,單擊“下一步”按鈕。1.創(chuàng)建步驟(2)在“Qt設(shè)計(jì)器界面類”對(duì)話框中,選擇界面模341.創(chuàng)建步驟(3)在導(dǎo)航頁(yè)上,將登錄窗口所對(duì)應(yīng)的類名命名為“LoginDialog”,如圖17.17所示,單擊“下一步”按鈕。1.創(chuàng)建步驟(3)在導(dǎo)航頁(yè)上,將登錄窗口所對(duì)應(yīng)的類名命名為“351.創(chuàng)建步驟(4)在“項(xiàng)目管理”頁(yè)可看到即將添加到項(xiàng)目中的源文件名,確認(rèn)無(wú)誤后,單擊“完成”按鈕,如圖17.18所示。1.創(chuàng)建步驟(4)在“項(xiàng)目管理”頁(yè)可看到即將添加到項(xiàng)目中的源362.窗口設(shè)計(jì)新添加的登錄窗口可以像程序主窗體一樣在可視化設(shè)計(jì)器中進(jìn)行設(shè)計(jì),我們向其中拖入若干控件,最終效果如圖17.19所示,為便于指示,我們對(duì)這些控件也加了①、②、③,…數(shù)字標(biāo)注。2.窗口設(shè)計(jì)新添加的登錄窗口可以像程序主窗體一樣在可視化設(shè)計(jì)372.窗口設(shè)計(jì)登錄窗口界面上各控件的屬性設(shè)置見表17.8。序
號(hào)名
稱類
型屬性設(shè)置①label_3QLabeltext:歡迎進(jìn)入電子商城;font:微軟雅黑,16;alignment:水平的,AlignHCenter②labelQLabeltext:管理員:;font:微軟雅黑,12③adminLineEditQLineEditfont:微軟雅黑,14;text:b02020622④label_2QLabeltext:口
令:;font:微軟雅黑,12⑤pwdLineEditQLineEditfont:微軟雅黑,14;text:空;echoMode:Password⑥loginPushButtonQPushButtonfont:微軟雅黑,12;text:登
錄⑦exitPushButtonQPushButtonfont:微軟雅黑,12;text:退
出2.窗口設(shè)計(jì)登錄窗口界面上各控件的屬性設(shè)置見表17.8。序38第17章
【綜合實(shí)例】電子商城系統(tǒng)——商品管理系統(tǒng)功能實(shí)現(xiàn)第17章【綜合實(shí)例】電子商城系統(tǒng)——商品管理系統(tǒng)功能實(shí)現(xiàn)01登錄功能實(shí)現(xiàn)01登錄功能實(shí)現(xiàn)40登錄功能實(shí)現(xiàn)登錄功能實(shí)現(xiàn)在logindialog.h頭文件和logindialog.cpp源文件中。首先,在logindialog.h頭文件中聲明變量和方法,完整代碼。然后,在logindialog.cpp源文件中實(shí)現(xiàn)登錄驗(yàn)證功能,完整代碼。其中,(a)QstringpwdMd5=strToMd5(ui->pwdLineEdit->text());:由于從數(shù)據(jù)庫(kù)中查出的口令字符串是已經(jīng)過(guò)MD5加密的,故這里需要先使用自定義的MD5轉(zhuǎn)換函數(shù)strToMd5()將用戶輸入的口令字符串轉(zhuǎn)為MD5加密串后再與從數(shù)據(jù)庫(kù)中查出的內(nèi)容比較以驗(yàn)證。(b)qba=QCryptographicHash::hash(str.toLatin1(),QCryptographicHash::Md5);:Qt5提供了QCryptographicHash類,該類實(shí)現(xiàn)了生成密碼散列的方法,可用于生成二進(jìn)制或文本數(shù)據(jù)的加密散列值。該類目前支持MD4、MD5、SHA-1、SHA-224、SHA-256、SHA-384和SHA-512等多種加密算法。登錄功能實(shí)現(xiàn)登錄功能實(shí)現(xiàn)在logindialog.h頭文件和4102主體程序框架02主體程序框架42主體程序框架(1)main.cpp它是整個(gè)系統(tǒng)的主啟動(dòng)文件,代碼。其中,(a)if(!createMySqlConn()):createMySqlConn()是我們編寫的一個(gè)連接后臺(tái)數(shù)據(jù)庫(kù)的方法,它返回true表示連接成功,返回false表示失敗。程序在開始啟動(dòng)時(shí)就通過(guò)執(zhí)行該方法來(lái)檢查數(shù)據(jù)庫(kù)連接是否就緒。若連接不成功,系統(tǒng)則通過(guò)啟動(dòng)MySQL服務(wù)進(jìn)程的方式再嘗試一次;若依舊連接不成功,則提示連接失敗,交由用戶檢查排除故障。(b)if(logindlg.exec()==QDialog::Accepted):之前在登錄對(duì)話框的實(shí)現(xiàn)中,若用戶通過(guò)了口令驗(yàn)證則執(zhí)行對(duì)話框類的“QDialog::accept();”方法,在這里判斷對(duì)話框類的返回結(jié)果,即“QDialog::Accepted”表示驗(yàn)證通過(guò)。(2)mainwindow.h它是程序頭文件,包含程序中用到的各個(gè)全局變量的定義、方法聲明,完整的代碼。(3)mainwindow.cpp它是本程序的主體源文件,其中包含各方法功能的具體實(shí)現(xiàn)代碼,框架。主體程序框架(1)main.cpp4303界面初始化功能實(shí)現(xiàn)03界面初始化功能實(shí)現(xiàn)44界面初始化功能實(shí)現(xiàn)啟動(dòng)程序時(shí),首先需要對(duì)界面顯示的信息進(jìn)行初始化,在窗體的構(gòu)造方法MainWindow::MainWindow(QWidget*parent)中執(zhí)行我們定義的初始化主窗體方法initMainWindow(),該方法的具體實(shí)現(xiàn)代碼。本系統(tǒng)默認(rèn)顯示在前面的是“新品入庫(kù)”頁(yè),但是對(duì)于“預(yù)售訂單”頁(yè)也同樣會(huì)初始化其內(nèi)容。上段代碼中使用了loadPreCommodity()方法在預(yù)售訂單頁(yè)加載商品信息,該方法的實(shí)現(xiàn)代碼如下:voidMainWindow::loadPreCommodity(){QSqlQueryModel*commodityNameModel=newQSqlQueryModel(this);
//商品名稱模型數(shù)據(jù)commodityNameModel->setQuery(QString("selectNamefromcommoditywhereCategoryID=(selectCategoryIDfromcategorywhereName='%1')").arg(ui->preCategoryComboBox->currentText()));ui->preNameComboBox->setModel(commodityNameModel);
//商品名稱列表加載(“預(yù)售訂單”頁(yè))onPreNameComboBoxChange();}界面初始化功能實(shí)現(xiàn)啟動(dòng)程序時(shí),首先需要對(duì)界面顯示的信息進(jìn)行初45界面初始化功能實(shí)現(xiàn)這個(gè)方法只是在“預(yù)售訂單”頁(yè)加載了商品名稱的列表,為了能對(duì)應(yīng)顯示出當(dāng)前選中商品的其他信息項(xiàng),在最后又調(diào)用了onPreNameComboBoxChange()方法,其實(shí)現(xiàn)代碼如下:voidMainWindow::onPreNameComboBoxChange(){QSqlQueryModel*preCommodityModel=newQSqlQueryModel(this);
//商品表模型數(shù)據(jù)QStringname=ui->preNameComboBox->currentText(); //當(dāng)前選中的商品名preCommodityModel->setQuery("selectOutputPrice,Amount,PicturefromcommoditywhereName='"+name+"'"); //從數(shù)據(jù)庫(kù)中查出單價(jià)、庫(kù)存、照片等信息QModelIndexindex;index=preCommodityModel->index(0,0); //單價(jià)ui->preOutputPriceLabel->setText(preCommodityModel->data(index).toString());index=preCommodityModel->index(0,1); //庫(kù)存ui->preAmountLabel->setText(preCommodityModel->data(index).toString());ui->preCountSpinBox->setMaximum(ui->preAmountLabel->text().toInt());//下面開始獲取和展示照片QPixmapphoto;index=preCommodityModel->index(0,2);photo.loadFromData(preCommodityModel->data(index).toByteArray(),"JPG");ui->prePictureLabel->setPixmap(photo);//計(jì)算總價(jià)ui->preTotalLabel->setText(QString::number(ui->preOutputPriceLabel->text().toFloat()*ui->preCountSpinBox->value()));}界面初始化功能實(shí)現(xiàn)這個(gè)方法只是在“預(yù)售訂單”頁(yè)加載了商品名稱46界面初始化功能實(shí)現(xiàn)這樣做了之后,一開始啟動(dòng)程序直接切換至“預(yù)售訂單”頁(yè),就可以看到某個(gè)默認(rèn)顯示的商品信息,如圖17.20所示。界面初始化功能實(shí)現(xiàn)這樣做了之后,一開始啟動(dòng)程序直接切換至“預(yù)47界面初始化功能實(shí)現(xiàn)在第一個(gè)“新品入庫(kù)”頁(yè)中,默認(rèn)通過(guò)視圖commodity_inf加載了一個(gè)庫(kù)存所有商品信息的數(shù)據(jù)網(wǎng)格列表,該網(wǎng)格控件支持用戶選擇記錄并與左側(cè)的表單聯(lián)動(dòng),通過(guò)網(wǎng)格控件的單擊事件過(guò)程實(shí)現(xiàn):voidMainWindow::on_commodityTableView_clicked(constQModelIndex&index){onTableSelectChange(1);}界面初始化功能實(shí)現(xiàn)在第一個(gè)“新品入庫(kù)”頁(yè)中,默認(rèn)通過(guò)視圖co48界面初始化功能實(shí)現(xiàn)該事件過(guò)程向onTableSelectChange()方法傳入一個(gè)參數(shù)(為當(dāng)前選中的記錄項(xiàng)的索引),再由該方法實(shí)際執(zhí)行表單信息的更新,onTableSelectChange()方法的代碼如下:voidMainWindow::onTableSelectChange(introw){intr=1; //默認(rèn)索引為1if(row!=0)r=ui->commodityTableView->currentIndex().row();QModelIndexindex;index=commodity_model->index(r,0); //名稱ui->newNameLineEdit->setText(commodity_model->data(index).toString());index=commodity_model->index(r,1); //進(jìn)價(jià)ui->newInputPriceLineEdit->setText(commodity_model->data(index).toString());index=commodity_model->index(r,2); //售價(jià)ui->newOutputPriceLineEdit->setText(commodity_model->data(index).toString());showCommodityPhoto(); //商品樣照QSqlQueryquery;query.exec(QString("selectNamefromcategorywhereCategoryID=(selectCategoryIDfromcommoditywhereName='%1')").arg(ui->newNameLineEdit->text()));query.next();ui->newCategoryComboBox->setCurrentText(query.value(0).toString());
//實(shí)現(xiàn)類別聯(lián)動(dòng)}界面初始化功能實(shí)現(xiàn)該事件過(guò)程向onTableSelectCh49界面初始化功能實(shí)現(xiàn)以上代碼中使用showCommodityPhoto()方法來(lái)顯示商品樣照,該方法的代碼如下:voidMainWindow::showCommodityPhoto(){QPixmapphoto;QModelIndexindex;QSqlQueryModel*pictureModel=newQSqlQueryModel(this);
//商品樣照模型數(shù)據(jù)QStringname=ui->newNameLineEdit->text();pictureModel->setQuery("selectPicturefromcommoditywhereName='"+name+"'");index=pictureModel->index(0,0);photo.loadFromData(pictureModel->data(index).toByteArray(),"JPG"); //(a)ui->newPictureLabel->setPixmap(photo);}其中,(a)photo.loadFromData(pictureModel->data(index).toByteArray(),"JPG");:這里將從MySQL數(shù)據(jù)庫(kù)中讀取的字節(jié)數(shù)組類型的照片數(shù)據(jù)載入為Qt的QPixmap對(duì)象,再將其設(shè)為界面上標(biāo)簽的屬性即可在界面上顯出數(shù)據(jù)庫(kù)圖片類型字段的內(nèi)容。界面初始化功能實(shí)現(xiàn)以上代碼中使用showCommodityP5004新品入庫(kù)功能實(shí)現(xiàn)1.入庫(kù)操作2.選樣照3.清倉(cāng)操作04新品入庫(kù)功能實(shí)現(xiàn)1.入庫(kù)操作2.選樣照3.清倉(cāng)操作511.入庫(kù)操作本系統(tǒng)的第一個(gè)“新品入庫(kù)”頁(yè)是供商品倉(cāng)儲(chǔ)管理員登記錄入新進(jìn)商品信息的,在左側(cè)表單中填好(選擇)新品信息后,單擊“入庫(kù)”按鈕就可以將一件新的商品添加進(jìn)MySQL數(shù)據(jù)庫(kù)中?!叭霂?kù)”按鈕的單擊事件過(guò)程代碼。其中,(a)query.exec(QString("selectCategoryIDfromcategorywhereName='%1'").arg(ui->newCategoryComboBox->currentText()));:入庫(kù)新品的類別由管理員在界面“類別”列表中選擇,為簡(jiǎn)單起見,本例所有商品的類別是固定的,預(yù)先錄入數(shù)據(jù)庫(kù),暫不支持添加新類別。(b)query.exec(QString("insertintocommodity(CategoryID,Name,Picture,InputPrice,OutputPrice,Amount)values(%1,'%2',NULL,%3,%4,%5)").arg(categoryid).arg(name).arg(inputprice).arg(outputprice).arg(count));:這是Qt向MySQL數(shù)據(jù)庫(kù)執(zhí)行插入操作SQL語(yǔ)句的典型寫法,用“%”表示待定參數(shù);以.arg傳遞參數(shù)值,一條SQL語(yǔ)句可支持多個(gè).arg傳參方法,請(qǐng)讀者注意掌握這種書寫格式。(c)myPicImg.save(&buffer,"JPG");:這里使用一個(gè)QImage對(duì)象來(lái)存儲(chǔ)要寫入數(shù)據(jù)庫(kù)的照片數(shù)據(jù),它通過(guò)save()方法從QBuffer類型的緩存中載入照片數(shù)據(jù),這也是Qt保存圖片數(shù)據(jù)的通行方式。(d)query.addBindValue(var);:這里用SQL查詢類對(duì)象的addBindValue()方法綁定照片數(shù)據(jù)作為參數(shù)傳給SQL語(yǔ)句中“?”之處,這是Qt操作MySQL含參數(shù)SQL語(yǔ)句的另一種形式,也是通用的形式。1.入庫(kù)操作本系統(tǒng)的第一個(gè)“新品入庫(kù)”頁(yè)是供商品倉(cāng)儲(chǔ)管理員登522.選樣照用戶可從界面上傳預(yù)先準(zhǔn)備好的商品樣照錄入數(shù)據(jù)庫(kù),上傳樣照通過(guò)單擊“上傳...”按鈕實(shí)現(xiàn),其事件代碼為:voidMainWindow::on_newUploadPushButton_clicked(){QStringpicturename=QFileDialog::getOpenFileName(this,"選擇商品圖片",".","ImageFile(*.png*.jpg*.jpeg*.bmp)");if(picturename.isEmpty())return;myPicImg.load(picturename);ui->newPictureLabel->setPixmap(QPixmap::fromImage(myPicImg));}2.選樣照用戶可從界面上傳預(yù)先準(zhǔn)備好的商品樣照錄入數(shù)據(jù)庫(kù),上533.清倉(cāng)操作清倉(cāng)是入庫(kù)的逆操作,當(dāng)某件商品已售罄或不再需要時(shí),可直接單擊“清倉(cāng)”按鈕將其信息記錄從數(shù)據(jù)庫(kù)刪除,此按鈕的事件代碼為:voidMainWindow::on_newClearancePushButton_clicked(){QSqlQueryquery;query.exec(QString("deletefromcommoditywhereName='%1'").arg(ui->newNameLineEdit->text())); //刪除商品記錄//刷新界面ui->newNameLineEdit->setText("");ui->newInputPriceLineEdit->setText("");ui->newOutputPriceLineEdit->setText("");ui->newCountSpinBox->setValue(1);ui->newPictureLabel->clear();commodity_model->setTable("commodity_inf");commodity_model->select();ui->commodityTableView->setModel(commodity_model);
//刷新數(shù)據(jù)網(wǎng)格(“新品入庫(kù)”頁(yè))}3.清倉(cāng)操作清倉(cāng)是入庫(kù)的逆操作,當(dāng)某件商品已售罄或不再需要時(shí)5405預(yù)售訂單功能實(shí)現(xiàn)1.商品出售2.下訂單05預(yù)售訂單功能實(shí)現(xiàn)1.商品出售2.下訂單551.商品出售用戶可以選擇不同類別的不同商品,指定數(shù)量后出售。這里的“出售”準(zhǔn)確地說(shuō)只是預(yù)售,在未下單之前,用戶還可以添加新的商品進(jìn)訂單?!俺鍪邸卑粹o的單擊事件過(guò)程代碼。其中,(a)if(!myOrdered):本系統(tǒng)用一個(gè)全局變量myOrdered標(biāo)識(shí)當(dāng)前用戶是否處于出售(已開始購(gòu)買商品但尚未最后下單)狀態(tài),當(dāng)用戶第一次執(zhí)行“出售”操作時(shí),系統(tǒng)會(huì)向數(shù)據(jù)庫(kù)中寫入一條訂單信息并自動(dòng)生成訂單號(hào)(字段自增機(jī)制),此時(shí)將myOrdered置為true表示用戶處于出售狀態(tài),只有在最后執(zhí)行了下單操作后才會(huì)又將myOrdered置回false。(b)query.exec(QString("selectOrderIDfromorderswhereOTimeISNULL"));:只有執(zhí)行過(guò)下單操作的訂單才會(huì)在數(shù)據(jù)庫(kù)中記錄下單時(shí)間,并且程序邏輯只允許在完成當(dāng)前訂單下單之后才能開始一個(gè)新訂單,因此,在任一時(shí)刻數(shù)據(jù)庫(kù)中都至多只會(huì)有一個(gè)訂單的下單時(shí)間字段為空,可以根據(jù)這一字段是否為空來(lái)檢索出當(dāng)前訂單的訂單號(hào)。1.商品出售用戶可以選擇不同類別的不同商品,指定數(shù)量后出售。562.下訂單單擊“下單”按鈕來(lái)完成一個(gè)訂單,其事件過(guò)程代碼。其中,(a)QSqlDatabase::database().commit();:由于下單的一系列操作是一個(gè)完整不可分割的集合(原子操作),為保證數(shù)據(jù)庫(kù)中數(shù)據(jù)的完整一致性,只有在所有操作都成功完成的前提下才允許將修改提交到數(shù)據(jù)庫(kù),這里采用了MySQL的事務(wù)操作技術(shù)來(lái)保證一致性。2.下訂單單擊“下單”按鈕來(lái)完成一個(gè)訂單,其事件過(guò)程代碼。57第17章
【綜合實(shí)例】電子商城系統(tǒng)——商品管理系統(tǒng)運(yùn)行演示第17章【綜合實(shí)例】電子商城系統(tǒng)——商品管理系統(tǒng)運(yùn)行演示01登錄電子商城01登錄電子商城59登錄電子商城啟動(dòng)程序,首先出現(xiàn)的是如圖17.21所示的登錄界面。為方便讀者試運(yùn)行,我們?cè)跀?shù)據(jù)庫(kù)中已經(jīng)預(yù)先創(chuàng)建了一個(gè)管理員的用戶名“b02020622”,輸入口令后單擊“登錄”按鈕,出現(xiàn)商品管理系統(tǒng)主界面,如圖17.22所示。
登錄電子商城啟動(dòng)程序,首先出現(xiàn)的是如圖17.21所示的登錄界6002新品入庫(kù)和清倉(cāng)02新品入庫(kù)和清倉(cāng)61新品入庫(kù)和清倉(cāng)在左側(cè)表單中選擇類別和填寫事先準(zhǔn)備好的某件商品的信息,并單擊“上傳...”按鈕選擇其樣品照片,單擊“入庫(kù)”按鈕就能將該商品的記錄添加到數(shù)據(jù)庫(kù)中,并可從右邊數(shù)據(jù)網(wǎng)格列表中看到新加入的商品,如圖17.23所示。新品入庫(kù)和清倉(cāng)在左側(cè)表單中選擇類別和填寫事先準(zhǔn)備好的某件商品6203預(yù)售下訂單03預(yù)售下訂單63預(yù)售下訂單切換到“預(yù)售訂單”頁(yè),從左側(cè)表單中選擇一款商品后,單擊“出售”按鈕,右邊區(qū)域會(huì)顯示一條銷售記錄(包括售出時(shí)間、商品名、數(shù)量、單價(jià)和總價(jià)等信息),并彈出消息框提示該商品已加入訂單,如圖17.24所示。預(yù)售下訂單切換到“預(yù)售訂單”頁(yè),從左側(cè)表單中選擇一款商品后,64預(yù)售下訂單此時(shí),“下單”按鈕變?yōu)榭捎?,用戶可隨時(shí)單擊執(zhí)行下單操作,也可以繼續(xù)出售其他商品,并且在每次出售時(shí)還可指定該商品的出售數(shù)量,系統(tǒng)會(huì)自動(dòng)算出總價(jià),并將完整的銷售記錄添加在右邊區(qū)域,如圖17.25所示。預(yù)售下訂單此時(shí),“下單”按鈕變?yōu)榭捎?,用戶可隨時(shí)單擊執(zhí)行下單65預(yù)售下訂單出售完成后,單擊“下單”按鈕生成訂單并寫入MySQL數(shù)據(jù)庫(kù),系統(tǒng)彈出“下單成功!”消息提示,并在右區(qū)顯示出訂單信息,包括下單日期、訂單號(hào)和應(yīng)付款總額,其中應(yīng)付款總額是此單所有銷售記錄的總價(jià)相加的和,如圖17.26所示。預(yù)售下訂單出售完成后,單擊“下單”按鈕生成訂單并寫入MySQ66第17章
【綜合實(shí)例】電子商城系統(tǒng)——商品管理系統(tǒng)功能需求第17章【綜合實(shí)例】電子商城系統(tǒng)——商品管理系統(tǒng)功能需求電子商城商品管理系統(tǒng)的主要功能如下:(1)管理員口令登錄,密碼采用MD5加密算法封裝驗(yàn)證。(2)瀏覽庫(kù)存商品信息,采用Qt數(shù)據(jù)網(wǎng)格控件實(shí)現(xiàn)。(3)商品入庫(kù)和清倉(cāng),用表單錄入商品信息(可指定商品類別、進(jìn)價(jià)、售價(jià)、入庫(kù)數(shù)量等,還可上傳商品樣照)。(4)預(yù)售訂單功能。選擇指定數(shù)量的庫(kù)存商品出售,系統(tǒng)自動(dòng)計(jì)算出應(yīng)付款總金額并顯示銷售清單,用戶一次可預(yù)售多種商品,然后統(tǒng)一下訂單。商品管理系統(tǒng)功能需求電子商城商品管理系統(tǒng)的主要功能如下:商品管理系統(tǒng)功能需求6801登
錄
功
能01登錄功能69登
錄
功
能初始啟動(dòng)程序,顯示登錄界面(如圖17.1所示)。輸入管理員賬號(hào)及口令,單擊“登錄”按鈕執(zhí)行驗(yàn)證,口令用Qt內(nèi)置的MD5算法做加密處理后先存于MySQL數(shù)據(jù)庫(kù)中,若驗(yàn)證不通過(guò)則彈出警告提示框。登錄功能初始啟動(dòng)程序,顯示登錄界面(如圖17.17002新品入庫(kù)功能02新品入庫(kù)功能71新品入庫(kù)功能在“新品入庫(kù)”頁(yè)上可看到全部庫(kù)存的商品信息(商品名稱、進(jìn)價(jià)、售價(jià)和庫(kù)存量),用戶可輸入(或選擇)新品信息,將其錄入系統(tǒng)中;也可選擇庫(kù)中已有的商品執(zhí)行清倉(cāng)操作,如圖17.2所示。新品入庫(kù)功能在“新品入庫(kù)”頁(yè)上可看到全部庫(kù)存的商品信息(商品7203預(yù)售訂單功能03預(yù)售訂單功能73預(yù)售訂單功能在“預(yù)售訂單”頁(yè)上,用戶從左邊表單下拉列表中選擇要預(yù)售的商品類別和名稱,表單會(huì)自動(dòng)聯(lián)動(dòng)顯示出該商品的單價(jià)、庫(kù)存、照片,并根據(jù)用戶所指定的售出數(shù)量算出總價(jià),如圖17.3所示。預(yù)售訂單功能在“預(yù)售訂單”頁(yè)上,用戶從左邊表單下拉列表中選擇74第17章
【綜合實(shí)例】電子商城系統(tǒng)——項(xiàng)目開發(fā)準(zhǔn)備第17章【綜合實(shí)例】電子商城系統(tǒng)——項(xiàng)目開發(fā)準(zhǔn)備01項(xiàng)
目
配
置01項(xiàng)目配置76項(xiàng)目配置(1)創(chuàng)建Qt桌面應(yīng)用程序項(xiàng)目,項(xiàng)目名稱為“eMarket”。創(chuàng)建完成在QtCreator開發(fā)環(huán)境中單擊左側(cè)欄的
按鈕切換至項(xiàng)目配置模式,如圖17.4所示。(2)修改項(xiàng)目的.pro配置文件,在其中添加配置項(xiàng)。配置文件eM內(nèi)容如下(加黑處為需要修改添加的地方)。項(xiàng)目配置(1)創(chuàng)建Qt桌面應(yīng)用程序項(xiàng)目,項(xiàng)目名稱為“eMar7702數(shù)據(jù)庫(kù)準(zhǔn)備1.創(chuàng)建數(shù)據(jù)庫(kù)2.設(shè)計(jì)表3.創(chuàng)建視圖02數(shù)據(jù)庫(kù)準(zhǔn)備1.創(chuàng)建數(shù)據(jù)庫(kù)2.設(shè)計(jì)表3.創(chuàng)建視圖78數(shù)據(jù)庫(kù)準(zhǔn)備1.創(chuàng)建數(shù)據(jù)庫(kù)在MySQL中創(chuàng)建數(shù)據(jù)庫(kù),名稱為emarket,其中建立5個(gè)表,分別為category表(商品類別表)、commodity表(商品表)、member表(會(huì)員表)、orders表(訂單表)和orderitems表(訂單項(xiàng)表)。2.設(shè)計(jì)表(1)表結(jié)構(gòu)設(shè)計(jì)對(duì)以上建好的各表設(shè)計(jì)其表結(jié)構(gòu)字段屬性如下。category表設(shè)計(jì)見表17.1。列
名類
型長(zhǎng)
度允許空值說(shuō)
明CategoryIDint6否商品類別編號(hào),主鍵,自動(dòng)遞增Namechar16否商品類別名稱數(shù)據(jù)庫(kù)準(zhǔn)備1.創(chuàng)建數(shù)據(jù)庫(kù)列名類型長(zhǎng)度79數(shù)據(jù)庫(kù)準(zhǔn)備commodity表設(shè)計(jì)見表17.2。列
名類
型長(zhǎng)
度允許空值說(shuō)
明CommodityIDint6否商品編號(hào),主鍵,自動(dòng)遞增CategoryIDint6否商品類別編號(hào)Namechar32否商品名稱Pictureblob默認(rèn)是商品圖片InputPricefloat6,2位小數(shù)否商品購(gòu)入價(jià)格(進(jìn)價(jià))OutputPricefloat6,2位小數(shù)否商品售出價(jià)格(單價(jià))Amountint6否商品庫(kù)存量數(shù)據(jù)庫(kù)準(zhǔn)備commodity表設(shè)計(jì)見表17.2。列名80數(shù)據(jù)庫(kù)準(zhǔn)備member表設(shè)計(jì)見表17.3。列
名類
型長(zhǎng)
度允許空值說(shuō)
明MemberIDchar16否會(huì)員賬號(hào),主鍵PassWordchar50否登錄口令(以MD5加密存儲(chǔ))Namevarchar32否會(huì)員名Sexbit1否性別:1表示男,0表示女,默認(rèn)1Emailvarchar32是電子郵箱Addressvarchar128是聯(lián)系地址Phonechar16是聯(lián)系電話RegisterDatedate默認(rèn)否注冊(cè)日期數(shù)據(jù)庫(kù)準(zhǔn)備member表設(shè)計(jì)見表17.3。列名類81數(shù)據(jù)庫(kù)準(zhǔn)備orders表設(shè)計(jì)見表17.4。列
名類
型長(zhǎng)
度允許空值說(shuō)
明OrderIDint6否訂單編號(hào),主鍵,自動(dòng)遞增MemberIDchar16否會(huì)員賬號(hào)PaySumfloat6,2位小數(shù)是付款總金額PayWayvarchar32是付款方式OTimedatetime默認(rèn)是下單日期時(shí)間orderitems表設(shè)計(jì)見表17.5。列
名類
型長(zhǎng)
度允許空值說(shuō)
明OrderIDint6否訂單編號(hào),主鍵CommodityIDint6否商品編號(hào),主鍵Countint11否數(shù)量Affirmbit1否是否確認(rèn):0沒(méi)有確認(rèn),1確認(rèn),默認(rèn)0SendGoodsbit1否是否發(fā)貨:0沒(méi)有發(fā)貨,1發(fā)貨,默認(rèn)0數(shù)據(jù)庫(kù)準(zhǔn)備orders表設(shè)計(jì)見表17.4。列名類82數(shù)據(jù)庫(kù)準(zhǔn)備(2)外鍵關(guān)聯(lián)設(shè)計(jì)好表結(jié)構(gòu)之后,為表之間建立外鍵關(guān)聯(lián)。本例要在commodity、orders和orderitems表上建立4個(gè)外鍵關(guān)聯(lián)。①commodity表外鍵CategoryID引用category表主鍵,在NavicatforMySQL數(shù)據(jù)庫(kù)可視化工具的commodity表設(shè)計(jì)窗口中選擇“外鍵”選項(xiàng)卡,如圖17.5所示設(shè)置即可。數(shù)據(jù)庫(kù)準(zhǔn)備(2)外鍵關(guān)聯(lián)83數(shù)據(jù)庫(kù)準(zhǔn)備②orders表外鍵MemberID引用member表主鍵,在orders表設(shè)計(jì)窗口中選擇“外鍵”選項(xiàng)卡,按如圖17.6所示進(jìn)行設(shè)置即可。數(shù)據(jù)庫(kù)準(zhǔn)備②orders表84數(shù)據(jù)庫(kù)準(zhǔn)備③orderitems表在該表上要設(shè)置兩個(gè)外鍵:OrderID引用orders表的主鍵OrderID,CommodityID引用commodity表的主鍵CommodityID。在orderitems表設(shè)計(jì)窗口中選擇“外鍵”選項(xiàng)卡,按如圖17.7所示進(jìn)行設(shè)置即可。數(shù)據(jù)庫(kù)準(zhǔn)備③orderitems表85數(shù)據(jù)庫(kù)準(zhǔn)備(3)數(shù)據(jù)錄入設(shè)計(jì)好表及其關(guān)聯(lián)之后,往各表中預(yù)先錄入一些數(shù)據(jù)記錄以供后面測(cè)試運(yùn)行程序之用,如圖17.8~圖17.10所示。數(shù)據(jù)庫(kù)準(zhǔn)備(3)數(shù)據(jù)錄入86數(shù)據(jù)庫(kù)準(zhǔn)備圖17.10member表數(shù)據(jù)為體現(xiàn)實(shí)際應(yīng)用,本章實(shí)例所用的商品信息皆是從真實(shí)的電商網(wǎng)站選取,各商品的樣品圖片由本書隨源代碼提供,讀者可預(yù)先編寫以下代碼將其錄入數(shù)據(jù)庫(kù)commodity表的Picture字段。數(shù)據(jù)庫(kù)準(zhǔn)備圖17.10member表數(shù)據(jù)為體現(xiàn)實(shí)際應(yīng)用,87數(shù)據(jù)庫(kù)準(zhǔn)備3.創(chuàng)建視圖根據(jù)應(yīng)用需要,本例要?jiǎng)?chuàng)建一個(gè)視圖commodity_inf,用于顯示商品的基本信息(商品名稱、進(jìn)價(jià)、售價(jià)和庫(kù)存),創(chuàng)建視圖的操作如下。展開數(shù)據(jù)庫(kù)節(jié)點(diǎn),右擊“視圖”→“新建視圖”,打開MySQL的視圖創(chuàng)建工具,如圖17.11所示。數(shù)據(jù)庫(kù)準(zhǔn)備3.創(chuàng)建視圖88第17章
【綜合實(shí)例】電子商城系統(tǒng)——商品管理系統(tǒng)界面設(shè)計(jì)第17章【綜合實(shí)例】電子商城系統(tǒng)——商品管理系統(tǒng)界面設(shè)計(jì)01總
體
設(shè)
計(jì)01總體設(shè)計(jì)90總體設(shè)計(jì)在開發(fā)環(huán)境項(xiàng)目目錄樹狀視圖中,雙擊mainwindow.ui切換至可視化界面設(shè)計(jì)模式,如圖17.12所示,在其上拖曳設(shè)計(jì)出商品管理系統(tǒng)的整個(gè)圖形界面??傮w設(shè)計(jì)在開發(fā)環(huán)境項(xiàng)目目錄樹狀視圖中,雙擊mainwindo9102“新品入庫(kù)”頁(yè)02“新品入庫(kù)”頁(yè)92“新品入庫(kù)”頁(yè)“新品入庫(kù)”頁(yè)界面設(shè)計(jì)效果如圖17.13所示?!靶缕啡霂?kù)”頁(yè)界面上各控件的屬性設(shè)置見表17.6?!靶缕啡霂?kù)”頁(yè)“新品入庫(kù)”頁(yè)界面設(shè)計(jì)效果如圖17.13所示。93“新品入庫(kù)”頁(yè)表17.6“新品入庫(kù)”頁(yè)界面上各控件的屬性設(shè)置序
號(hào)名
稱類
型屬性設(shè)置①newCategoryComboBoxQComboBox—②newNameLineEditQLineEdit—③newInputPriceLineEditQLineEdit—④newOutputPriceLineEditQLineEdit—⑤newCountSpinBoxQSpinBoxalignment:水平的,AlignHCenter;value:1⑥newUploadPushButtonQPushButtontext:上傳...⑦newPictureLabelQLabelgeometry:寬度151,高度151;frameShape:Box;frameShadow:Sunken;text:空;scaledContents:勾選⑧newPutinStorePushButtonQPushButtontext:入庫(kù)⑨newClearancePushButtonQPushButtontext:清倉(cāng)⑩commodityTableViewQTableViewhorizontalHeaderVisible:勾選;horizontalHeaderDefaultSectionSize:120;horizontalHeaderMinimumSectionSize:25;horizontalHeaderStretchLastSection:勾選;verticalHeaderVisible:取消勾選“新品入庫(kù)”頁(yè)表17.6“新品入庫(kù)”頁(yè)界面上各控件的屬性設(shè)9403“預(yù)售訂單”頁(yè)03“預(yù)售訂單”頁(yè)95“預(yù)售訂單”頁(yè)“預(yù)售訂單”頁(yè)界面設(shè)計(jì)效果如圖17.14所示。“預(yù)售訂單”頁(yè)界面上各個(gè)控件的屬性設(shè)置見表17.7?!邦A(yù)售訂單”頁(yè)“預(yù)售訂單”頁(yè)界面設(shè)計(jì)效果如圖17.14所示。96“預(yù)售訂單”頁(yè)表17.7“預(yù)售訂單”頁(yè)界面上各控件的屬性設(shè)置序
號(hào)名
稱類
型屬性設(shè)置①preCategoryComboBoxQComboBox—②preNameComboBoxQComboBox—③preOutputPriceLabelQLabelframeShape:Box;frameShadow:Sunken;text:空④preAmountLabelQLabelframeShape:Box;frameShadow:Sunken;text:空⑤preCountSpinBoxQSpinBoxalignment:水平的,AlignHCenter;value:1⑥preTotalLabelQLabelframeShape:Box;frameShadow:Sunken;text:空⑦prePictureLabelQLabelgeometry:寬度151,高度151;frameShape:Box;frameShadow:Sunken;text:空;scaledContents:勾選⑧preSellPushButtonQPushButtontext:出售⑨prePlaceOrderPushButtonQPushButtonenabled:取消勾選;text:下單⑩sellListWidgetQListWidgetgeometry:寬度441,高度311“預(yù)售訂單”頁(yè)表17.7“預(yù)售訂單”頁(yè)界面上各控件的屬性設(shè)9704登
錄
窗
口1.創(chuàng)建步驟2.窗口設(shè)計(jì)04登錄窗口1.創(chuàng)建步驟2.窗口設(shè)計(jì)981.創(chuàng)建步驟(1)右擊項(xiàng)目名,選擇“添加新文件”菜單項(xiàng),彈出“新建文件”對(duì)話框,如圖17.15所示,選擇模板“Qt”→“Qt設(shè)計(jì)師界面類”,單擊“Choose...”按鈕。1.創(chuàng)建步驟(1)右擊項(xiàng)目名,選擇“添加新文件”菜單項(xiàng),彈出991.創(chuàng)建步驟(2)在“Qt設(shè)計(jì)器界面類”對(duì)話框中,選擇界面模板為“DialogwithoutButtons”,如圖17.16所示,單擊“下一步”按鈕。1.創(chuàng)建步驟(2)在“Qt設(shè)計(jì)器界面類”對(duì)話框中,選擇界面模1001.創(chuàng)建步驟(3)在導(dǎo)航頁(yè)上,將登錄窗口所對(duì)應(yīng)的類名命名為“LoginDialog”,如圖17.17所示,單擊“下一步”按鈕。1.創(chuàng)建步驟(3)在導(dǎo)航頁(yè)上,將登錄窗口所對(duì)應(yīng)的類名命名為“1011.創(chuàng)建步驟(4)在“項(xiàng)目管理”頁(yè)可看到即將添加到項(xiàng)目中的源文件名,確認(rèn)無(wú)誤后,單擊“完成”按鈕,如圖17.18所示。1.創(chuàng)建步驟(4)在“項(xiàng)目管理”頁(yè)可看到即將添加到項(xiàng)目中的源1022.窗口設(shè)計(jì)新添加的登錄窗口可以像程序主窗體一樣在可視化設(shè)計(jì)器中進(jìn)行設(shè)計(jì),我們向其中拖入若干控件,最終效果如圖17.19所示,為便于指示,我們對(duì)這些控件也加了①、②、③,…數(shù)字標(biāo)注。2.窗口設(shè)計(jì)新添加的登錄窗口可以像程序主窗體一樣在可視化設(shè)計(jì)1032.窗口設(shè)計(jì)登錄窗口界面上各控件的屬性設(shè)置見表17.8。序
號(hào)名
稱類
型屬性設(shè)置①label_3QLabeltext:歡迎進(jìn)入電子商城;font:微軟雅黑,16;alignment:水平的,AlignHCenter②labelQLabeltext:管理員:;font:微軟雅黑,12③adminLineEditQLineEditfont:微軟雅黑,14;text:b02020622④label_2QLabeltext:口
令:;font:微軟雅黑,12⑤pwdLineEditQLineEditfont:微軟雅黑,14;text:空;echoMode:Password⑥loginPushButtonQPushButtonfont:微軟雅黑,12;text:登
錄⑦exitPushButtonQPushButtonfont:微軟雅黑,12;text:退
出2.窗口設(shè)計(jì)登錄窗口界面上各控件的屬性設(shè)置見表17.8。序104第17章
【綜合實(shí)例】電子商城系統(tǒng)——商品管理系統(tǒng)功能實(shí)現(xiàn)第17章【綜合實(shí)例】電子商城系統(tǒng)——商品管理系統(tǒng)功能實(shí)現(xiàn)01登錄功能實(shí)現(xiàn)01登錄功能實(shí)現(xiàn)106登錄功能實(shí)現(xiàn)登錄功能實(shí)現(xiàn)在logindialog.h頭文件和logindialog.cpp源文件中。首先,在logindialog.h頭文件中聲明變量和方法,完整代碼。然后,在logindialog.cpp源文件中實(shí)現(xiàn)登錄驗(yàn)證功能,完整代碼。其中,(a)QstringpwdMd5=strToMd5(ui->pwdLineEdit->text());:由于從數(shù)據(jù)庫(kù)中查出的口令字符串是已經(jīng)過(guò)MD5加密的,故這里需要先使用自定義的MD5轉(zhuǎn)換函數(shù)strToMd5()將用戶輸入的口令字符串轉(zhuǎn)為MD5加密串后再與從數(shù)據(jù)庫(kù)中查出的內(nèi)容比較以驗(yàn)證。(b)qba=QCryptographicHash::hash(str.toLatin1(),QCryptographicHash::Md5);:Qt5提供了QCryptographicHash類,該類實(shí)現(xiàn)了生成密碼散列的方法,可用于生成二進(jìn)制或文本數(shù)據(jù)的加密散列值。該類目前支持MD4、MD5、SHA-1、SHA-224、SHA-256、SHA-384和SHA-512等多種加密算法。登錄功能實(shí)現(xiàn)登錄功能實(shí)現(xiàn)在logindialog.h頭文件和10702主體程序框架02主體程序框架108主體程序框架(1)main.cpp它是整個(gè)系統(tǒng)的主啟動(dòng)文件,代碼。其中,(a)if(!createMySqlConn()):createMySqlConn()是我們編寫的一個(gè)連接后臺(tái)數(shù)據(jù)庫(kù)的方法,它返回true表示連接成功,返回false表示失敗。程序在開始啟動(dòng)時(shí)就通過(guò)執(zhí)行該方法來(lái)檢查數(shù)據(jù)庫(kù)連接是否就緒。若連接不成功,系統(tǒng)則通過(guò)啟動(dòng)MySQL服務(wù)進(jìn)程的方式再嘗試一次;若依舊連接不成功,則提示連接失敗,交由用戶檢查排除故障。(b)if(logindlg.exec()==QDialog::Accepted):之前在登錄對(duì)話框的實(shí)現(xiàn)中,若用戶通過(guò)了口令驗(yàn)證則執(zhí)行對(duì)話框類的“QDialog::accept();”方法,在這里判斷對(duì)話框類的返回結(jié)果,即“QDialog::Accepted”表示驗(yàn)證通過(guò)。(2)mainwindow.h它是程序頭文件,包含程序中用到的各個(gè)全局變量的定義、方法聲明,完整的代碼。(3)mainwindow.cpp它是本程序的主體源文件,其中包含各方法功能的具體實(shí)現(xiàn)代碼,框架。主體程序框架(1)main.cpp10903界面初始化功能實(shí)現(xiàn)03界面初始化功能實(shí)現(xiàn)110界面初始化功能實(shí)現(xiàn)啟動(dòng)程序時(shí),首先需要對(duì)界面顯示的信息進(jìn)行初始化,在窗體的構(gòu)造方法MainWindow::MainWindow(QWidget*parent)中執(zhí)行我們定義的初始化主窗體方法initMainWindow(),該方法的具體實(shí)現(xiàn)代碼。本系統(tǒng)默認(rèn)顯示在前面的是“新品入庫(kù)”頁(yè),但是對(duì)于“預(yù)售訂單”頁(yè)也同樣會(huì)初始化其內(nèi)容。上段代碼中使用了loadPreCommodity()方法在預(yù)售訂單頁(yè)加載商品信息,該方法的實(shí)現(xiàn)代碼如下:voidMainWindow::loadPreCommodity(){QSqlQueryModel*commodityNameModel=newQSqlQueryModel(this);
//商品名稱模型數(shù)據(jù)commodityNameModel->setQuery(QString("selectNamefromcommoditywhereCategoryID=(selectCategoryIDfromcategorywhereName='%1')").arg(ui->preCategoryComboBox->currentText()));ui->preNameComboBox->setModel(commodityNameModel);
//商品名稱列表加載(“預(yù)售訂單”頁(yè))onPreNameComboBoxChange();}界面初始化功能實(shí)現(xiàn)啟動(dòng)程序時(shí),首先需要對(duì)界面顯示的信息進(jìn)行初111界面初始化功能實(shí)現(xiàn)這個(gè)方法只是在“預(yù)售訂單”頁(yè)加載了商品名稱的列表,為了能對(duì)應(yīng)顯示出當(dāng)前選中商品的其他信息項(xiàng),在最后又調(diào)用了onPreNameComboBoxChange()方法,其實(shí)現(xiàn)代碼如下:voidMainWindow::onPreNameComboBoxChange(){QSqlQueryModel*preCommodityModel=newQSqlQueryModel(this);
//商品表模型數(shù)據(jù)QStringname=ui->preNameComboBox->currentText(); //當(dāng)前選中的商品名preCommodityModel->setQuery("selectOutputPrice,Amount,PicturefromcommoditywhereName='"+name+"'"); //從數(shù)據(jù)庫(kù)中查出單價(jià)、庫(kù)存、照片等信息QModelIndexindex;index=preCommodityModel->index(0,0); //單價(jià)ui->preOutputPriceLabel->setText(preCommodityModel->data(index).toString());index=preCommodityModel->index(0,1); //庫(kù)存ui->preAmountLabel->setText(preCommodityModel->data(index).toString());ui->preCountSpinBox->setMaximum(ui->preAmountLabel->text().toInt());//下面開始獲取和展示照片QPixmapphoto;index=preCommodityModel->index(0,2);photo.loadFromData(preCommodityModel->data(index).toByteArray(),"JPG");ui->prePictureLabel->setPixmap(photo);//計(jì)算總價(jià)ui->preTotalLabel->setText(QString::number(ui->preOutputPriceLabel->text().toFloat()*ui->preCountSpinBox->value()));}界面初始化功能實(shí)現(xiàn)這個(gè)方法只是在“預(yù)售訂單”頁(yè)加載了商品名稱112界面初始化功能實(shí)現(xiàn)這樣做了之后,一開始啟動(dòng)程序直接切換至“預(yù)售訂單”頁(yè),就可以看到某個(gè)默認(rèn)顯示的商品信息,如圖17.20所示。界面初始化功能實(shí)現(xiàn)這樣做了之后,一開始啟動(dòng)程序直接切換至“預(yù)113界面初始化功能實(shí)現(xiàn)在第一個(gè)“新品入庫(kù)”頁(yè)中,默認(rèn)通過(guò)視圖commodity_inf加載了一個(gè)庫(kù)存所有商品信息的數(shù)據(jù)網(wǎng)格列表,該網(wǎng)格控件支持用戶選擇記錄并與左側(cè)的表單聯(lián)動(dòng),通過(guò)網(wǎng)格控件的單擊事件過(guò)程實(shí)現(xiàn):voidMainWindow::on_commodityTableView_clicked(constQModelIndex&index){onTableSelectChange(1);}界面初始化功能實(shí)現(xiàn)在第一個(gè)“新品入庫(kù)”頁(yè)中,默認(rèn)通過(guò)視圖co114界面初始化功能實(shí)現(xiàn)該事件過(guò)程向onTableSelectChange()方法傳入一個(gè)參數(shù)(為當(dāng)前選中的記錄項(xiàng)的索引),再由該方法實(shí)際執(zhí)行表單信息的更新,onTableSelectChange()方法的代碼如下:voidMainWindow::onTableSelectChange(introw){intr=1; //默認(rèn)索引為1if(row!=0)r=ui->commodityTableView->currentIndex().row();QModelIndexindex;index=commodity_model->index(r,0); //名稱ui->newNameLineEdit->setText(commodity_model->data(index).toString());index=commodity_model->index(r,1); //進(jìn)價(jià)ui->newInputPriceLineEdit->setText(commodity_model->data(index).toString());index=commodity_model->index(r,2); //售價(jià)ui->newOutputPriceLineEdit->setText(commodity_model->data(index).toString());showCommodityPhoto(); //商品樣照QSqlQueryquery;query.exec(QString("selectNamefromcategorywhereCategoryID=(selectCategoryIDfromcommoditywhereName='%1')").arg(ui->newNameLineEdit->text()));query.next();ui->newCategoryComboBox->setCurrentText(query.value(0).toString());
//實(shí)現(xiàn)類別聯(lián)動(dòng)}界面初始化功能實(shí)現(xiàn)該事件過(guò)程向onTableSelectCh115界面初始化功能實(shí)現(xiàn)以上代碼中使用showCommodityPhoto()方法來(lái)顯示商品樣照,該方法的代碼如下:voidMainWindow::showCo
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023凈身出戶離婚協(xié)議書
- 償還借款協(xié)議書范本
- 額部腫塊病因介紹
- 公司轉(zhuǎn)讓個(gè)人股份協(xié)議
- 中考政治第一部分知識(shí)闖關(guān)能力提升第二課時(shí)調(diào)節(jié)情緒學(xué)習(xí)壓力明辨是非復(fù)習(xí)課獲
- 2015中國(guó)在線音樂(lè)行業(yè)研究報(bào)告
- (2024)赤泥綜合利用生產(chǎn)建設(shè)項(xiàng)目可行性研究報(bào)告(一)
- 2023年辦公照明項(xiàng)目籌資方案
- 【電信終端產(chǎn)業(yè)協(xié)會(huì)】2024年終端智能化分級(jí)研究報(bào)告
- 國(guó)際物流題庫(kù)(含參考答案)
- 小兒全麻患者術(shù)后護(hù)理
- 黑龍江省哈爾濱市2023-2024學(xué)年八年級(jí)上學(xué)期語(yǔ)文期末模擬考試試卷(含答案)
- 理論力學(xué)(浙江大學(xué))知到智慧樹章節(jié)答案
- 云南省普通高中2023-2024學(xué)年高一上學(xué)期1月期末學(xué)業(yè)水平考試技術(shù)試卷
- 2024年百科知識(shí)競(jìng)賽題庫(kù)及答案(共三套)
- JGJ-T490-2021鋼框架內(nèi)填墻板結(jié)構(gòu)技術(shù)標(biāo)準(zhǔn)
- 2024年移動(dòng)解決方案經(jīng)理認(rèn)證考試題庫(kù)大全-中(多選題)
- 愚公移山英文 -中國(guó)故事英文版課件
- 國(guó)開經(jīng)濟(jì)學(xué)(本)1-14章練習(xí)試題及答案
- 三相橋式有源逆變電路的仿真Word版
- 流量變送器設(shè)計(jì)畢業(yè)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論