從4月3號到現在,花了將近三天的時間來摸索在開發板上實現數據輸入的問題。到現在終於有一點點進展,將之稱爲MileStone是爲了給自己壯膽,增加信心的,達人們見笑了!
一、爲什麼要在終端實現輸入法
在計算機的體系結構中,輸入、輸出、處理系統,存儲系統是幾個不可缺少的部分。我們所開發的嵌入式產品其實也是一臺微小的計算機系統。在這裏,處理器是ARM9,存儲系統由RAM、Flash和SD卡組成,輸出系統是觸摸屏,同時通過觸摸屏的點擊實現了鼠標的功能,唯獨沒有傳統電腦的鍵盤系統。而爲了在終端設置各種各樣的信息,光靠鼠標點擊顯然是不夠靈活的,因此需要實現鍵盤的輸入。
硬件上增加鍵盤不是不可以,但又要增加系統成本,同時需要寫相應的驅動,工作量也不小。所以考慮在界面上實現軟鍵盤,也就是說“畫”一個跟硬件鍵盤一樣的界面,通過觸摸屏的點擊模擬手指擊打鍵盤實現輸入。
二、實現思路:
實現軟鍵盤的思路大致有三個:
1、 白手起家。自己用按鈕拼出一個界面,然後編寫後面的事件觸發函數,還要設計詞碼錶,處理起來應該難度很大,而且搞不好系統開銷很大,沒有一年半載估計玩不轉。
2、 藉助Qtopia,在Qt的世界中,許多概念是比較讓人摸不着頭腦的。Qt,Qt/E,Qtopia Core, Qtopia,而且又有2,3,4等版本區別,不同版本兼容性較差,這些往往讓初學者摸不着頭腦。下面結合個人理解做一簡介:
Qt泛指Qt的所有桌面版本,比如Qt/X11,Qt Windows,Qt Mac等。由於Qt最早是在Linux中隨着KDE流行開來的,因此通常很多人說的Qt都指用於Linux/Unix的Qt/X11。
Qt/E(Qt/Embedded)是用於嵌入式Linux系統的Qt版本。Qt/E去掉了X Lib的依賴而直接工作於Frame Buffer上,因而效率更高,但它並不是Qt的子集,而應該是超集,部分機制(如QCOP等)不能用於Qt/X11中。
Qtopia是一個構建於Qt/E之上的類似桌面系統的應用環境,目前看來就是Qtopia Phone Editon(QPE)。相比之下,Qt/E是基礎類庫。
Qtopia Core:就是原來的Qt/E,大概從Qt 4開始改名,把Qtopia Core併到Qtopia的產品線中去了。但實際上Qtopia Core就相當於原來的Qt/E,仍然作爲基礎類庫。
另外,似乎奇趣最近又把Qtopia Core改名叫做Qt for Embedded Linux了,不知道是不是因爲Qtopia Core搞得大家都很糊塗,沒人來買的緣故。
值得一提的是Qt-3.x是沒有Qtopia的,也就是說你不要費力去尋找Qtopia-3.x來適應你的qt/e-3.x了。如果你的程序是用Qt3開發的,而你一定要用Qtopia,兩條路:一是退回2,二是根據Trolltech提供的文檔進行3到4的升級。
很不幸,我就是用Qt3的人之一,所以現在此路不通了,只能放棄藉助Qtopia,還有另外一個原因,如果用了桌面系統,到時候可能要去掉開機時候的屏幕校正程序而直接設定自己的應用程序自啓動,這些東西也是挺麻煩的。
3、 直接在Qt/E-3.x上移植輸入法
這是最後一條路了,也是必須要走通的一條路。上網搜了一下,這樣做的比較少,但也不是沒有。尤其是在http://www.hi-pda.com/forum/viewthread.php?tid=191027&extra=&page=1中幾位高手長達兩三年的熱烈討論,以及DeepWater前輩開發的MurphyPinyin輸入法,能給人很多啓發。我正是在反覆閱讀了該帖之後成功的。
三、具體做法
首先向開發MurphyPinyin的前輩們致敬,沒有他們,不知道什麼時候才能實現我想要的功能。具體做法:
1、 下載源碼MurphyPinyin-src.tgz和補丁patch-softkeyboard。
值得一提的是DeepWater最初上傳的源碼是針對zaurus的,那個東東是帶了硬件鍵盤的,因此意味着源碼中沒有包含軟鍵盤。甚至該帖第一頁的源碼有可能是不完善的。所以最好要到http://sourceforge.net/projects/murphypinyin/下載MurphyPinyin-0.03-src.tgz。光有這個還不行,對於我們這種沒有鍵盤的需要一個軟鍵盤。高人chyang在討論的第二頁,也就是70多樓的時候給出了他的patch。如果有此需要,請下載74樓的murphytalk-patch.gz或者76樓的patch-0.3.gz。我用的是後者,前者未經驗證,如有人做過,請留言說明結果。
2、 解壓:tar zxvf MurphyPinyin-0.03-src.tgz 產生MurphyPinyin文件夾。
tar zxvf patch-0.3.gz.。
patch解壓後放在MurphyPinyin文件夾中。
3、 將MurphyPinyin文件夾的只讀屬性去掉,並應用到子文件夾,防止打軟鍵盤patch時候不成功。
4、 執行打補丁patch-softkeyboard:Patch –p1< patch-softkeyboard。這裏是1。
說到patch,可能有些人不知道怎麼回事,其實說白了就是把要修改的東西通過標記記錄到一個文件中,要刪掉的用-開頭,要增加的用+開頭。打開patch文件一看就明白。打補丁過程會有兩問,第一個問題是否取消原來的補丁,第二個問你是否再次使用這個補丁。分別答n和y。
5、 修改PinyinFrame.cpp中關於配置文件和碼錶文件的位置。打完包主要是給PinyinFrame中加入了軟鍵盤功能,但由於源碼是針對Qtopia的,要移植到qte上,必須把與Qtopia有關的內容改成qte的類的。具體改動如下:把QpinyinFrame.cpp中qpe相關的頭文件註釋掉,不去掉肯定會報錯嘛。包括qpe/golbal.h和qpe/qpeapplication.h這類的。把QpinyinFrame.cpp中關於QPEApplication的代碼註釋掉。換成Qwidget的:QPEApplication::grabKetboard 對應QWidget::grabKeyboard()
QPEApplication::ungrabKetboard 對應QWidget::releaseKeyboard()
6、 覈對配置文件的存放路徑。由於是qte的,因此修改不是X86的那個路徑,這些文件。這些文件有:3個文件(pinyin_table.txt,murphytalk_phrase_idx.txt,murphytalk.conf)位置一定按PinyinFrame.cpp裏位置放好,1個文件(murphytalk_phrase.dat)位置一定按PinyinPhrase.cpp裏位置放好, 你也可以改位置。你可以把文件存放到程序指定的位置,也可以修改程序中的路徑爲你當前文件所在位置。