歡迎您光臨本站 登入註冊首頁

概述

   QT是挪威的Trolltech公司開發的一個跨平台的C++的GUI組件,而Qtopia智能手機開發平台則是基於QT的桌面系統,是Trolltech為採用嵌入式Lin……

    QT是挪威的Trolltech公司開發的一個跨平台的C++的GUI組件,而Qtopia智能手機開發平台則是基於QT的桌面系統,是Trolltech為採用嵌入式Linux操作系統的消費電子設備而開發的綜合應用平台。在現在競爭日趨激烈的智能手機開發平台上,Qtopia以他的眾多優點,如自身提供豐富的窗口部件集,具有面向對象的特性,易於擴展,真正的組件編程等逐漸為越來越多的手機開發工程師所熟悉和使用。
    本文通過結合對QT開發平台中特殊通信機制的簡略介紹,重點介紹了如何在Qtopia平台上實現輸入法軟鍵盤的策略,以及相應的優化改進,使讀者能大致了解QT平台上開發的流程,對熟悉Qtopia平台以及在此平台上的開發都有很好的輔助作用。

1 Qtopia內部特殊的通信機制
    在Qtopia內部,共有3種特殊的通信機制:Qcop協議,信號-槽(signal-slot)機制和FIFO機制,其中大量應用的是Qcop協議和信號一槽(signal-slot)機制。
    Qcop是QT內部的一種通信協議,主要用於不同的客戶之間在同一地址空間內部或者不同進程之間的通信,大致的使用流程是在函數中使用Qtopia定義好的類:QcopEnvelop,將相關的消息和參數發送出去。然後在需要對Qcop信息進行處理的地方定義好接收管道,同時再定義相關的消息(message)處理函數,根據發送過來的不同的message進行不同的處理。而信號(signal)-槽(slot)機制則是指一種高級介面,應用於C++的對象之間的通信,他取代了很多GUI工具包中的回調函數,分別由以下步驟實現:
(1)當對象改變狀態時,相應的信號(signal)由該對象發射(emit)出去;
(2)而槽(slot)是用來接收指定的signal的,他就是普通的對象成員函數。
    當signal發出的時候,不相關的組件不知道他代表什麼,只有定義好的接收slot才能處理signal信息,從而做到了真正的信息封裝。通過專門的函數connect來指定接收signal的slot,而且signal和slot之間可以一對一,一對多,多對一,多對多,還可以signal觸發signal,非常的靈活和易用,對應關係如圖1所示。
 
圖1 signal與slot的對應關係
    與在其他平台上開發的輸入法模塊明顯不同的是,在Qtopia平台上開發輸入法模塊充分利用了其內部特殊的通信機制,尤其是信號-槽(signal-slot)機制,從而使輸入法的實現簡潔明了。

2 軟鍵盤功能中各部分模塊的實現
    現在準備在Qtopia平台上實現軟鍵盤的功能。代碼都是在PC上的Qtopia模擬器環境下做的編寫和修改。Qtopia模擬器是Trolltech公司提供的輔助開發工具,用於在PC上模擬出手機開發板上的開發情況,方便Qtopia工程師進行代碼修改和調試。而最後的調試則是在debug板上進行的,通過看實際的效果,有助於發現一些在模擬器上容易忽略的問題。為了簡化敘述手段,將可能提到的調用函數的形參全部省去,如emit key(int unicode,int scancode,int mode,bool press,bool repeat)省略為emitkey(),具體的函數調用實現請參閱QT的幫助手冊。
    項目計劃總共要實現拼音,英文和符號輸入法鍵盤共3個模塊,現在重點描述最具有代表性的拼音輸入法鍵盤的實現。其鍵盤草圖如圖2所示。
 
圖2 拼音輸入法鍵盤草圖
    下方的軟鍵盤即是輸入按鈕所在的地方,上方2條選擇欄分別是輸入的拼音顯示欄和與拼音對應的漢字候選欄。要完成這個鍵盤必須實現如下幾個模塊:

  • 拼音輸入法引擎模塊 用來實現與拼音匹配的漢字。
  • 智能匹配模塊 搜尋與輸入拼音相接近的漢字以及聯想的片語。
  • 漢字選擇欄 顯示模塊顯示對應的漢字。
  • 拼音輸入欄 顯示模塊顯示輸入的拼音。
  • 軟鍵盤輸入界面模塊 接收用戶的輸入,轉給Qtopia系統。

    拼音輸入法引擎模塊直接購買了第三方廠商的產品,智能匹配模塊則是隨著引擎一起購買而來的,但是由於廠商開放了模塊的源代碼,在實現的時候按照客戶的需要做了一些小小的改動,如調整了一些原來匹配字元順序的不合理,提高了某些字元的優先順序等。
    漢字選擇欄模塊類picksboard.cpp和拼音顯示欄模塊類pickboardPY.cpp都繼承自QT中的Qframe類,在確定選擇欄的尺寸之後,採用輸入法引擎模塊的字元顯示介面, 即可以正確地顯示需要選擇的字元。
    輸入法界面模塊是重點要解決的模塊,於是先初始化鍵盤類keyboardconfig.cpp,這個類繼承自QT 中的Qobject類 然後在調用軟鍵盤的時候使用qtopia中的繪圖函數drawLine()和setPen()畫出一個軟鍵盤。然後需要達到的目標是:在軟鍵盤上點擊所見的字元后,能正確地顯示字元;點擊軟鍵盤上的某個按鈕后需要有按鈕反白,給使用者視覺上以按下按鍵的效果。
    實現原理是在Qtopia中提供了一個key()信號。根據前面說過的信號-槽(signal-slot)機制,在點擊軟鍵盤按鍵時,發送相應的帶參數的key()信號給Qtopia系統,即emitkey(unicode,scancode,mode,true,false),Qtopia系統中有專門的接收key()信號的槽來根據參數unicode,作為字元的惟一識別標誌,在對應的unicode表中尋找對應的字元,顯示在屏幕上即可,十分簡單高效。
    按鍵反白的效果採用了在按下按鍵時對鍵盤進行重繪,將按下的那個按鍵區域填塗上反白的顏色,而放開按鍵的時候再次對鍵盤進行重繪,將按鍵區域填塗上原鍵盤的顏色。即按照如下的一個流程:初始化一繪製軟鍵盤(彈出軟鍵盤)一點擊觸摸屏一重繪軟鍵盤(按鍵反白顯示)一釋放觸摸屏一再次重繪軟鍵盤(軟鍵盤正常顯示)。

3 組合模塊,軟鍵盤的實現
軟鍵盤的實現流程如圖3所示。
 
圖3 軟鍵盤實現流程圖
    現在前期的準備工作都已經完成,應該在合適的位置組成軟鍵盤。在Qtopia模擬器的顯示屏上,為了不與其他控制項產生衝突,也為了選擇欄和軟鍵盤的相對位置有個根據的基準,還需要專門為軟鍵盤的顯示設置一個容器(container)。因此再寫出一個類keyboardContainer.cpp,每次在彈出軟鍵盤之前,先初始化和彈出container,然後選擇欄和軟鍵盤的顯示就以這個容器的顯示位置為依據,從而顯示在正確的位置上,這樣處理還有一個好處就是:要調整整個軟體盤的位置,只要調整容器的位置即可,而不用去改動其他代碼。
    於是在完成keyboardContainer.cpp類之後,將選擇欄和軟鍵盤在容器里的正確位置顯示,然後將容器在整個Qtopia模擬器上的正確位置顯示即可,經過測試,可以達到目的。

4 軟鍵盤實現策略的改進和優化
    將代碼下載到debug板上進行調試時,發現在軟鍵盤彈出時有比較明顯的刷新遲滯和閃爍現象,不能達到彈出和反白顯示正常的要求。經過跟蹤和分析,以及對調試板性能的估計,發現原因在於:採用ARM 架構的debug板上的CPU主頻較低,無法很順暢地即時重繪軟鍵盤,而在模擬器上調試時,由於PC的CPU頻率較高,則不影響軟鍵盤的重繪。
    解決問題的關鍵在於提高重繪鍵盤的速度。於是考慮用貼圖來代替重繪,實現策略是將軟鍵盤圖片先保存在內存中,在需要的時候直接調用內存中的圖片,這樣就省去了重繪的時間,可以大大提高速度。按鍵反白效果的顯示,也是用反白顏色的按鍵小圖片來代替對按下鍵的填塗顏色,同樣不需要對鍵盤進行重繪。經過計算,圖片佔用內存約100 kB,對於智能手機上64 MB左右的內存大小來說,完全承受得起。Qtopia中也提供了bitBlt()函數來將內存中的圖片直接顯示在屏幕上。
    還有一點要注意,由於初始化圖片的數量比較多,會影響開機的速度,可以將初始化圖片的時間推后,考慮到一般用戶使用軟鍵盤的習慣,將初始化圖片的時間定在完全開機后的1~3 s是可行的。用Qtopia中的定時器類函數可以順利地實現這一點。在優化之後,再次將代碼下載到debug板上,經過測試,發現鍵盤的彈出和反白顯示都沒有停滯感,功能也可以完全實現,從而順利地完成了Qtopia上的拼音輸入法軟鍵盤模塊的實現。

5 結語
    在現在的手機開發中,第三方廠商所能提供的支持越來越多,但是在任何一款新手機的開發里,輸入法模塊的實現都是必須自行開發的。Qtopia提供了大量靈活的函數,在嵌入式系統這個內存小,CPU主頻相對較低的特殊環境下,為順利實現模塊功能提供了很大的選擇餘地。因此,這個Qtopia平台上輸入法模塊實現的例子有嵌入式開發人員可以借鑒的地方,同時也說明了Qtopia平台以他優良的擴展性能,一定能夠在競爭激烈的手機開發平台市場中佔有自己的一席之地。


[admin via 研發互助社區 ] 智能手機開發平台QT中軟鍵盤的實現及改進已經有1956次圍觀

http://cocdig.com/docs/show-post-42224.html