楊旺喜,羅 征,周洋洋,周峻丞
(海裝駐天津地區(qū)第二軍事代表室,天津 300308)
在設計品類管理軟件時,如果將品類信息硬編碼到軟件中,當品類信息有更改時,就不得不修改和重新編譯發(fā)布軟件,即軟件對品類參數(shù)無可擴展性。
現(xiàn)將品類管理軟件只設計為一個軟件框架[1-3],讓它可以自適應讀取多級品類信息且可支持用戶選擇、實時統(tǒng)計和數(shù)據(jù)保存。圖1 為無配置文件時軟件啟動后的截圖,圖2 為品類配置文件截圖,圖3 為軟件加載品類配置文件后自適應加載信息后的截圖。
圖1 無配置文件時軟件啟動后截圖
圖2 配置文件示例
圖3 軟件加載圖2 所示的配置文件后的截圖
軟件采用3 級品類管理方式[4-5],第一級品類通過工具欄上的下拉框進行選擇,第二級品類通過軟件上的Tab 頁分類展示,第三級品類在各Tab 頁上具體呈現(xiàn)。3 級品類的具體內(nèi)容都通過配置文件具體定義,軟件只提供框架功能,不定義具體品類內(nèi)容。軟件框架如圖4 所示。
圖4 軟件框架圖
第一級品類在軟件上設置為利用工具欄進行下拉選擇(QComboBox),下拉框的內(nèi)容在軟件啟動時通過讀取配置文件夾中配置文件的名稱而定,如配置文件夾中有classA.conf、classB.conf 和classC.conf 共3個配置文件,軟件讀取后,第一級品類下拉框中被填入classA、classB 和classC 這3 個待選項。
當?shù)谝患壠奉愊吕蛑械哪骋粋€品類被選擇后,軟件首先析構(gòu)當前所加載的品類內(nèi)容,然后讀取被選品類對應的配置文件,按照配置文件的內(nèi)容,構(gòu)建Tab頁及展示每個Tab 頁的內(nèi)容。
在第一級品類配置文件中,以中括號將第二級品類名稱括起來,如“[sub-classX]”,以此作為各第二級品類的分隔和第二級品類的名稱。軟件將以第二級品類的數(shù)量創(chuàng)建對應數(shù)量的Tab 頁,將Tab 頁重命名為第二級品類名稱(無中括號),并將默認Tab 頁設為第一個Tab 頁。
在第一級品類配置文件中,每2 個第二級品類名稱之間的行就是第三級品類的內(nèi)容(屬于上一個第二級品類),其中每一行是一種品類,設計如下(舉例):
“工服C;203.0;160,165,170,175,180,185,190;86,88,90,92,94,96,98,100,104,108,110;3”
上面的例子表示,第三級品類之一為“工服C”,其單價為203.0 元,可選衣長有“160,165,170,175,180,185,190”這7 個尺碼,可選衣寬為“86,88,90,92,94,96,98,100,104,108,110”這11 個尺碼,最多可選數(shù)量為3件。這幾個參數(shù)用分號分隔。
軟件的每個Tab 頁內(nèi)最外層是一個列布局(QVlayout),以實現(xiàn)軟件窗口組件自適應窗口大小。該列布局里面是一個滾動窗口(QScrollArea),以實現(xiàn)有較多第三級品類內(nèi)容時可以通過滾動鼠標或點擊下移按鈕展示所有內(nèi)容。在滾動窗口中又是一個列布局,以存放具體的第三級品類內(nèi)容。
軟件解析第三級品類的行內(nèi)容(以上面第三級品類為例),針對每一行,在軟件創(chuàng)建一個行布局。行布局中第一個組件是QCheckBox(復選框),以供用戶選擇該品類;行布局的第二個組件是QLable(標簽),對應于價格;行布局中的第三個組件是QLable(標簽),用于展示該品類的照片;行布局的第四個組件是一個列布局,列布局的2 個組件都是行布局,行布局中是多個QRadioButton(單選框),對應于衣長和衣寬尺碼選項;行布局的第五個組件是一個QSpinBox(自旋框),它可選數(shù)字上限為第三級品類配置的最后一個參數(shù)。
每2 個第三級品類的行布局之間用橫線分割,以增加軟件的可讀性。
將第三級品類圖片保存為配置文件中第三級品類名稱,由軟件解析到品類名稱后,據(jù)此名稱從軟件的資源文件夾加載對應的圖片,具體為先由QFile 將圖片文件讀取到字節(jié)序列變量(QByteArray)中,再將此字節(jié)序列變量轉(zhuǎn)化成一個QImage,最后將它轉(zhuǎn)化為QPixmap(位圖)。
當?shù)谌壠奉惖呐渲眯凶侄螖?shù)量不同時,軟件如何自適應讀取呢?如有這樣一個配置行:
“工服帽B;62.23;59,60,61,62,63,64,65;1”
相較于前面“工服C”的例子,“工服帽”僅有一個尺碼型號,其他品類可能只有“均碼”這樣的尺碼描述。解決辦法是軟件讀取配置時需要判斷分號的個數(shù),以此來判斷有幾個尺碼維度,進而決定行布局的第四個組件是否要創(chuàng)建為一個列布局。
在第一級品類被選擇后,所有的第二、三級品類信息都會被加載到軟件框架中,第二級品類內(nèi)容的切換通過點擊不同的Tab 頁就可以實現(xiàn);但第一級品類的切換,涉及到軟件析構(gòu)當前頁面內(nèi)容再重新加載新的配置文件,過程會復雜很多。
首先是遍歷每個Tab 頁,獲取每個Tab 頁里的布局,繼而獲取該布局中的第一個子元素,如果該子元素里有布局,則采用遞歸的方式繼續(xù)獲取里面的子布局,否則獲取子布局中的QWidget(窗口),析構(gòu)此Widget,最后要把所有的Tab 頁進行析構(gòu)。Tab 頁進行析構(gòu)的執(zhí)行流程如圖5 所示。
圖5 Tab 頁進行析構(gòu)的執(zhí)行流程圖
通過上面的設計,可以實現(xiàn)軟件框架自適應讀取品類配置文件,但軟件的目的是為了實時統(tǒng)計(如實時顯示用戶所選品類總數(shù)、總價等)和保存數(shù)據(jù)。
統(tǒng)計功能的實現(xiàn),需要在創(chuàng)建第三級品類QCheckBox(復選框)和QSpinBox(自旋框)時注冊這2 個組件信號的槽函數(shù),當用戶選擇某個品類時,被觸發(fā)的槽函數(shù)首先遍歷本Tab 頁所有的品類行布局,直到找到發(fā)出信號的品類,然后從該行找到具體內(nèi)容(如價格和數(shù)量等),將計算出的單項值合到軟件所保存的總體值中,以實時為用戶顯示統(tǒng)計值。對于取消勾選的情況,也是類似的。
遍歷所有Tab 頁,遍歷Tab 頁中與第三級品類對應的行布局,進一步解析出代表品類名的復選框及表示所選數(shù)量的自旋框,以判斷用戶是否選擇了該品類及獲取用戶所選的數(shù)量,這些信息綜合起來就構(gòu)成了要保存的材料。
將用戶所選保存到結(jié)果文檔中,用戶需要在軟件框架中輸入特征信息,如身份、時間、組別等,然后以用戶輸入的特征信息為文件名創(chuàng)建文件,接著將軟件中用戶所選的信息及統(tǒng)計結(jié)果保存到該文件中。
軟件用戶在保存結(jié)果文件后,如果想更改之前的選擇清單,可以在軟件框架中通過“文件→打開”選項導入之前生成的結(jié)果文件,以使軟件顯示上次清單內(nèi)容。其關(guān)鍵點為:依據(jù)清單中的第二級品類名打開對應的Tab 頁面,依據(jù)清單中的第三級品類名定位到具體的品類布局行,繼而將第三級品類復選框置為勾選狀態(tài),選定其他配置(如尺碼),設置所選數(shù)量。再次保存文件時設計為提醒用戶是否覆蓋,或者重命名。
針對在軟件中硬編碼品類信息的缺點,本文設計了可以品類自適應的軟件框架,以3 級品類管理為例,介紹了整體軟件框架和各級品類設計、統(tǒng)計及保存功能,詳細介紹了第一、二、三級品類在軟件上的實現(xiàn)方法及第一級品類的在線切換方法,是一種參數(shù)自適應式的軟件設計思路,對其他類似軟件在設計上有一定的借鑒參考意義。