Qt-5開發(fā)及實例-第17章-【綜合實例】電子商城系統(tǒng)課件_第1頁
Qt-5開發(fā)及實例-第17章-【綜合實例】電子商城系統(tǒng)課件_第2頁
Qt-5開發(fā)及實例-第17章-【綜合實例】電子商城系統(tǒng)課件_第3頁
Qt-5開發(fā)及實例-第17章-【綜合實例】電子商城系統(tǒng)課件_第4頁
Qt-5開發(fā)及實例-第17章-【綜合實例】電子商城系統(tǒng)課件_第5頁
已閱讀5頁,還剩127頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第17章

【綜合實例】電子商城系統(tǒng)——商品管理系統(tǒng)功能需求第17章【綜合實例】電子商城系統(tǒng)——商品管理系統(tǒng)功能需求電子商城商品管理系統(tǒng)的主要功能如下:(1)管理員口令登錄,密碼采用MD5加密算法封裝驗證。(2)瀏覽庫存商品信息,采用Qt數(shù)據(jù)網(wǎng)格控件實現(xiàn)。(3)商品入庫和清倉,用表單錄入商品信息(可指定商品類別、進價、售價、入庫數(shù)量等,還可上傳商品樣照)。(4)預(yù)售訂單功能。選擇指定數(shù)量的庫存商品出售,系統(tǒng)自動計算出應(yīng)付款總金額并顯示銷售清單,用戶一次可預(yù)售多種商品,然后統(tǒng)一下訂單。商品管理系統(tǒng)功能需求電子商城商品管理系統(tǒng)的主要功能如下:商品管理系統(tǒng)功能需求201登

能01登錄功能3登

能初始啟動程序,顯示登錄界面(如圖17.1所示)。輸入管理員賬號及口令,單擊“登錄”按鈕執(zhí)行驗證,口令用Qt內(nèi)置的MD5算法做加密處理后先存于MySQL數(shù)據(jù)庫中,若驗證不通過則彈出警告提示框。登錄功能初始啟動程序,顯示登錄界面(如圖17.1402新品入庫功能02新品入庫功能5新品入庫功能在“新品入庫”頁上可看到全部庫存的商品信息(商品名稱、進價、售價和庫存量),用戶可輸入(或選擇)新品信息,將其錄入系統(tǒng)中;也可選擇庫中已有的商品執(zhí)行清倉操作,如圖17.2所示。新品入庫功能在“新品入庫”頁上可看到全部庫存的商品信息(商品603預(yù)售訂單功能03預(yù)售訂單功能7預(yù)售訂單功能在“預(yù)售訂單”頁上,用戶從左邊表單下拉列表中選擇要預(yù)售的商品類別和名稱,表單會自動聯(lián)動顯示出該商品的單價、庫存、照片,并根據(jù)用戶所指定的售出數(shù)量算出總價,如圖17.3所示。預(yù)售訂單功能在“預(yù)售訂單”頁上,用戶從左邊表單下拉列表中選擇8第17章

【綜合實例】電子商城系統(tǒng)——項目開發(fā)準(zhǔn)備第17章【綜合實例】電子商城系統(tǒng)——項目開發(fā)準(zhǔn)備01項

置01項目配置10項目配置(1)創(chuàng)建Qt桌面應(yīng)用程序項目,項目名稱為“eMarket”。創(chuàng)建完成在QtCreator開發(fā)環(huán)境中單擊左側(cè)欄的

按鈕切換至項目配置模式,如圖17.4所示。(2)修改項目的.pro配置文件,在其中添加配置項。配置文件eM內(nèi)容如下(加黑處為需要修改添加的地方)。項目配置(1)創(chuàng)建Qt桌面應(yīng)用程序項目,項目名稱為“eMar1102數(shù)據(jù)庫準(zhǔn)備1.創(chuàng)建數(shù)據(jù)庫2.設(shè)計表3.創(chuàng)建視圖02數(shù)據(jù)庫準(zhǔn)備1.創(chuàng)建數(shù)據(jù)庫2.設(shè)計表3.創(chuàng)建視圖12數(shù)據(jù)庫準(zhǔn)備1.創(chuàng)建數(shù)據(jù)庫在MySQL中創(chuàng)建數(shù)據(jù)庫,名稱為emarket,其中建立5個表,分別為category表(商品類別表)、commodity表(商品表)、member表(會員表)、orders表(訂單表)和orderitems表(訂單項表)。2.設(shè)計表(1)表結(jié)構(gòu)設(shè)計對以上建好的各表設(shè)計其表結(jié)構(gòu)字段屬性如下。category表設(shè)計見表17.1。列

名類

型長

度允許空值說

明CategoryIDint6否商品類別編號,主鍵,自動遞增Namechar16否商品類別名稱數(shù)據(jù)庫準(zhǔn)備1.創(chuàng)建數(shù)據(jù)庫列名類型長度13數(shù)據(jù)庫準(zhǔn)備commodity表設(shè)計見表17.2。列

名類

型長

度允許空值說

明CommodityIDint6否商品編號,主鍵,自動遞增CategoryIDint6否商品類別編號Namechar32否商品名稱Pictureblob默認(rèn)是商品圖片InputPricefloat6,2位小數(shù)否商品購入價格(進價)OutputPricefloat6,2位小數(shù)否商品售出價格(單價)Amountint6否商品庫存量數(shù)據(jù)庫準(zhǔn)備commodity表設(shè)計見表17.2。列名14數(shù)據(jù)庫準(zhǔn)備member表設(shè)計見表17.3。列

名類

型長

度允許空值說

明MemberIDchar16否會員賬號,主鍵PassWordchar50否登錄口令(以MD5加密存儲)Namevarchar32否會員名Sexbit1否性別:1表示男,0表示女,默認(rèn)1Emailvarchar32是電子郵箱Addressvarchar128是聯(lián)系地址Phonechar16是聯(lián)系電話RegisterDatedate默認(rèn)否注冊日期數(shù)據(jù)庫準(zhǔn)備member表設(shè)計見表17.3。列名類15數(shù)據(jù)庫準(zhǔn)備orders表設(shè)計見表17.4。列

名類

型長

度允許空值說

明OrderIDint6否訂單編號,主鍵,自動遞增MemberIDchar16否會員賬號PaySumfloat6,2位小數(shù)是付款總金額PayWayvarchar32是付款方式OTimedatetime默認(rèn)是下單日期時間orderitems表設(shè)計見表17.5。列

名類

型長

度允許空值說

明OrderIDint6否訂單編號,主鍵CommodityIDint6否商品編號,主鍵Countint11否數(shù)量Affirmbit1否是否確認(rèn):0沒有確認(rèn),1確認(rèn),默認(rèn)0SendGoodsbit1否是否發(fā)貨:0沒有發(fā)貨,1發(fā)貨,默認(rèn)0數(shù)據(jù)庫準(zhǔn)備orders表設(shè)計見表17.4。列名類16數(shù)據(jù)庫準(zhǔn)備(2)外鍵關(guān)聯(lián)設(shè)計好表結(jié)構(gòu)之后,為表之間建立外鍵關(guān)聯(lián)。本例要在commodity、orders和orderitems表上建立4個外鍵關(guān)聯(lián)。①commodity表外鍵CategoryID引用category表主鍵,在NavicatforMySQL數(shù)據(jù)庫可視化工具的commodity表設(shè)計窗口中選擇“外鍵”選項卡,如圖17.5所示設(shè)置即可。數(shù)據(jù)庫準(zhǔn)備(2)外鍵關(guān)聯(lián)17數(shù)據(jù)庫準(zhǔn)備②orders表外鍵MemberID引用member表主鍵,在orders表設(shè)計窗口中選擇“外鍵”選項卡,按如圖17.6所示進行設(shè)置即可。數(shù)據(jù)庫準(zhǔn)備②orders表18數(shù)據(jù)庫準(zhǔn)備③orderitems表在該表上要設(shè)置兩個外鍵:OrderID引用orders表的主鍵OrderID,CommodityID引用commodity表的主鍵CommodityID。在orderitems表設(shè)計窗口中選擇“外鍵”選項卡,按如圖17.7所示進行設(shè)置即可。數(shù)據(jù)庫準(zhǔn)備③orderitems表19數(shù)據(jù)庫準(zhǔn)備(3)數(shù)據(jù)錄入設(shè)計好表及其關(guān)聯(lián)之后,往各表中預(yù)先錄入一些數(shù)據(jù)記錄以供后面測試運行程序之用,如圖17.8~圖17.10所示。數(shù)據(jù)庫準(zhǔn)備(3)數(shù)據(jù)錄入20數(shù)據(jù)庫準(zhǔn)備圖17.10member表數(shù)據(jù)為體現(xiàn)實際應(yīng)用,本章實例所用的商品信息皆是從真實的電商網(wǎng)站選取,各商品的樣品圖片由本書隨源代碼提供,讀者可預(yù)先編寫以下代碼將其錄入數(shù)據(jù)庫commodity表的Picture字段。數(shù)據(jù)庫準(zhǔn)備圖17.10member表數(shù)據(jù)為體現(xiàn)實際應(yīng)用,21數(shù)據(jù)庫準(zhǔn)備3.創(chuàng)建視圖根據(jù)應(yīng)用需要,本例要創(chuàng)建一個視圖commodity_inf,用于顯示商品的基本信息(商品名稱、進價、售價和庫存),創(chuàng)建視圖的操作如下。展開數(shù)據(jù)庫節(jié)點,右擊“視圖”→“新建視圖”,打開MySQL的視圖創(chuàng)建工具,如圖17.11所示。數(shù)據(jù)庫準(zhǔn)備3.創(chuàng)建視圖22第17章

【綜合實例】電子商城系統(tǒng)——商品管理系統(tǒng)界面設(shè)計第17章【綜合實例】電子商城系統(tǒng)——商品管理系統(tǒng)界面設(shè)計01總

設(shè)

計01總體設(shè)計24總體設(shè)計在開發(fā)環(huán)境項目目錄樹狀視圖中,雙擊mainwindow.ui切換至可視化界面設(shè)計模式,如圖17.12所示,在其上拖曳設(shè)計出商品管理系統(tǒng)的整個圖形界面??傮w設(shè)計在開發(fā)環(huán)境項目目錄樹狀視圖中,雙擊mainwindo2502“新品入庫”頁02“新品入庫”頁26“新品入庫”頁“新品入庫”頁界面設(shè)計效果如圖17.13所示?!靶缕啡霂臁表摻缑嫔细骺丶膶傩栽O(shè)置見表17.6?!靶缕啡霂臁表摗靶缕啡霂臁表摻缑嬖O(shè)計效果如圖17.13所示。27“新品入庫”頁表17.6“新品入庫”頁界面上各控件的屬性設(shè)置序

號名

稱類

型屬性設(shè)置①newCategoryComboBoxQComboBox—②newNameLineEditQLineEdit—③newInputPriceLineEditQLineEdit—④newOutputPriceLineEditQLineEdit—⑤newCountSpinBoxQSpinBoxalignment:水平的,AlignHCenter;value:1⑥newUploadPushButtonQPushButtontext:上傳...⑦newPictureLabelQLabelgeometry:寬度151,高度151;frameShape:Box;frameShadow:Sunken;text:空;scaledContents:勾選⑧newPutinStorePushButtonQPushButtontext:入庫⑨newClearancePushButtonQPushButtontext:清倉⑩commodityTableViewQTableViewhorizontalHeaderVisible:勾選;horizontalHeaderDefaultSectionSize:120;horizontalHeaderMinimumSectionSize:25;horizontalHeaderStretchLastSection:勾選;verticalHeaderVisible:取消勾選“新品入庫”頁表17.6“新品入庫”頁界面上各控件的屬性設(shè)2803“預(yù)售訂單”頁03“預(yù)售訂單”頁29“預(yù)售訂單”頁“預(yù)售訂單”頁界面設(shè)計效果如圖17.14所示?!邦A(yù)售訂單”頁界面上各個控件的屬性設(shè)置見表17.7?!邦A(yù)售訂單”頁“預(yù)售訂單”頁界面設(shè)計效果如圖17.14所示。30“預(yù)售訂單”頁表17.7“預(yù)售訂單”頁界面上各控件的屬性設(shè)置序

號名

稱類

型屬性設(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ù)售訂單”頁表17.7“預(yù)售訂單”頁界面上各控件的屬性設(shè)3104登

口1.創(chuàng)建步驟2.窗口設(shè)計04登錄窗口1.創(chuàng)建步驟2.窗口設(shè)計321.創(chuàng)建步驟(1)右擊項目名,選擇“添加新文件”菜單項,彈出“新建文件”對話框,如圖17.15所示,選擇模板“Qt”→“Qt設(shè)計師界面類”,單擊“Choose...”按鈕。1.創(chuàng)建步驟(1)右擊項目名,選擇“添加新文件”菜單項,彈出331.創(chuàng)建步驟(2)在“Qt設(shè)計器界面類”對話框中,選擇界面模板為“DialogwithoutButtons”,如圖17.16所示,單擊“下一步”按鈕。1.創(chuàng)建步驟(2)在“Qt設(shè)計器界面類”對話框中,選擇界面模341.創(chuàng)建步驟(3)在導(dǎo)航頁上,將登錄窗口所對應(yīng)的類名命名為“LoginDialog”,如圖17.17所示,單擊“下一步”按鈕。1.創(chuàng)建步驟(3)在導(dǎo)航頁上,將登錄窗口所對應(yīng)的類名命名為“351.創(chuàng)建步驟(4)在“項目管理”頁可看到即將添加到項目中的源文件名,確認(rèn)無誤后,單擊“完成”按鈕,如圖17.18所示。1.創(chuàng)建步驟(4)在“項目管理”頁可看到即將添加到項目中的源362.窗口設(shè)計新添加的登錄窗口可以像程序主窗體一樣在可視化設(shè)計器中進行設(shè)計,我們向其中拖入若干控件,最終效果如圖17.19所示,為便于指示,我們對這些控件也加了①、②、③,…數(shù)字標(biāo)注。2.窗口設(shè)計新添加的登錄窗口可以像程序主窗體一樣在可視化設(shè)計372.窗口設(shè)計登錄窗口界面上各控件的屬性設(shè)置見表17.8。序

號名

稱類

型屬性設(shè)置①label_3QLabeltext:歡迎進入電子商城;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è)計登錄窗口界面上各控件的屬性設(shè)置見表17.8。序38第17章

【綜合實例】電子商城系統(tǒng)——商品管理系統(tǒng)功能實現(xiàn)第17章【綜合實例】電子商城系統(tǒng)——商品管理系統(tǒng)功能實現(xiàn)01登錄功能實現(xiàn)01登錄功能實現(xiàn)40登錄功能實現(xiàn)登錄功能實現(xiàn)在logindialog.h頭文件和logindialog.cpp源文件中。首先,在logindialog.h頭文件中聲明變量和方法,完整代碼。然后,在logindialog.cpp源文件中實現(xiàn)登錄驗證功能,完整代碼。其中,(a)QstringpwdMd5=strToMd5(ui->pwdLineEdit->text());:由于從數(shù)據(jù)庫中查出的口令字符串是已經(jīng)過MD5加密的,故這里需要先使用自定義的MD5轉(zhuǎn)換函數(shù)strToMd5()將用戶輸入的口令字符串轉(zhuǎn)為MD5加密串后再與從數(shù)據(jù)庫中查出的內(nèi)容比較以驗證。(b)qba=QCryptographicHash::hash(str.toLatin1(),QCryptographicHash::Md5);:Qt5提供了QCryptographicHash類,該類實現(xiàn)了生成密碼散列的方法,可用于生成二進制或文本數(shù)據(jù)的加密散列值。該類目前支持MD4、MD5、SHA-1、SHA-224、SHA-256、SHA-384和SHA-512等多種加密算法。登錄功能實現(xiàn)登錄功能實現(xiàn)在logindialog.h頭文件和4102主體程序框架02主體程序框架42主體程序框架(1)main.cpp它是整個系統(tǒng)的主啟動文件,代碼。其中,(a)if(!createMySqlConn()):createMySqlConn()是我們編寫的一個連接后臺數(shù)據(jù)庫的方法,它返回true表示連接成功,返回false表示失敗。程序在開始啟動時就通過執(zhí)行該方法來檢查數(shù)據(jù)庫連接是否就緒。若連接不成功,系統(tǒng)則通過啟動MySQL服務(wù)進程的方式再嘗試一次;若依舊連接不成功,則提示連接失敗,交由用戶檢查排除故障。(b)if(logindlg.exec()==QDialog::Accepted):之前在登錄對話框的實現(xiàn)中,若用戶通過了口令驗證則執(zhí)行對話框類的“QDialog::accept();”方法,在這里判斷對話框類的返回結(jié)果,即“QDialog::Accepted”表示驗證通過。(2)mainwindow.h它是程序頭文件,包含程序中用到的各個全局變量的定義、方法聲明,完整的代碼。(3)mainwindow.cpp它是本程序的主體源文件,其中包含各方法功能的具體實現(xiàn)代碼,框架。主體程序框架(1)main.cpp4303界面初始化功能實現(xiàn)03界面初始化功能實現(xiàn)44界面初始化功能實現(xiàn)啟動程序時,首先需要對界面顯示的信息進行初始化,在窗體的構(gòu)造方法MainWindow::MainWindow(QWidget*parent)中執(zhí)行我們定義的初始化主窗體方法initMainWindow(),該方法的具體實現(xiàn)代碼。本系統(tǒng)默認(rèn)顯示在前面的是“新品入庫”頁,但是對于“預(yù)售訂單”頁也同樣會初始化其內(nèi)容。上段代碼中使用了loadPreCommodity()方法在預(yù)售訂單頁加載商品信息,該方法的實現(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ù)售訂單”頁)onPreNameComboBoxChange();}界面初始化功能實現(xiàn)啟動程序時,首先需要對界面顯示的信息進行初45界面初始化功能實現(xiàn)這個方法只是在“預(yù)售訂單”頁加載了商品名稱的列表,為了能對應(yīng)顯示出當(dāng)前選中商品的其他信息項,在最后又調(diào)用了onPreNameComboBoxChange()方法,其實現(xiàn)代碼如下:voidMainWindow::onPreNameComboBoxChange(){QSqlQueryModel*preCommodityModel=newQSqlQueryModel(this);

//商品表模型數(shù)據(jù)QStringname=ui->preNameComboBox->currentText(); //當(dāng)前選中的商品名preCommodityModel->setQuery("selectOutputPrice,Amount,PicturefromcommoditywhereName='"+name+"'"); //從數(shù)據(jù)庫中查出單價、庫存、照片等信息QModelIndexindex;index=preCommodityModel->index(0,0); //單價ui->preOutputPriceLabel->setText(preCommodityModel->data(index).toString());index=preCommodityModel->index(0,1); //庫存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);//計算總價ui->preTotalLabel->setText(QString::number(ui->preOutputPriceLabel->text().toFloat()*ui->preCountSpinBox->value()));}界面初始化功能實現(xiàn)這個方法只是在“預(yù)售訂單”頁加載了商品名稱46界面初始化功能實現(xiàn)這樣做了之后,一開始啟動程序直接切換至“預(yù)售訂單”頁,就可以看到某個默認(rèn)顯示的商品信息,如圖17.20所示。界面初始化功能實現(xiàn)這樣做了之后,一開始啟動程序直接切換至“預(yù)47界面初始化功能實現(xiàn)在第一個“新品入庫”頁中,默認(rèn)通過視圖commodity_inf加載了一個庫存所有商品信息的數(shù)據(jù)網(wǎng)格列表,該網(wǎng)格控件支持用戶選擇記錄并與左側(cè)的表單聯(lián)動,通過網(wǎng)格控件的單擊事件過程實現(xiàn):voidMainWindow::on_commodityTableView_clicked(constQModelIndex&index){onTableSelectChange(1);}界面初始化功能實現(xiàn)在第一個“新品入庫”頁中,默認(rèn)通過視圖co48界面初始化功能實現(xiàn)該事件過程向onTableSelectChange()方法傳入一個參數(shù)(為當(dāng)前選中的記錄項的索引),再由該方法實際執(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); //進價ui->newInputPriceLineEdit->setText(commodity_model->data(index).toString());index=commodity_model->index(r,2); //售價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());

//實現(xiàn)類別聯(lián)動}界面初始化功能實現(xiàn)該事件過程向onTableSelectCh49界面初始化功能實現(xiàn)以上代碼中使用showCommodityPhoto()方法來顯示商品樣照,該方法的代碼如下: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ù)庫中讀取的字節(jié)數(shù)組類型的照片數(shù)據(jù)載入為Qt的QPixmap對象,再將其設(shè)為界面上標(biāo)簽的屬性即可在界面上顯出數(shù)據(jù)庫圖片類型字段的內(nèi)容。界面初始化功能實現(xiàn)以上代碼中使用showCommodityP5004新品入庫功能實現(xiàn)1.入庫操作2.選樣照3.清倉操作04新品入庫功能實現(xiàn)1.入庫操作2.選樣照3.清倉操作511.入庫操作本系統(tǒng)的第一個“新品入庫”頁是供商品倉儲管理員登記錄入新進商品信息的,在左側(cè)表單中填好(選擇)新品信息后,單擊“入庫”按鈕就可以將一件新的商品添加進MySQL數(shù)據(jù)庫中。“入庫”按鈕的單擊事件過程代碼。其中,(a)query.exec(QString("selectCategoryIDfromcategorywhereName='%1'").arg(ui->newCategoryComboBox->currentText()));:入庫新品的類別由管理員在界面“類別”列表中選擇,為簡單起見,本例所有商品的類別是固定的,預(yù)先錄入數(shù)據(jù)庫,暫不支持添加新類別。(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ù)庫執(zhí)行插入操作SQL語句的典型寫法,用“%”表示待定參數(shù);以.arg傳遞參數(shù)值,一條SQL語句可支持多個.arg傳參方法,請讀者注意掌握這種書寫格式。(c)myPicImg.save(&buffer,"JPG");:這里使用一個QImage對象來存儲要寫入數(shù)據(jù)庫的照片數(shù)據(jù),它通過save()方法從QBuffer類型的緩存中載入照片數(shù)據(jù),這也是Qt保存圖片數(shù)據(jù)的通行方式。(d)query.addBindValue(var);:這里用SQL查詢類對象的addBindValue()方法綁定照片數(shù)據(jù)作為參數(shù)傳給SQL語句中“?”之處,這是Qt操作MySQL含參數(shù)SQL語句的另一種形式,也是通用的形式。1.入庫操作本系統(tǒng)的第一個“新品入庫”頁是供商品倉儲管理員登522.選樣照用戶可從界面上傳預(yù)先準(zhǔn)備好的商品樣照錄入數(shù)據(jù)庫,上傳樣照通過單擊“上傳...”按鈕實現(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ù)庫,上533.清倉操作清倉是入庫的逆操作,當(dāng)某件商品已售罄或不再需要時,可直接單擊“清倉”按鈕將其信息記錄從數(shù)據(jù)庫刪除,此按鈕的事件代碼為: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)格(“新品入庫”頁)}3.清倉操作清倉是入庫的逆操作,當(dāng)某件商品已售罄或不再需要時5405預(yù)售訂單功能實現(xiàn)1.商品出售2.下訂單05預(yù)售訂單功能實現(xiàn)1.商品出售2.下訂單551.商品出售用戶可以選擇不同類別的不同商品,指定數(shù)量后出售。這里的“出售”準(zhǔn)確地說只是預(yù)售,在未下單之前,用戶還可以添加新的商品進訂單?!俺鍪邸卑粹o的單擊事件過程代碼。其中,(a)if(!myOrdered):本系統(tǒng)用一個全局變量myOrdered標(biāo)識當(dāng)前用戶是否處于出售(已開始購買商品但尚未最后下單)狀態(tài),當(dāng)用戶第一次執(zhí)行“出售”操作時,系統(tǒng)會向數(shù)據(jù)庫中寫入一條訂單信息并自動生成訂單號(字段自增機制),此時將myOrdered置為true表示用戶處于出售狀態(tài),只有在最后執(zhí)行了下單操作后才會又將myOrdered置回false。(b)query.exec(QString("selectOrderIDfromorderswhereOTimeISNULL"));:只有執(zhí)行過下單操作的訂單才會在數(shù)據(jù)庫中記錄下單時間,并且程序邏輯只允許在完成當(dāng)前訂單下單之后才能開始一個新訂單,因此,在任一時刻數(shù)據(jù)庫中都至多只會有一個訂單的下單時間字段為空,可以根據(jù)這一字段是否為空來檢索出當(dāng)前訂單的訂單號。1.商品出售用戶可以選擇不同類別的不同商品,指定數(shù)量后出售。562.下訂單單擊“下單”按鈕來完成一個訂單,其事件過程代碼。其中,(a)QSqlDatabase::database().commit();:由于下單的一系列操作是一個完整不可分割的集合(原子操作),為保證數(shù)據(jù)庫中數(shù)據(jù)的完整一致性,只有在所有操作都成功完成的前提下才允許將修改提交到數(shù)據(jù)庫,這里采用了MySQL的事務(wù)操作技術(shù)來保證一致性。2.下訂單單擊“下單”按鈕來完成一個訂單,其事件過程代碼。57第17章

【綜合實例】電子商城系統(tǒng)——商品管理系統(tǒng)運行演示第17章【綜合實例】電子商城系統(tǒng)——商品管理系統(tǒng)運行演示01登錄電子商城01登錄電子商城59登錄電子商城啟動程序,首先出現(xiàn)的是如圖17.21所示的登錄界面。為方便讀者試運行,我們在數(shù)據(jù)庫中已經(jīng)預(yù)先創(chuàng)建了一個管理員的用戶名“b02020622”,輸入口令后單擊“登錄”按鈕,出現(xiàn)商品管理系統(tǒng)主界面,如圖17.22所示。

登錄電子商城啟動程序,首先出現(xiàn)的是如圖17.21所示的登錄界6002新品入庫和清倉02新品入庫和清倉61新品入庫和清倉在左側(cè)表單中選擇類別和填寫事先準(zhǔn)備好的某件商品的信息,并單擊“上傳...”按鈕選擇其樣品照片,單擊“入庫”按鈕就能將該商品的記錄添加到數(shù)據(jù)庫中,并可從右邊數(shù)據(jù)網(wǎng)格列表中看到新加入的商品,如圖17.23所示。新品入庫和清倉在左側(cè)表單中選擇類別和填寫事先準(zhǔn)備好的某件商品6203預(yù)售下訂單03預(yù)售下訂單63預(yù)售下訂單切換到“預(yù)售訂單”頁,從左側(cè)表單中選擇一款商品后,單擊“出售”按鈕,右邊區(qū)域會顯示一條銷售記錄(包括售出時間、商品名、數(shù)量、單價和總價等信息),并彈出消息框提示該商品已加入訂單,如圖17.24所示。預(yù)售下訂單切換到“預(yù)售訂單”頁,從左側(cè)表單中選擇一款商品后,64預(yù)售下訂單此時,“下單”按鈕變?yōu)榭捎?,用戶可隨時單擊執(zhí)行下單操作,也可以繼續(xù)出售其他商品,并且在每次出售時還可指定該商品的出售數(shù)量,系統(tǒng)會自動算出總價,并將完整的銷售記錄添加在右邊區(qū)域,如圖17.25所示。預(yù)售下訂單此時,“下單”按鈕變?yōu)榭捎?,用戶可隨時單擊執(zhí)行下單65預(yù)售下訂單出售完成后,單擊“下單”按鈕生成訂單并寫入MySQL數(shù)據(jù)庫,系統(tǒng)彈出“下單成功!”消息提示,并在右區(qū)顯示出訂單信息,包括下單日期、訂單號和應(yīng)付款總額,其中應(yīng)付款總額是此單所有銷售記錄的總價相加的和,如圖17.26所示。預(yù)售下訂單出售完成后,單擊“下單”按鈕生成訂單并寫入MySQ66第17章

【綜合實例】電子商城系統(tǒng)——商品管理系統(tǒng)功能需求第17章【綜合實例】電子商城系統(tǒng)——商品管理系統(tǒng)功能需求電子商城商品管理系統(tǒng)的主要功能如下:(1)管理員口令登錄,密碼采用MD5加密算法封裝驗證。(2)瀏覽庫存商品信息,采用Qt數(shù)據(jù)網(wǎng)格控件實現(xiàn)。(3)商品入庫和清倉,用表單錄入商品信息(可指定商品類別、進價、售價、入庫數(shù)量等,還可上傳商品樣照)。(4)預(yù)售訂單功能。選擇指定數(shù)量的庫存商品出售,系統(tǒng)自動計算出應(yīng)付款總金額并顯示銷售清單,用戶一次可預(yù)售多種商品,然后統(tǒng)一下訂單。商品管理系統(tǒng)功能需求電子商城商品管理系統(tǒng)的主要功能如下:商品管理系統(tǒng)功能需求6801登

能01登錄功能69登

能初始啟動程序,顯示登錄界面(如圖17.1所示)。輸入管理員賬號及口令,單擊“登錄”按鈕執(zhí)行驗證,口令用Qt內(nèi)置的MD5算法做加密處理后先存于MySQL數(shù)據(jù)庫中,若驗證不通過則彈出警告提示框。登錄功能初始啟動程序,顯示登錄界面(如圖17.17002新品入庫功能02新品入庫功能71新品入庫功能在“新品入庫”頁上可看到全部庫存的商品信息(商品名稱、進價、售價和庫存量),用戶可輸入(或選擇)新品信息,將其錄入系統(tǒng)中;也可選擇庫中已有的商品執(zhí)行清倉操作,如圖17.2所示。新品入庫功能在“新品入庫”頁上可看到全部庫存的商品信息(商品7203預(yù)售訂單功能03預(yù)售訂單功能73預(yù)售訂單功能在“預(yù)售訂單”頁上,用戶從左邊表單下拉列表中選擇要預(yù)售的商品類別和名稱,表單會自動聯(lián)動顯示出該商品的單價、庫存、照片,并根據(jù)用戶所指定的售出數(shù)量算出總價,如圖17.3所示。預(yù)售訂單功能在“預(yù)售訂單”頁上,用戶從左邊表單下拉列表中選擇74第17章

【綜合實例】電子商城系統(tǒng)——項目開發(fā)準(zhǔn)備第17章【綜合實例】電子商城系統(tǒng)——項目開發(fā)準(zhǔn)備01項

置01項目配置76項目配置(1)創(chuàng)建Qt桌面應(yīng)用程序項目,項目名稱為“eMarket”。創(chuàng)建完成在QtCreator開發(fā)環(huán)境中單擊左側(cè)欄的

按鈕切換至項目配置模式,如圖17.4所示。(2)修改項目的.pro配置文件,在其中添加配置項。配置文件eM內(nèi)容如下(加黑處為需要修改添加的地方)。項目配置(1)創(chuàng)建Qt桌面應(yīng)用程序項目,項目名稱為“eMar7702數(shù)據(jù)庫準(zhǔn)備1.創(chuàng)建數(shù)據(jù)庫2.設(shè)計表3.創(chuàng)建視圖02數(shù)據(jù)庫準(zhǔn)備1.創(chuàng)建數(shù)據(jù)庫2.設(shè)計表3.創(chuàng)建視圖78數(shù)據(jù)庫準(zhǔn)備1.創(chuàng)建數(shù)據(jù)庫在MySQL中創(chuàng)建數(shù)據(jù)庫,名稱為emarket,其中建立5個表,分別為category表(商品類別表)、commodity表(商品表)、member表(會員表)、orders表(訂單表)和orderitems表(訂單項表)。2.設(shè)計表(1)表結(jié)構(gòu)設(shè)計對以上建好的各表設(shè)計其表結(jié)構(gòu)字段屬性如下。category表設(shè)計見表17.1。列

名類

型長

度允許空值說

明CategoryIDint6否商品類別編號,主鍵,自動遞增Namechar16否商品類別名稱數(shù)據(jù)庫準(zhǔn)備1.創(chuàng)建數(shù)據(jù)庫列名類型長度79數(shù)據(jù)庫準(zhǔn)備commodity表設(shè)計見表17.2。列

名類

型長

度允許空值說

明CommodityIDint6否商品編號,主鍵,自動遞增CategoryIDint6否商品類別編號Namechar32否商品名稱Pictureblob默認(rèn)是商品圖片InputPricefloat6,2位小數(shù)否商品購入價格(進價)OutputPricefloat6,2位小數(shù)否商品售出價格(單價)Amountint6否商品庫存量數(shù)據(jù)庫準(zhǔn)備commodity表設(shè)計見表17.2。列名80數(shù)據(jù)庫準(zhǔn)備member表設(shè)計見表17.3。列

名類

型長

度允許空值說

明MemberIDchar16否會員賬號,主鍵PassWordchar50否登錄口令(以MD5加密存儲)Namevarchar32否會員名Sexbit1否性別:1表示男,0表示女,默認(rèn)1Emailvarchar32是電子郵箱Addressvarchar128是聯(lián)系地址Phonechar16是聯(lián)系電話RegisterDatedate默認(rèn)否注冊日期數(shù)據(jù)庫準(zhǔn)備member表設(shè)計見表17.3。列名類81數(shù)據(jù)庫準(zhǔn)備orders表設(shè)計見表17.4。列

名類

型長

度允許空值說

明OrderIDint6否訂單編號,主鍵,自動遞增MemberIDchar16否會員賬號PaySumfloat6,2位小數(shù)是付款總金額PayWayvarchar32是付款方式OTimedatetime默認(rèn)是下單日期時間orderitems表設(shè)計見表17.5。列

名類

型長

度允許空值說

明OrderIDint6否訂單編號,主鍵CommodityIDint6否商品編號,主鍵Countint11否數(shù)量Affirmbit1否是否確認(rèn):0沒有確認(rèn),1確認(rèn),默認(rèn)0SendGoodsbit1否是否發(fā)貨:0沒有發(fā)貨,1發(fā)貨,默認(rèn)0數(shù)據(jù)庫準(zhǔn)備orders表設(shè)計見表17.4。列名類82數(shù)據(jù)庫準(zhǔn)備(2)外鍵關(guān)聯(lián)設(shè)計好表結(jié)構(gòu)之后,為表之間建立外鍵關(guān)聯(lián)。本例要在commodity、orders和orderitems表上建立4個外鍵關(guān)聯(lián)。①commodity表外鍵CategoryID引用category表主鍵,在NavicatforMySQL數(shù)據(jù)庫可視化工具的commodity表設(shè)計窗口中選擇“外鍵”選項卡,如圖17.5所示設(shè)置即可。數(shù)據(jù)庫準(zhǔn)備(2)外鍵關(guān)聯(lián)83數(shù)據(jù)庫準(zhǔn)備②orders表外鍵MemberID引用member表主鍵,在orders表設(shè)計窗口中選擇“外鍵”選項卡,按如圖17.6所示進行設(shè)置即可。數(shù)據(jù)庫準(zhǔn)備②orders表84數(shù)據(jù)庫準(zhǔn)備③orderitems表在該表上要設(shè)置兩個外鍵:OrderID引用orders表的主鍵OrderID,CommodityID引用commodity表的主鍵CommodityID。在orderitems表設(shè)計窗口中選擇“外鍵”選項卡,按如圖17.7所示進行設(shè)置即可。數(shù)據(jù)庫準(zhǔn)備③orderitems表85數(shù)據(jù)庫準(zhǔn)備(3)數(shù)據(jù)錄入設(shè)計好表及其關(guān)聯(lián)之后,往各表中預(yù)先錄入一些數(shù)據(jù)記錄以供后面測試運行程序之用,如圖17.8~圖17.10所示。數(shù)據(jù)庫準(zhǔn)備(3)數(shù)據(jù)錄入86數(shù)據(jù)庫準(zhǔn)備圖17.10member表數(shù)據(jù)為體現(xiàn)實際應(yīng)用,本章實例所用的商品信息皆是從真實的電商網(wǎng)站選取,各商品的樣品圖片由本書隨源代碼提供,讀者可預(yù)先編寫以下代碼將其錄入數(shù)據(jù)庫commodity表的Picture字段。數(shù)據(jù)庫準(zhǔn)備圖17.10member表數(shù)據(jù)為體現(xiàn)實際應(yīng)用,87數(shù)據(jù)庫準(zhǔn)備3.創(chuàng)建視圖根據(jù)應(yīng)用需要,本例要創(chuàng)建一個視圖commodity_inf,用于顯示商品的基本信息(商品名稱、進價、售價和庫存),創(chuàng)建視圖的操作如下。展開數(shù)據(jù)庫節(jié)點,右擊“視圖”→“新建視圖”,打開MySQL的視圖創(chuàng)建工具,如圖17.11所示。數(shù)據(jù)庫準(zhǔn)備3.創(chuàng)建視圖88第17章

【綜合實例】電子商城系統(tǒng)——商品管理系統(tǒng)界面設(shè)計第17章【綜合實例】電子商城系統(tǒng)——商品管理系統(tǒng)界面設(shè)計01總

設(shè)

計01總體設(shè)計90總體設(shè)計在開發(fā)環(huán)境項目目錄樹狀視圖中,雙擊mainwindow.ui切換至可視化界面設(shè)計模式,如圖17.12所示,在其上拖曳設(shè)計出商品管理系統(tǒng)的整個圖形界面??傮w設(shè)計在開發(fā)環(huán)境項目目錄樹狀視圖中,雙擊mainwindo9102“新品入庫”頁02“新品入庫”頁92“新品入庫”頁“新品入庫”頁界面設(shè)計效果如圖17.13所示?!靶缕啡霂臁表摻缑嫔细骺丶膶傩栽O(shè)置見表17.6?!靶缕啡霂臁表摗靶缕啡霂臁表摻缑嬖O(shè)計效果如圖17.13所示。93“新品入庫”頁表17.6“新品入庫”頁界面上各控件的屬性設(shè)置序

號名

稱類

型屬性設(shè)置①newCategoryComboBoxQComboBox—②newNameLineEditQLineEdit—③newInputPriceLineEditQLineEdit—④newOutputPriceLineEditQLineEdit—⑤newCountSpinBoxQSpinBoxalignment:水平的,AlignHCenter;value:1⑥newUploadPushButtonQPushButtontext:上傳...⑦newPictureLabelQLabelgeometry:寬度151,高度151;frameShape:Box;frameShadow:Sunken;text:空;scaledContents:勾選⑧newPutinStorePushButtonQPushButtontext:入庫⑨newClearancePushButtonQPushButtontext:清倉⑩commodityTableViewQTableViewhorizontalHeaderVisible:勾選;horizontalHeaderDefaultSectionSize:120;horizontalHeaderMinimumSectionSize:25;horizontalHeaderStretchLastSection:勾選;verticalHeaderVisible:取消勾選“新品入庫”頁表17.6“新品入庫”頁界面上各控件的屬性設(shè)9403“預(yù)售訂單”頁03“預(yù)售訂單”頁95“預(yù)售訂單”頁“預(yù)售訂單”頁界面設(shè)計效果如圖17.14所示?!邦A(yù)售訂單”頁界面上各個控件的屬性設(shè)置見表17.7?!邦A(yù)售訂單”頁“預(yù)售訂單”頁界面設(shè)計效果如圖17.14所示。96“預(yù)售訂單”頁表17.7“預(yù)售訂單”頁界面上各控件的屬性設(shè)置序

號名

稱類

型屬性設(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ù)售訂單”頁表17.7“預(yù)售訂單”頁界面上各控件的屬性設(shè)9704登

口1.創(chuàng)建步驟2.窗口設(shè)計04登錄窗口1.創(chuàng)建步驟2.窗口設(shè)計981.創(chuàng)建步驟(1)右擊項目名,選擇“添加新文件”菜單項,彈出“新建文件”對話框,如圖17.15所示,選擇模板“Qt”→“Qt設(shè)計師界面類”,單擊“Choose...”按鈕。1.創(chuàng)建步驟(1)右擊項目名,選擇“添加新文件”菜單項,彈出991.創(chuàng)建步驟(2)在“Qt設(shè)計器界面類”對話框中,選擇界面模板為“DialogwithoutButtons”,如圖17.16所示,單擊“下一步”按鈕。1.創(chuàng)建步驟(2)在“Qt設(shè)計器界面類”對話框中,選擇界面模1001.創(chuàng)建步驟(3)在導(dǎo)航頁上,將登錄窗口所對應(yīng)的類名命名為“LoginDialog”,如圖17.17所示,單擊“下一步”按鈕。1.創(chuàng)建步驟(3)在導(dǎo)航頁上,將登錄窗口所對應(yīng)的類名命名為“1011.創(chuàng)建步驟(4)在“項目管理”頁可看到即將添加到項目中的源文件名,確認(rèn)無誤后,單擊“完成”按鈕,如圖17.18所示。1.創(chuàng)建步驟(4)在“項目管理”頁可看到即將添加到項目中的源1022.窗口設(shè)計新添加的登錄窗口可以像程序主窗體一樣在可視化設(shè)計器中進行設(shè)計,我們向其中拖入若干控件,最終效果如圖17.19所示,為便于指示,我們對這些控件也加了①、②、③,…數(shù)字標(biāo)注。2.窗口設(shè)計新添加的登錄窗口可以像程序主窗體一樣在可視化設(shè)計1032.窗口設(shè)計登錄窗口界面上各控件的屬性設(shè)置見表17.8。序

號名

稱類

型屬性設(shè)置①label_3QLabeltext:歡迎進入電子商城;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è)計登錄窗口界面上各控件的屬性設(shè)置見表17.8。序104第17章

【綜合實例】電子商城系統(tǒng)——商品管理系統(tǒng)功能實現(xiàn)第17章【綜合實例】電子商城系統(tǒng)——商品管理系統(tǒng)功能實現(xiàn)01登錄功能實現(xiàn)01登錄功能實現(xiàn)106登錄功能實現(xiàn)登錄功能實現(xiàn)在logindialog.h頭文件和logindialog.cpp源文件中。首先,在logindialog.h頭文件中聲明變量和方法,完整代碼。然后,在logindialog.cpp源文件中實現(xiàn)登錄驗證功能,完整代碼。其中,(a)QstringpwdMd5=strToMd5(ui->pwdLineEdit->text());:由于從數(shù)據(jù)庫中查出的口令字符串是已經(jīng)過MD5加密的,故這里需要先使用自定義的MD5轉(zhuǎn)換函數(shù)strToMd5()將用戶輸入的口令字符串轉(zhuǎn)為MD5加密串后再與從數(shù)據(jù)庫中查出的內(nèi)容比較以驗證。(b)qba=QCryptographicHash::hash(str.toLatin1(),QCryptographicHash::Md5);:Qt5提供了QCryptographicHash類,該類實現(xiàn)了生成密碼散列的方法,可用于生成二進制或文本數(shù)據(jù)的加密散列值。該類目前支持MD4、MD5、SHA-1、SHA-224、SHA-256、SHA-384和SHA-512等多種加密算法。登錄功能實現(xiàn)登錄功能實現(xiàn)在logindialog.h頭文件和10702主體程序框架02主體程序框架108主體程序框架(1)main.cpp它是整個系統(tǒng)的主啟動文件,代碼。其中,(a)if(!createMySqlConn()):createMySqlConn()是我們編寫的一個連接后臺數(shù)據(jù)庫的方法,它返回true表示連接成功,返回false表示失敗。程序在開始啟動時就通過執(zhí)行該方法來檢查數(shù)據(jù)庫連接是否就緒。若連接不成功,系統(tǒng)則通過啟動MySQL服務(wù)進程的方式再嘗試一次;若依舊連接不成功,則提示連接失敗,交由用戶檢查排除故障。(b)if(logindlg.exec()==QDialog::Accepted):之前在登錄對話框的實現(xiàn)中,若用戶通過了口令驗證則執(zhí)行對話框類的“QDialog::accept();”方法,在這里判斷對話框類的返回結(jié)果,即“QDialog::Accepted”表示驗證通過。(2)mainwindow.h它是程序頭文件,包含程序中用到的各個全局變量的定義、方法聲明,完整的代碼。(3)mainwindow.cpp它是本程序的主體源文件,其中包含各方法功能的具體實現(xiàn)代碼,框架。主體程序框架(1)main.cpp10903界面初始化功能實現(xiàn)03界面初始化功能實現(xiàn)110界面初始化功能實現(xiàn)啟動程序時,首先需要對界面顯示的信息進行初始化,在窗體的構(gòu)造方法MainWindow::MainWindow(QWidget*parent)中執(zhí)行我們定義的初始化主窗體方法initMainWindow(),該方法的具體實現(xiàn)代碼。本系統(tǒng)默認(rèn)顯示在前面的是“新品入庫”頁,但是對于“預(yù)售訂單”頁也同樣會初始化其內(nèi)容。上段代碼中使用了loadPreCommodity()方法在預(yù)售訂單頁加載商品信息,該方法的實現(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ù)售訂單”頁)onPreNameComboBoxChange();}界面初始化功能實現(xiàn)啟動程序時,首先需要對界面顯示的信息進行初111界面初始化功能實現(xiàn)這個方法只是在“預(yù)售訂單”頁加載了商品名稱的列表,為了能對應(yīng)顯示出當(dāng)前選中商品的其他信息項,在最后又調(diào)用了onPreNameComboBoxChange()方法,其實現(xiàn)代碼如下:voidMainWindow::onPreNameComboBoxChange(){QSqlQueryModel*preCommodityModel=newQSqlQueryModel(this);

//商品表模型數(shù)據(jù)QStringname=ui->preNameComboBox->currentText(); //當(dāng)前選中的商品名preCommodityModel->setQuery("selectOutputPrice,Amount,PicturefromcommoditywhereName='"+name+"'"); //從數(shù)據(jù)庫中查出單價、庫存、照片等信息QModelIndexindex;index=preCommodityModel->index(0,0); //單價ui->preOutputPriceLabel->setText(preCommodityModel->data(index).toString());index=preCommodityModel->index(0,1); //庫存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);//計算總價ui->preTotalLabel->setText(QString::number(ui->preOutputPriceLabel->text().toFloat()*ui->preCountSpinBox->value()));}界面初始化功能實現(xiàn)這個方法只是在“預(yù)售訂單”頁加載了商品名稱112界面初始化功能實現(xiàn)這樣做了之后,一開始啟動程序直接切換至“預(yù)售訂單”頁,就可以看到某個默認(rèn)顯示的商品信息,如圖17.20所示。界面初始化功能實現(xiàn)這樣做了之后,一開始啟動程序直接切換至“預(yù)113界面初始化功能實現(xiàn)在第一個“新品入庫”頁中,默認(rèn)通過視圖commodity_inf加載了一個庫存所有商品信息的數(shù)據(jù)網(wǎng)格列表,該網(wǎng)格控件支持用戶選擇記錄并與左側(cè)的表單聯(lián)動,通過網(wǎng)格控件的單擊事件過程實現(xiàn):voidMainWindow::on_commodityTableView_clicked(constQModelIndex&index){onTableSelectChange(1);}界面初始化功能實現(xiàn)在第一個“新品入庫”頁中,默認(rèn)通過視圖co114界面初始化功能實現(xiàn)該事件過程向onTableSelectChange()方法傳入一個參數(shù)(為當(dāng)前選中的記錄項的索引),再由該方法實際執(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); //進價ui->newInputPriceLineEdit->setText(commodity_model->data(index).toString());index=commodity_model->index(r,2); //售價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());

//實現(xiàn)類別聯(lián)動}界面初始化功能實現(xiàn)該事件過程向onTableSelectCh115界面初始化功能實現(xiàn)以上代碼中使用showCommodityPhoto()方法來顯示商品樣照,該方法的代碼如下:voidMainWindow::showCo

溫馨提示

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

評論

0/150

提交評論