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

圖1 Qt 下招生管理系統MV 架構圖
借助Qt圖形界面架構,讓用戶可以以圖形界面方式操作招生相關的數據,提高了招生管理系統的適用性,讓非計算機專業人士也能方便處理招生相關的數據。圖形界面只能招生管理系統的一個部分,另一重要部分是內部招生數據的處理。