張曉光,何佰丹,潘華強
(武漢軟件工程職業(yè)學(xué)院,湖北 武漢 430205)
高校招生錄取數(shù)據(jù)是高等院校使用全國普通高校招生網(wǎng)上錄取院校子系統(tǒng)進行招生錄取導(dǎo)出的數(shù)據(jù)。高校招生信息系統(tǒng)主要實現(xiàn)錄取數(shù)據(jù)的存儲、分析、匯總、打印通知書等功能。
全國普通高校招生網(wǎng)上錄取應(yīng)用軟件高校子系統(tǒng)(以下簡稱錄取系統(tǒng)),是教育部組織全國普通高校招生網(wǎng)上錄取課題組開發(fā)研制,為普通高校完成本、??普猩W(wǎng)上錄取工作設(shè)計的、在錄取階段給高校提供通過網(wǎng)絡(luò)與省級招辦交互招生信息、完成招生錄取工作的一個專用軟件。
在1996年以前,高校招生完全依靠招生工作人員奔走各地,在當?shù)卣修k的配合下進行現(xiàn)場錄取[1],高校招生工作自1999年在重慶等9個試點省(自治區(qū)、直轄市)及北大、清華等12所高校開始試行網(wǎng)上錄取[2],2001年為進一步提高高校招生的網(wǎng)絡(luò)化發(fā)展,我國建立了“全國普通高校招生網(wǎng)上錄取系統(tǒng)”并投入使用[3]。自2001年普通高校招生全面實施網(wǎng)上錄取以來,內(nèi)陸地區(qū)的所有普通高校均使用本系統(tǒng)在除港澳臺及廣東省外的省、自治區(qū)、直轄市開展遠程網(wǎng)上錄取工作。后來,香港部分高校在內(nèi)地的招生工作也使用此系統(tǒng)進行。在新高考改革的背景下,新型全國普通高校招生網(wǎng)上錄取系統(tǒng)也孕育而出,新版本僅用于在改革后省份的錄取工作,其他省份的錄取工作使用原版本進行。
錄取系統(tǒng)是錄取數(shù)據(jù)的來源。由于招生系統(tǒng)導(dǎo)出的錄取數(shù)據(jù)格式只是錄取系統(tǒng)里考生數(shù)據(jù)庫表格文件的簡單拷貝,每張數(shù)據(jù)表格字段名稱都是字母縮寫,數(shù)據(jù)表格之間存在鏈接關(guān)系,所以招生系統(tǒng)導(dǎo)出的數(shù)據(jù)對于非專業(yè)用戶來說不具備可讀性。
高校招生信息系統(tǒng)(以下簡稱招生管理系統(tǒng))首要處理任務(wù)是處理錄取系統(tǒng)導(dǎo)出的錄取數(shù)據(jù),將數(shù)據(jù)庫中必要的考生相關(guān)信息提取出來到一張數(shù)據(jù)表中,并以中文命名字段名稱。在多個省份有招生任務(wù)的高校需要多次導(dǎo)出各個省份的所有批次的錄取數(shù)據(jù),并通過招生管理系統(tǒng)將不同省份的不同批次的錄取數(shù)據(jù)進行匯總。
招生管理系統(tǒng)在導(dǎo)入一個包含錄取數(shù)據(jù)的文件夾后,進行數(shù)據(jù)的分析與匯總,并以表格形式向用戶顯示已經(jīng)導(dǎo)入的錄取數(shù)據(jù)的相關(guān)信息。用戶可以通過點擊選擇已經(jīng)導(dǎo)入的某行錄取數(shù)據(jù)(即一次導(dǎo)入的錄取數(shù)據(jù)),并進行打印通知書或?qū)С鱿嚓P(guān)錄取的考生信息。
招生管理系統(tǒng)包含錄取通知書套打功能。套打功能是應(yīng)用在打印多頁同類的紙張,此同類的紙張大部分內(nèi)容相同,只有某幾個位置的數(shù)據(jù)每一張都不一樣,套打功能一般是把相同的部分與需要修改的部分分開打印,先把相同的部分打印出來,再直接在上面打印不同的部分。招生管理系統(tǒng)的通知書套打功能是打印通知書中不同的部分,不同的部分的數(shù)據(jù)就是錄取數(shù)據(jù)中的各個考生姓名等信息。
招生管理系統(tǒng)的通知書套打功能的主要模塊是通知書套打模板的編輯功能。模板編輯功能需要在紙張的恰當位置設(shè)置套打的數(shù)據(jù)項,需要通過圖形界面與鼠標拖動操作來編輯數(shù)據(jù)項的位置。
Windows下主流的圖形界面開發(fā),最早的有VB開發(fā),使用的是Basic語言,目前無論是Visual Basic還是Basic語言基本已被淘汰。在C++語言流行的時段Windows圖形界面開發(fā)有MFC框架,MFC也是一個比較成熟的應(yīng)用程序開發(fā)框架[4],目前新的軟件基本沒有使用MFC進行開發(fā)了,只對以前MFC軟件進行維護。微軟在.net和C#語言的支持下的開發(fā)了圖形界面開發(fā)庫WPF,WPF是微軟新一代矢量圖形系統(tǒng),用于為不同用戶界面提供統(tǒng)一的顯示系統(tǒng)[5]。
Qt是跨平臺的圖形用戶界面(GUI)應(yīng)用程序開發(fā)框架。于1995年5月首次公開發(fā)行,2016年Qt公司獨立并在納斯達克赫爾辛基獨立上市,目前最新的版本為Qt 6。Qt讓原型設(shè)計、開發(fā)、測試、部署的周期更快,更高效。Qt與眾多操作系統(tǒng)和硬件兼容,只需編寫一次源代碼,就可以部署在任何需要的地方。
由于計算機運行速度的提升,編程語言得到了發(fā)展,從最初的使用0、1二進制進行編程的方式進步到匯編語言、面向過程的編程語言、面向?qū)ο蟮木幊陶Z言、解釋型編程語言,編程的難易度在降低、代碼長度在降低,是編程語言發(fā)展的趨勢。
Python語言是最近流行起來的面向?qū)ο缶幊陶Z言,是解釋型的腳本編程編程語言,需要Python運行庫才能運行。
Python下Qt開發(fā)的庫有PyQt和PySide。PyQt要比PySide推出時間早得多,由于推出時間早,PyQt就比較成熟了,并且資料也很完善,最開始是有PyQt4對應(yīng)的是Qt4版本,后來推出了PyQt5,對應(yīng)Qt5版本。PyQt的采用的是GPLv3許可證和需要購買版權(quán)的商業(yè)許可證發(fā)布的,GPLv3許可證大概意思就是說,使用PyQt后你的程序就必須要開源,如果閉源商用就會違反協(xié)議,后果自負[6]。對比PyQt,PySide就要晚的多問世了。上面我們說到PyQt的開發(fā)商是Riverbank Computing,而PySide就不同了,是Qt公司開發(fā)的,PySide2對應(yīng)Qt 5版本,PySide6對應(yīng)Qt 6版本。PySide是LGPL協(xié)議的,LGPL協(xié)議是一個商業(yè)友好的協(xié)議,使用LGPL協(xié)議開發(fā)閉源程序,如果你使用動態(tài)鏈接的形式,那么,你可以以任何形式(商業(yè)的、非商業(yè)的、開源的、非開源的等等)發(fā)布你的應(yīng)用程序[7]。
招生管理系統(tǒng)是使用Python語言開發(fā),并使用PySide庫開發(fā)Qt架構(gòu)下的圖形界面應(yīng)用程序。
Qt的圖形界面架構(gòu)有三大主模塊:QtCore、QtGui、QtWidgets。
QtCore包含的是核心的非GUI的功能類,如信號和插槽、屬性、項模型的基類、序列化等。QtCore的Meta-Object System(元對象系統(tǒng))為對象間通信、運行時類型信息和動態(tài)屬性系統(tǒng)提供了信號和插槽機制[8]。信號和插槽用于對象之間的通信。信號和插槽機制是Qt的一個核心特性,可能是與其他框架提供的特性最為不同的部分。
QtGui是繼承QtCore的包含GUI相關(guān)功能的類,包含事件、窗口和屏幕、OpenGL和基于光柵的二維繪制以及圖像。
QtWidgets包含為應(yīng)用程序提供現(xiàn)成的小部件,包括UI的圖形元素。Qt小部件模塊提供了一組UI元素來創(chuàng)建經(jīng)典的桌面風(fēng)格的用戶界面。Qt框架的主要用戶界面技術(shù)是Qt快速控制和Qt小部件。Qt快速控制接口是流體、動態(tài)的。Qt小部件用于創(chuàng)建復(fù)雜的桌面應(yīng)用程序。
在Smalltalk中有Model-View-Controller(MVC)(模板-視圖-控制器)設(shè)計模式。MVC由三種對象組成,Model(模型)是應(yīng)用程序?qū)ο螅琕iew(視圖)是它的用戶界面的顯示表示,Controller(控制器)是對用戶輸入的反應(yīng)。在MVC之前,用戶界面設(shè)計傾向于將這些對象組合在一起,MVC將它們解耦以增加靈活性和重用性。
如果View(視圖)和Controller(控制器)對象相結(jié)合,結(jié)果就是Qt的Model/View(MV)(模型/視圖)體系結(jié)構(gòu)[9]。MV體系結(jié)構(gòu)仍然將數(shù)據(jù)的存儲方式與呈現(xiàn)給用戶的方式分開,MV體系結(jié)構(gòu)是基于MVC相同的原則,但提供了一個更簡單的框架。
Qt包含一組視圖類,這些類使用Model/View(模板/視圖)體系結(jié)構(gòu)來管理數(shù)據(jù)之間的關(guān)系以及數(shù)據(jù)呈現(xiàn)給用戶的方式。此體系結(jié)構(gòu)引入的功能分離為開發(fā)人員提供了更大的靈活性,并提供了一個標準的模型接口,允許廣泛的數(shù)據(jù)源與現(xiàn)有的項視圖一起使用。
數(shù)據(jù)的存儲方式與顯示給用戶的方式分開,這種分離使得可以在幾個不同的視圖中顯示相同的數(shù)據(jù),并實現(xiàn)新的視圖類型,而無需更改底層數(shù)據(jù)結(jié)構(gòu)。為了靈活地處理用戶輸入,Qt中引入了Delegate(委托)的概念,使用Delegate(委托)的優(yōu)點是,它允許我們定制呈現(xiàn)和編輯數(shù)據(jù)項的方式。
使用招生管理系統(tǒng)的前提是一個年份的所有導(dǎo)出的錄取數(shù)據(jù)放在一個根目錄文件夾中,根目錄文件夾中每一個子文件夾里存儲的是從錄取系統(tǒng)導(dǎo)出的一個省市的一個錄取批次的錄取數(shù)據(jù)(也可是包含一個省份的多個錄取批次線數(shù)據(jù))。此時的子文件夾即為投檔單子文件夾數(shù)據(jù)。根目錄文件夾里還包含當前年份的配置信息:根投檔單屬性信息、專業(yè)信息數(shù)據(jù)、專業(yè)修改數(shù)據(jù)。
招生管理系統(tǒng)主要需要與用戶進行圖形界面交互的有投檔單子文件夾數(shù)據(jù)、根投檔單屬性數(shù)據(jù)、專業(yè)信息數(shù)據(jù)、專業(yè)修改數(shù)據(jù)、導(dǎo)出格式配置數(shù)據(jù)和通知書模板。
通知書模板的編輯功能主要使用的是Qt的繪制功能,模板編輯功能的核心類是設(shè)計畫布類(DesignCanvas),DesignCanvas類從Qt的QtWidgets.QWidget派生,通過重載與鼠標操作有關(guān)的4個函數(shù)(鼠標移動、鼠標按下、鼠標釋放、鼠標雙擊)來獲取與鼠標有關(guān)的操作,實現(xiàn)模板中元素的拖動、縮放等功能。通過重載繪制(paintEvent)函數(shù)來自定繪制相關(guān)元素的不同狀態(tài)(選中、拖動、縮放等)。由于QWidget沒有鼠標的單擊操作,而單擊操作是模板編輯中必須要的一個功能,所有只能通過鼠標按下和鼠標釋放這兩個事件來判斷鼠標的單擊操作。模板中元素的框選功能也是通過鼠標按下、拖動和釋放來實現(xiàn)的。模板中多選操作是通過當用鼠標單擊元素時判斷鍵盤Ctrl鍵是否按下來實現(xiàn)的。
投檔單子文件夾數(shù)據(jù)信息以表格的形式顯示給用戶,每個子文件夾信息為一行數(shù)據(jù),通過Qt的QtWidgets.QTableView來實現(xiàn)表格顯示。每一行子投檔單文件夾信息顯示的都是文本內(nèi)容信息,但是修改某些字段時需要特殊的編輯模式,比如錄取時間字段。錄取時間的默認值是導(dǎo)入子投檔單文件夾信息的時間,當然用戶也可以進行修改。當在表格(QTableView)中修改某個單元格時,QTableView中單元格內(nèi)容默認是文本內(nèi)容,修改也是通過鍵盤輸入來修改文本,如果需要改變表格中數(shù)據(jù)的設(shè)置方式,則需要通過Qt的Model/View模式中的Delegate(委托)功能。通過從QtWidgets.QStyledItemDelegate繼承來創(chuàng)建自己的Delegate類:DateDelegate(日期委托類)。DateDelegate類通過重載createEditor(創(chuàng)建編輯器)、setModelData(設(shè)置Model數(shù)據(jù))、setEditorData(設(shè)置編輯器數(shù)據(jù))這三個函數(shù)來實現(xiàn)日期類型的編輯功能。在createEditor(創(chuàng)建編輯器)函數(shù)中創(chuàng)建一個Qt中的QtWidgets.QDateEdit對象來實現(xiàn)日期類型編輯功能,同時在上面兩個設(shè)置數(shù)據(jù)的函數(shù)中(setModelData、setEditorData)通過適應(yīng)QDateEdit來設(shè)置相應(yīng)數(shù)據(jù)。
在設(shè)置根投檔單屬性時,也是以表格形式(QTableView)設(shè)置。由于屬性有三種不同的屬性類別(靜態(tài)、文本、日期),在修改表格(QTableView)中屬性類別時以下拉列表框的形式讓用戶選擇屬性類別。此次也需要從使用委托(Delegate)功能,與上面日期委托類不同的是,此時創(chuàng)建的是QtWidgets.QComboBox類對象。
另一種表格(QTableView)中單元格的特殊修改功能是選擇功能,選擇功能是指在表格中選擇一行數(shù)據(jù),在這一行數(shù)據(jù)前打勾,用戶再次單擊后取消打勾。此種實現(xiàn)是通過Qt的信號和插槽機制,監(jiān)聽表格的單擊事件,特殊處理打勾的單元格的單擊事件。
在Qt的MV架構(gòu)中數(shù)據(jù)是存儲在Model中的,招生管理系統(tǒng)需要將數(shù)據(jù)存儲在硬盤中,這時只需要將Model中的數(shù)據(jù)以原表格形式存儲為Excel表格即可,Excel表格的第一行即為標題行,從第二行開始為數(shù)據(jù)。當系統(tǒng)從硬盤中讀取數(shù)據(jù)并以表格形式顯示給用戶時,此時需將Excel表格數(shù)據(jù)轉(zhuǎn)換成Model數(shù)據(jù)。從Excel中讀取數(shù)據(jù)到系統(tǒng)里直接采用QtGui.QStandItemModel類對象存儲數(shù)據(jù),當以表格形式(QTableView)顯示時,直接將此Model(QStandItemModel)對象與View(QTableView)對象進行鏈接即可,用戶修改后保存數(shù)據(jù)時,可直接將Model存儲為Excel數(shù)據(jù)保存,無需其他的轉(zhuǎn)換操作。Qt下招生管理系統(tǒng)的圖形用戶界面MV架構(gòu)如下圖所示:
圖1 Qt 下招生管理系統(tǒng)MV 架構(gòu)圖
借助Qt圖形界面架構(gòu),讓用戶可以以圖形界面方式操作招生相關(guān)的數(shù)據(jù),提高了招生管理系統(tǒng)的適用性,讓非計算機專業(yè)人士也能方便處理招生相關(guān)的數(shù)據(jù)。圖形界面只能招生管理系統(tǒng)的一個部分,另一重要部分是內(nèi)部招生數(shù)據(jù)的處理。