孟繁軍, 李慧哲, 林 民
(內(nèi)蒙古師范大學(xué)計(jì)算機(jī)與信息工程學(xué)院,內(nèi)蒙古呼和浩特 010022)
目前,世界上出現(xiàn)了學(xué)習(xí)“漢語(yǔ)熱”現(xiàn)象,漢語(yǔ)教學(xué)和漢語(yǔ)推廣工作者發(fā)現(xiàn),學(xué)習(xí)漢字是漢語(yǔ)學(xué)習(xí)的瓶頸,而初學(xué)漢字者極易將漢字寫(xiě)錯(cuò)[1]。然而,計(jì)算機(jī)系統(tǒng)中還沒(méi)有一種對(duì)錯(cuò)字進(jìn)行輸入輸出及有效管理的可行方案,也沒(méi)有較好地解決正字與錯(cuò)字同文顯示輸出、錯(cuò)字深層次處理問(wèn)題[2]。目前處理錯(cuò)字的方法主要有:利用圖片嵌入文本顯示輸出;利用造字程序制作錯(cuò)字字模和輸入法鏈接實(shí)現(xiàn)顯示輸出[3]。以圖片方式顯示錯(cuò)字的方法不支持與常用漢字一樣的檢索和深層次加工處理,而制作字模比較復(fù)雜,同時(shí)自造錯(cuò)字占用用戶(hù)預(yù)留編碼區(qū),可選擇的范圍有限。文獻(xiàn)[4]提出了筆段網(wǎng)格漢字字形描述法,該方法提供了描述一切可能漢字字形(包括錯(cuò)字)骨架的能力,但該方法存在的問(wèn)題嚴(yán)重影響了在數(shù)據(jù)庫(kù)中對(duì)錯(cuò)字字形和標(biāo)注文本的統(tǒng)一交互處理。
本文介紹了一種基于Qt的InterV iew框架的表格組件設(shè)計(jì)實(shí)現(xiàn)方法,可以在表格單元中顯示、編輯自定義類(lèi)型數(shù)據(jù),從而實(shí)現(xiàn)這些數(shù)據(jù)的統(tǒng)一布局和交互處理。實(shí)際系統(tǒng)使用表明,該表格組件可擴(kuò)展性強(qiáng),對(duì)多類(lèi)型數(shù)據(jù)統(tǒng)一布局處理界面的設(shè)計(jì)和實(shí)現(xiàn)、建立復(fù)雜交互處理應(yīng)用[5,6]具有實(shí)用意義。
漢字網(wǎng)格字形是一種采用平面網(wǎng)格結(jié)構(gòu)來(lái)描述漢字字形本質(zhì)特征的形式化方法。網(wǎng)絡(luò)結(jié)構(gòu)描述定義為:漢字字形網(wǎng)格[7]是由n×n個(gè)小正方形組成的大正方形;每個(gè)小正方形區(qū)域內(nèi)含有28個(gè)筆段;各頂點(diǎn)到它所在邊中點(diǎn)的連線共8段;各頂點(diǎn)到它對(duì)邊中點(diǎn)的連線,以連線中點(diǎn)為界分為2個(gè)筆段,共16段;對(duì)角線以中點(diǎn)為界分為2個(gè)筆段,共4段;整個(gè)網(wǎng)格有24n2+4n個(gè)筆段;網(wǎng)格中的每個(gè)筆段可以取有線和無(wú)線2種狀態(tài),所有有線筆段分布構(gòu)成了漢字的筆段網(wǎng)格字形。
實(shí)驗(yàn)表明,n=12時(shí),可以表示絕大多數(shù)漢字的字形;n=16時(shí),可以表示所有的字形。例如“爨”采用16×16的網(wǎng)格字形描述,如圖1所示。
圖1 筆段網(wǎng)格字形描述及舉例
InterView是 Q t4.0推出的一個(gè)類(lèi)似于MVC模型的框架[8,9],主要由模型(M odel)、視圖(V iew)和代理(Delegate)3部分組成,其結(jié)構(gòu)如圖2所示。
圖2 InterView框架結(jié)構(gòu)
模型(M odel)和數(shù)據(jù)源(Date Source)通信,并為其它部件提供接口。視圖的主要功能是負(fù)責(zé)把數(shù)據(jù)按布局要求(表格、樹(shù)型等)展示給用戶(hù),也處理用戶(hù)的編輯和輸入,它從模型中獲得模型索引(M odel Index),通過(guò)模型索引來(lái)引用要顯示的數(shù)據(jù)條目。視圖通過(guò)代理來(lái)繪制數(shù)據(jù)條目,當(dāng)編輯條目時(shí),代理和模型直接進(jìn)行通信。數(shù)據(jù)發(fā)生改變時(shí),模型發(fā)出信號(hào)通知視圖,若用戶(hù)對(duì)界面進(jìn)行了操作,視圖則發(fā)出信號(hào)通知代理,代理再發(fā)出信號(hào)告知模型和視圖目前的狀態(tài)。
InterView模型定制的結(jié)構(gòu)與其它一些工具的組件相比,具有更大的靈活性和可擴(kuò)展性,并且用戶(hù)可以通過(guò)代理的代碼完成自定義數(shù)據(jù)類(lèi)型的繪制,因此,對(duì)于軟件界面按統(tǒng)一布局實(shí)現(xiàn)矢量圖形的顯示、自定義類(lèi)型數(shù)據(jù)的處理就更加靈活多樣。在傳統(tǒng)的開(kāi)發(fā)工具中提供的控件,比如微軟的表格控件(Grid),由于采用數(shù)據(jù)、繪制和布局顯示一體化的方式,所以只有對(duì)系統(tǒng)預(yù)定義的類(lèi)型才能顯示在表格的數(shù)據(jù)項(xiàng)中,而非標(biāo)準(zhǔn)的一些數(shù)據(jù)類(lèi)型很難在表格上以統(tǒng)一布局來(lái)顯示相應(yīng)的內(nèi)容。
在實(shí)際應(yīng)用中,利用Q t中的M odel/V iew架構(gòu),程序員重新編寫(xiě)代理類(lèi)的paint函數(shù)后,就可以在Q t的表格組件的單元格上顯示出一些非預(yù)定義類(lèi)型的數(shù)據(jù)項(xiàng),比如位圖、各種矢量圖形數(shù)據(jù)、特殊字形等。本文正是通過(guò)Q t的這種代理類(lèi)機(jī)制,很好地解決了在Qt表格中按統(tǒng)一布局風(fēng)格繪制位圖、網(wǎng)格字形及文本的功能。
根據(jù)InterView模型可知,在Q t下實(shí)現(xiàn)繪制自定義類(lèi)型或特殊類(lèi)型的數(shù)據(jù)項(xiàng)時(shí),需要分別設(shè)計(jì)代理類(lèi),并重寫(xiě)paint函數(shù)和sizeH int函數(shù),定義模型獲取數(shù)據(jù)源,最后通過(guò)代理類(lèi)完成視圖中相應(yīng)內(nèi)容的繪制。本文以在表格(QTableView)視圖中實(shí)現(xiàn)定制表格組件繪制為例,說(shuō)明在視圖中定制組件的技術(shù)方法。
代理負(fù)責(zé)管理項(xiàng)目的輸入和項(xiàng)目的繪制,Qt中使用抽象類(lèi)QAbstractItemDelegate作為代理類(lèi)的基類(lèi),大部分情況下,可以直接從Qt已經(jīng)實(shí)現(xiàn)的通用QItemDelegate類(lèi)繼承,這樣可以使用它提供的上述函數(shù)的缺省實(shí)現(xiàn),以減少代碼量。
在本例中,由于數(shù)據(jù)源提供給模型的數(shù)據(jù)存放在數(shù)據(jù)庫(kù)中,因此,使用繼承于QItemDelegate類(lèi)的QSq lRelationalDelegate派生出新的代理類(lèi)hzTableDelegate。同時(shí),為了實(shí)現(xiàn)定制組件的繪制,必須重新實(shí)現(xiàn)paint函數(shù)。paint函數(shù)完成了從數(shù)據(jù)庫(kù)讀取相應(yīng)的矢量數(shù)據(jù)后,按照對(duì)應(yīng)的顯示區(qū)域,在QTableView中指定的位置重新繪制出信息結(jié)果,同時(shí)對(duì)于存儲(chǔ)在計(jì)算機(jī)的位圖等圖形信息也可以通過(guò)paint重新繪制。具體實(shí)現(xiàn)的主要代碼[10]為:
模型為視圖和代理提供了標(biāo)準(zhǔn)的接口。Qt中所有模型都是基于QAbstractItemM odel派生的。當(dāng)數(shù)據(jù)改變時(shí),模型發(fā)出信號(hào)通知視圖。為了保證數(shù)據(jù)的存取和表示分離,InterView引入了模型索引的概念,每個(gè)數(shù)據(jù)條目通過(guò)模型索引來(lái)獲取,視圖和代理使用索引來(lái)存取數(shù)據(jù)。
如果要實(shí)現(xiàn)自定義的模型,可以從通用的QAbstractItemM odel類(lèi)繼承,也可以從類(lèi)QAbstractListModel與 QAbstractTableModel繼承實(shí)現(xiàn)列表模型或表格模型。實(shí)現(xiàn)自定義模型必須實(shí)現(xiàn)基類(lèi)的純虛函數(shù)和其它一些特定函數(shù)。當(dāng)實(shí)現(xiàn)一個(gè)模型時(shí),QAbstractItemModel本身不存儲(chǔ)任何數(shù)據(jù),它僅僅提供了視圖訪問(wèn)數(shù)據(jù)的接口。
另外,無(wú)論底層的數(shù)據(jù)結(jié)構(gòu)采取何種形式,通過(guò)在特定的模型中實(shí)現(xiàn)標(biāo)準(zhǔn)的QAbstractItem-M odel的函數(shù),達(dá)到以更自然的方式對(duì)底層的數(shù)據(jù)結(jié)構(gòu)進(jìn)行訪問(wèn),因此,用數(shù)據(jù)構(gòu)建模型更為容易,對(duì)于其它的模型/視圖組件也可以使用標(biāo)準(zhǔn)的接口與之進(jìn)行交互。
本例中,由于數(shù)據(jù)存儲(chǔ)在關(guān)系數(shù)據(jù)庫(kù)中,所以沒(méi)有自定義模型,而是直接使用Qt提供的QSq l-RelationalTableM odel類(lèi)生成M odel模型,它和QAbstractItemM odel的繼承關(guān)系如圖3所示。
圖3 QSqlRelationalTableModel繼承關(guān)系圖
程序中主要代碼為:
以上程序代碼運(yùn)行的效果如圖4所示。
圖4 示例程序運(yùn)行效果
圖4中用圓角矩形標(biāo)注的2列中,網(wǎng)絡(luò)字形列為繪制的特殊形狀漢字,標(biāo)記列為繪制的位圖。
文中方法的實(shí)現(xiàn)程序在 Window s XP+ Qt4.5環(huán)境下調(diào)試通過(guò)。本文利用Q t的Inter-View框架,實(shí)現(xiàn)了在表格組件上繪制自定類(lèi)型數(shù)據(jù)的一種方法,該方法為在開(kāi)發(fā)復(fù)雜界面應(yīng)用程序中實(shí)現(xiàn)統(tǒng)一布局、建立一致性的交互接口提供了一種非常靈活、有效的途徑。目前,應(yīng)用該表格組件開(kāi)發(fā)的一套漢字錯(cuò)字字形庫(kù)系統(tǒng)以統(tǒng)一風(fēng)格顯示、編輯錯(cuò)字字形、位圖及標(biāo)注文本等信息,取得了較好的效果。
本文初稿首次刊登于《計(jì)算機(jī)技術(shù)與應(yīng)用進(jìn)展?2010》
[1] 梁彥民.漢字部件區(qū)別特征與對(duì)外漢字教學(xué)[J].語(yǔ)言教學(xué)與研究,2004,(4):76-80.
[2] 張問(wèn)銀,孫星明,曾振柄,等.漢字?jǐn)?shù)學(xué)表達(dá)式的自動(dòng)生成[J].計(jì)算機(jī)研究與發(fā)展,2004,41(5):848-852.
[3] 林 民,韓冬妹,宋 柔.基于GDI+路徑技術(shù)的漢字筆順和部件自動(dòng)繪制[J].計(jì)算機(jī)應(yīng)用研究,2007,24(8): 228-230.
[4] 林 民,宋 柔.一種面向構(gòu)形計(jì)算的漢字字形形式化描述方法[J].中文信息學(xué)報(bào),2008,22(3):115-123.
[5] Lee C,Helal S,Lee W.Universal interactions w ith smart spaces[J].IEEE Pervasive Computing,2006,5(1): 16-21.
[6] Apitz G,Guimb retière F,C ross Y.A crossing-based drawing application[C]//Proceedings of the 17th Annual ACM Symposium on User In terface Softw are and Technology,San ta Fe,NM,USA,October 24-27,2004:3-12.
[7] 王建平,陳正偉,欒慶磊,等.基于多群遺傳算法的漢字識(shí)別系統(tǒng)設(shè)計(jì) [J].合肥工業(yè)大學(xué)學(xué)報(bào):自然科學(xué)版,2010,33(1):42-46.
[8] Hartness K.Graphics and user in terfaces in C++w ith Qt [J].Jou rnal of Compu ting Sciences in Colleges,2005,20(4):198-199.
[9] 蔡志明,盧傳富,李立夏.精通Qt 4編程[M].北京:電子工業(yè)出版社,2008:366-396.
[10] Nokia Corporation.Qt reference documentation[DB/OL]. [2010-03-20].http://qt.nokia.com/doc/4.6/index.h tm l.