1. 程式人生 > >qt移植輸入法

qt移植輸入法

最近搞了一個組織細胞脫水機專案,當然,對於國內的專案都是仿來仿去的,我們也不例外,開啟被仿機器後,第一個看到的介面就是使用者登入介面,需要輸入中文,作為一個程式設計師,我的第一反應就是我需要採用什麼用的框架來做這個介面,方向是多方面的,肯定會選擇自己熟悉的一個,自然而然,我選擇了QT來做介面,但是QT並沒有像安卓,IOS,C#等支援得那麼完美,畢竟做的人不是那麼多,所以相對不是那麼完美。我們沒有滑鼠鍵盤這樣的外設,所有的使用者互動都是通過觸控顯示屏。這裡碰到的第一個問題就是:QT軟鍵盤製作。下面進入正題,我是怎麼解決這個問題的。

第一階段—-找到syszuxpinyin原始碼

與大部分人一樣,碰到一個問題不會解決,先問一下百度大神怎麼看,網上搜QT軟鍵盤,有各種各樣的解決方法,有些我也下載運行了,不是很好用,有些還需要錢,對於要錢的,可以理解,但是我覺得沒必要。最後我選擇了一個非常接近的嵌入式QT軟鍵盤思路,syszuxpinyin

點選開啟連結,將原始碼下載後,按照指定的方法移植,在arm板子上執行,發現有兩個問題;

第一:QLineEdit中的內容總是append在後面;第二:不能重複點選某個控制元件;

第二階段—-修改syszuxpinyin原始碼

帶著前面兩個問題,我又百度,找到了另外一個部落格點選開啟連結,按照其中一個的方法修改了,但是發現又有一個問題,只要點選軟鍵盤返回按鈕,程式就死在那裡了,最終經過排查,程式問題出在一個語句current_focus_widget = QApplication::focusWidget();後來和群裡的朋友聊聊天才知道,在嵌入式QT版本里,用這樣的方法獲取焦點是有bug的。

第三階段—-詳細分析syszuxpinyin原始碼

既然沒有找到完全匹配的方法,而且又研究了這麼久的syszuxpinyin後,決定將syszuxpinyin的原始碼吃透,看有沒有更多的收穫

做了註釋的syszuxpinyin程式碼如下地址:http://pan.baidu.com/s/1i56lUiL

分析syszupinyin架構:

syszupinyin的架構由兩部分組成

第一部分:軟鍵盤介面,獲取使用者輸入的字串,來匹配字型檔中的漢字或者顯示英文,顯示在QLineEdit中,點選返回的時候,將漢字或英文傳送出去。

第二部分:QWSInputMethod的子類

第二部分中,由於介面焦點獲取的問題即QApplication::focusWidget()出現bug,自動獲取焦點失敗。那麼既然獲取焦點失敗,那麼控制元件成為焦點的時候,可以自己把自己說出來,轉換成程式設計方法就是重寫控制元件的mousePressEvent方法。

第四階段—-實現嵌入式QT軟鍵盤

根據syszuxpinyin軟鍵盤介面程式碼和重寫輸入控制元件的mousePressEvent方法來實現嵌入式QT軟鍵盤,其實不只是嵌入式版本可以使用,PC機版本也可以使用。

思路:

1 重寫輸入控制元件的mousePressEvent方法,在mousePressEvent方法中發射訊號,並且將字串傳送出去,主視窗接收到訊號後,開啟相應的槽函式,在槽函式中開啟軟鍵盤介面,並且將訊號傳送過來的字串顯示在軟鍵盤介面中。

2 開啟軟鍵盤後,可以在介面上可以選擇中英文輸入法,如果是英文輸入法,則直接顯示出來,如果是中文輸入法,則根據輸入的英文字元來匹配字型檔中的欄位,然後顯示出來

3 點選軟鍵盤返回按鍵,則傳送訊號,將字串(英文或中文)傳送給主視窗的輸入元件並顯示。

如果感覺有幫助到,麻煩點個贊!!!

原始碼地址下載:http://pan.baidu.com/s/1nvcrBfj

執行效果圖片:

中文輸入


英文輸入


以上是我的QT軟鍵盤思路,雖然介面做得不好看,但是功能已經出來了,而且介面也可以自己美化,高手求指教!!!