《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 基于QT的跨平臺虛擬鍵盤設計與實現
基于QT的跨平臺虛擬鍵盤設計與實現
2015年微型機與應用第17期
杜曉東,舒明蕾,孟利民,華驚宇
(浙江工業大學 省通信網技術應用研究重點實驗室,浙江 杭州 310023)
摘要: 針對QT在Windows、Linux、以及嵌入式Linux-arm等不同平臺下沒有開源、高效的虛擬鍵盤(包含中文輸入法),以及QT版本升級造成代碼不兼容等問題,設計并實現了一個跨平臺的虛擬鍵盤。該方法首先創建英文虛擬鍵盤和SQLite3的中文字庫,然后在此基礎上根據QT底層信號與槽以及事件過濾機制設計實現了中文拼音輸入法接口,并結合SQLite3數據庫查詢實現了中文拼音到漢字的查詢、匹配、選詞以及顯示等功能,最終實現中英文輸入功能。最后,在不同平臺下對所設計虛擬鍵盤進行了測試,結果表明效果良好。
Abstract:
Key words :

  摘  要: 針對QT在Windows、Linux、以及嵌入式Linux-arm等不同平臺下沒有開源、高效的虛擬鍵盤(包含中文輸入法),以及QT版本升級造成代碼不兼容等問題,設計并實現了一個跨平臺的虛擬鍵盤。該方法首先創建英文虛擬鍵盤和SQLite3的中文字庫,然后在此基礎上根據QT底層信號與槽以及事件過濾機制設計實現了中文拼音輸入法接口,并結合SQLite3數據庫查詢實現了中文拼音到漢字的查詢、匹配、選詞以及顯示等功能,最終實現中英文輸入功能。最后,在不同平臺下對所設計虛擬鍵盤進行了測試,結果表明效果良好。

  關鍵詞: 虛擬鍵盤;跨平臺;SQLite3;嵌入式系統

0 引言

  QT是原Trolltech公司開發的跨平臺C++GUI應用框架,它提供了豐富的部件集合,并具有面向對象、組件編程等優勢,近年來QT由Digia公司運作,發展迅猛,其在嵌入式平臺以及桌面平臺中有著不可替代的地位[1]。

  QT目前支持幾乎所有的桌面操作系統和嵌入式操作系統[2],但由于各個版本(尤其是QT4和QT5)之間兼容性較差,造成以前編寫的代碼難以在新版本下運行或者根本無法使用等問題。當前,在桌面系統下,基于QT4的開源虛擬鍵盤(包含中文輸入法)比較少,基于QT5的幾乎沒有;在嵌入式系統下,基于QT4的虛擬鍵盤幾乎都是繼承QT4內部輸入法類QInputContext或者QWSInputMethod,這樣設計簡單、快捷,但是只能在嵌入式系統中使用,而QT5也已經刪除了這兩個內部的輸入法類。因此,在QT環境下亟需重新設計一個新的虛擬鍵盤,以此來兼容QT的不同版本以及滿足不同桌面操作系統、嵌入式設備中的輸入需求[2]。

  本文設計一個在多平臺(Windows、Linux、嵌入式Linux-arm)下,跨越QT版本限制的虛擬鍵盤解決方案。該方案完全基于QT底層的信號與槽機制以及事件過濾機制,沒有使用特定系統下的接口,因此可以實現跨平臺、跨QT版本的目的,同時兼容嵌入式系統。鍵盤布局參考實體鍵盤,支持拖拽移動,并且聯合了數據庫技術,實現自由添加詞組,支持英文和中文拼音兩種輸入模式,并且支持鼠標單擊虛擬鍵盤與實體鍵盤同步輸入等功能,豐富了基于QT的虛擬鍵盤設計方案。

1 虛擬鍵盤的設計原理

  在GUI的編程中,經常需要在各個界面或者各個部件之間進行對象間通信。而信號與槽作為QT的核心機制[3],主要用來實現對象間通信,以此取代傳統的回調函數方式,這也是一種更加安全的機制。例如,在虛擬鍵盤上有部件狀態發生變化時,相應的部件就會發射(emit)一個信號,而與該信號進行關聯(connect)的槽函數則負責監視接收信號,一旦信號產生,則執行槽函數里面的相應操作。一個信號可以與一個或者多個槽進行關聯,多個信號也可以和一個槽進行關聯,甚至一個信號可以和另一個信號進行關聯,這樣就實現了信息的封裝,確保對象可以當做一個組件來編程。

  因此,基于QT的GUI編程簡單、靈活容易擴展,其核心也就是如何來設計槽函數[4]。信號與槽之間一般通過QObject::connect函數進行連接,信號與槽的簡單連接模型如圖1。

001.jpg

2 虛擬鍵盤的設計與實現

  2.1英文輸入法的設計與實現

  該虛擬鍵盤是在Linux(Ubuntu12.04)環境下使用QtCreator設計的鍵盤布局,在QWidget下面根據實體鍵盤拖入QToolButton,并對Button進行屬性綁定,以便后面可以根據屬性批量處理按鍵事件。傳統的虛擬鍵盤則通過單個click信號,連接到相應的槽,這樣設計思路簡單,容易理解,但代碼冗余較大[5]。改進的虛擬鍵盤則根據Button屬性來捆綁信號與槽,這樣就降低了代碼冗余度,具體步驟如下。

  (1)根據實體鍵盤設計布局,基本實現全鍵盤,根據實際項目需求并考慮兼容嵌入式液晶屏,故刪除了部分不常用的按鍵,具體鍵盤布局見圖2。

002.jpg

  (2)為使鍵盤支持拖拽操作,將QWidget隱藏了邊框和標題欄,然后重新實現了三個虛函數mouseMoveEvent(QMouseEvent*e)、mousePressEvent(QMouseEvent*e)、mouse ReleaseEvent(QMouseEvent*e),這樣虛擬鍵盤就可以在有鼠標的情況下以及支持觸摸的液晶顯示器上,通過長按空白處拖拽虛擬鍵盤。

  (3)設置QToolButton的objectName并且將所有的字母鍵、數字鍵以及特殊符號鍵依次綁定屬性為btn_alphabet、btn_number、btn_special。如按鍵“a”的objectName為btna,屬性設置為btn_letter,即btna->setProperty(”btn_alphabet”,true),其他按鍵依次設置。

  (4)創建QToolButton為QList類型鏈表,獲取虛擬鍵盤中所有的QToolButton類型的孩子項,然后遍歷所有按鍵,依次關聯槽函數,代碼如下:

  QList<QToolButton*>keyValue=this->findChildren

  <QToolButton*>();

  foreach(QToolButton*B,keyValue){

  connect(B,SIGNAL(clicked()),this,

  SLOT(on_keyValue_clicked()));}

  (5)在槽函數on_keyValue_clicked()中首先通過sender()函數獲取激活的Button,然后根據之前劃分的屬性,批量地處理不同類型的按鍵,再根據objectName實現特殊鍵的功能,例如Backspace、切換中英文等。

  最后將虛擬鍵盤輸入的字母、數字以及特殊符號發送到QLineEdit中,通過信號focusChanged(QWidget*,QWidget*)實現新舊焦點的切換。

  至此實現了所有虛擬鍵盤的輸入以及焦點切換等功能,然后在此基礎上聯合使用了SQLite實現中文拼音輸入法。

  2.2 中文拼音輸入法的設計與改進

  在基于QT的傳統中文輸入法中,尤其是嵌入式系統中使用的中文輸入法,如果是基于QT4,基本都是繼承自QInputContext或者QWSInputMethod,它依賴于QT/E的C/S架構,將輸入法安裝在服務器端,負責監聽來自鍵盤、鼠標的事件,然后再由服務端的輸入法進行事件處理、分發,這樣設計簡單,但是自由度低、局限性大,而且使用了進程間通信的原理[6],只能在嵌入式QT/E中使用,無法移植到其他桌面系統,QT5也刪除了這兩個基本的內部輸入法類,因此基于此設計的虛擬鍵盤根本無法在QT5中運行。

  本文改進的中文輸入法則摒棄了這兩個內部輸入法類,完全基于QT底層的信號與槽機制以及事件過濾機制,因此可以突破QT版本升級帶來的不兼容問題,也沒有使用各個操作系統的系統函數,因此只需要在虛擬鍵盤的代碼中預定義幾個簡單的跨平臺的宏定義即可實現跨平臺(Window、Linux、嵌入式Linux-arm)。

  在前面實現的虛擬鍵盤基礎上,本節使用SQLite3設計制作了中文漢字字庫,設計了中文輸入法類(Inputdemo)的基本接口,同時完成了事件過濾器對鍵盤以及鼠標事件的分發調度。

  2.2.1 中文輸入法字庫結構

  SQLite3是一款開源免費的高性能數據庫系統,具有占用資源低、效率高、體積小、使用可靠等優點,同時支持Window、Linux以及嵌入式Linux等主流操作系統,近幾年其在嵌入式領域得到了長足的發展。該中文輸入法使用SQLite3主要考慮了QT本身對SQLite3提供了很好的驅動支持,同時考慮了虛擬鍵盤兼容嵌入式Linux-arm以及在嵌入式中使用效率、查詢速度等因素[7]。輸入法字庫字段設計如下:

  (1)pinyin:漢字以及詞組對應的拼音;

  (2)hanzi:漢字以及詞語,詞組之間用空格區分,并一一對應拼音。

  (3)frequency:漢字詞頻。

  2.2.2 中文拼音輸入法設計以及實現

  QT主要有四種處理事件的方式:重新實現特定的事件處理器、重寫Object:event事件、在對象中注冊事件過濾器以及繼承QApplication重寫notify()函數。本文采用在對象中注冊事件過濾器以及重寫event事件的方式[8],來完成對鍵盤、鼠標事件的過濾、分發、調度工作。設置事件過濾器主要通過兩個步驟:

  (1)安裝事件過濾器,通過對目標對象調用installEventFilter()注冊事件過濾器來注冊監視對象,安裝事件過濾器代碼類似于:Object.installEventFilter(this)。

  (2)重新實現事件過濾器,即在監視對象的eventFilter()中處理監視的事件,這樣鍵盤或者鼠標事件(嵌入式中是觸摸事件)產生時,首先將事件發送到過濾器,然后再交付給程序。事件濾波器原型如下:eventFilter(QObject*obj,QEvent*event)。

  鍵盤以及鼠標事件的處理流程如圖3所示。

003.jpg

  中文拼音輸入的實現過程就是將輸入的拼音字符串轉換成相應漢字。本輸入法對漢字的匹配建立在SQL查詢的基礎上,查詢簡單、代碼冗余低,比較容易實現一些高級功能,其實現步驟如下。

  (1)實現輸入拼音以及顯示漢字功能首先自定義繼承QLabel類的MyLabel類,重載了mouseReleaseEvent(QMouseEvent*)函數,使其可以像Button一樣支持點擊,然后重載void enterEvent(QEvent*)、void leaveEvent(QEvent*),使其可以在選中漢字時出現顏色變化,最后通過部件提升的方法將MyLabel添加到QtCreator設計器中,這樣添加的MyLabel就可以支持鼠標點擊(嵌入式中是觸摸操作)選中并且發送漢字,然后在ui文件添加一個QLabel來顯示輸入的拼音。

  (2)實現索引功能,根據之前設計的字庫表,通過SQL語句查詢匹配漢字以及詞組,然后將通過SQL查詢到的漢字依次添加到漢字鏈表中,并統計查詢的漢字或者詞組的個數以及使用的頻率,同時設計了接口display_chinese()、choice_chinese(int num)、remove_chinese(),分別用來顯示漢字或詞組、根據索引選中漢字或詞組,以及清空漢字或者詞組。最后將查詢到的漢字顯示到前面建立的MyLabel上,并通過前翻頁、后翻頁查找所需漢字或者詞組。SQL核心代碼如下:

  QSqlQuery query;

  QString sql="SELECT hanzi FROM pinyin WHERE

  pinyin=′"+present_pinyin+"′";

  query.exec(sql);

  (3)實現鼠標點擊虛擬鍵盤與實體鍵盤同步輸入功能,即在中文模式下,首先獲取虛擬鍵盤的所有QToolButton的孩子項,然后將實體鍵盤的鍵值依次映射到虛擬鍵盤的QToolButton上面,實現數字鍵選中漢字和鼠標點擊選中漢字功能,同樣做了類似的映射。核心代碼如下:

  QList<QToolButton*>keyValue=this->findChildren

  <QToolButton*>();

  QString key=keyEvent->text();

  foreach(QToolButton*Btn,keyValue){

  if(Btn->text()==key){

  Btn->click();}

  (4)用戶將選中的漢字或者詞組發送到QLineEdit中,至此中文輸入法完成。

3 測試

  桌面系統環境為Linux(Ubuntu12.04),編譯器g++4.6.4,分別使用QT4.7.2和QT5.3.2進行編譯運行,編譯順利通過,界面一致;然后在嵌入式QT/Embedded下,使用qvfb進行編譯運行,可以實現中英文輸入,運行結果如圖4所示。

004.jpg

4 結束語

  本文完全基于QT的信號與槽以及事件過濾機制,結合SQLite3數據庫查詢技術,設計實現了虛擬鍵盤,可以支持中、英文輸入。同時本文的設計方案完全兼容各個桌面操作系統以及嵌入式Linux-arm操作系統,并且不受QT版本升級的限制,具有廣泛的應用價值。

  參考文獻

  [1] 屈克文,石奮蘇.基于QT/E和SQLite3的嵌入式中文輸入法的設計[J].計算機應用,2011,31(1):149-151.

  [2] BLANCHETTE J, SUMMERFIELD M. C++ GUI Qt4編程(第二版)[M].北京:電子工業出版社,2008.

  [3] 唐新華.QT的信號與槽機制介紹[EB/OL].(2005-9-20)[2015-05-15].http://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/index.html.

  [4] 謝芬,潘麗,劉守印.基于QT/E的嵌入式Linux系統的軟鍵盤實現[J].電子設計工程,2012,20(5):177-179.

  [5] 韋東山.嵌入式Linux應用完全開發手冊[M].北京:人民郵電出版社,2008.

  [6] 章堅武,吳寒君.基于嵌入式Linux和Qt4的中文輸入法的實現與改進[J].電子器件,2010,33(3):395-398.

  [7] SQLite參考手冊[EB/OL].(2014-06-04)[2015-05-15].http://www.sqlite.org/lang.html.

  [8] QT參考文檔[EB/OL]. (2014-05-06)[2015-05-15].http://doc.qt.io/qt-4.8/qt-embedded-architecture.html.


此內容為AET網站原創,未經授權禁止轉載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
久久久久国产精品午夜一区| 国产精品不卡在线| 亚洲一区二区三区四区中文| 欧美影院成年免费版| 亚洲一区二区三区四区视频| 亚洲精品乱码久久久久久日本蜜臀 | 中国av一区| 日韩午夜三级在线| 亚洲精品一区二区三区樱花| 亚洲大片一区二区三区| 欧美一区二区三区四区高清| 午夜精品一区二区三区电影天堂| 亚洲性色视频| 亚洲自拍16p| 亚洲伊人网站| 午夜欧美精品| 欧美一区二区在线免费观看| 欧美在线免费观看视频| 欧美在线免费视屏| 久久国产欧美日韩精品| 亚洲电影激情视频网站| 最新国产乱人伦偷精品免费网站| 亚洲国产精品久久| 亚洲人成毛片在线播放| 日韩午夜黄色| 亚洲午夜在线观看| 亚洲永久免费精品| 欧美亚洲免费高清在线观看| 欧美一级电影久久| 久久久国产精彩视频美女艺术照福利| 久久久久九九视频| 免费成人高清视频| 欧美激情一区二区三级高清视频 | 在线成人欧美| 亚洲激情av| 一区二区三区www| 亚洲性av在线| 久久成人综合视频| 亚洲国产精品一区二区久| 日韩视频欧美视频| 在线亚洲欧美视频| 欧美在线三级| 欧美成人免费全部| 欧美三级在线| 国产欧美一区二区三区在线老狼| 好吊成人免视频| 亚洲日本免费电影| 亚洲免费视频成人| 亚洲福利视频专区| 一区二区三区鲁丝不卡| 欧美一区二区三区四区在线 | 欧美午夜精品久久久久免费视| 国产噜噜噜噜噜久久久久久久久 | 麻豆精品一区二区av白丝在线| 欧美另类综合| 国产精品自在线| 亚洲国产91色在线| 亚洲一区影音先锋| 91久久国产综合久久91精品网站| 亚洲天堂成人在线观看| 久久久久久午夜| 欧美日韩国产123区| 国产乱码精品一区二区三区忘忧草 | 在线视频中文亚洲| 亚洲福利国产| 亚洲一区成人| 久久夜精品va视频免费观看| 欧美日韩国产一区二区| 国产亚洲视频在线| 99精品99久久久久久宅男| 香蕉成人啪国产精品视频综合网| 亚洲欧洲精品天堂一级 | 欧美一区视频| 欧美日韩伦理在线免费| 黑人巨大精品欧美一区二区| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美一区二区精品久久911| 99re6热只有精品免费观看| 欧美一区二区三区视频免费播放| 欧美粗暴jizz性欧美20| 国产日韩欧美一区二区三区四区| 亚洲免费福利视频| 最近看过的日韩成人| 欧美在线视频免费观看| 欧美日韩精品三区| 在线观看国产日韩| 亚洲欧美在线播放| 亚洲视频你懂的| 欧美a级片网站| 国语精品中文字幕| 亚洲欧美成aⅴ人在线观看| 99国产精品| 欧美大尺度在线| 一区视频在线播放| 欧美怡红院视频| 欧美一级欧美一级在线播放| 欧美日韩一区二区在线视频| 在线播放豆国产99亚洲| 亚洲欧美日韩在线高清直播| 中文网丁香综合网| 欧美久久久久久久| 在线欧美小视频| 久久国产精品久久国产精品| 欧美一区免费视频| 国产精品一卡| 亚洲天堂av高清| 中国女人久久久| 欧美精品一区二| 亚洲激情一区二区| 亚洲精品乱码久久久久久日本蜜臀| 久久米奇亚洲| 国产一区在线免费观看| 午夜精品影院| 久久激情综合| 国产日韩欧美精品一区| 亚洲一区免费网站| 亚洲欧美日韩一区在线| 国产精品激情| 欧美亚洲一区| 久久精品99无色码中文字幕| 亚久久调教视频| 国产麻豆成人精品| 亚洲在线不卡| 欧美一级理论片| 国产午夜精品视频| 性欧美超级视频| 欧美自拍偷拍午夜视频| 国产目拍亚洲精品99久久精品 | 一区二区高清在线| 欧美日韩亚洲高清一区二区| 亚洲免费av片| 亚洲午夜免费福利视频| 欧美日韩一区二区在线视频| 99精品视频免费在线观看| 亚洲视频第一页| 国产精品久久久对白| 亚洲一区二区欧美| 欧美一区午夜视频在线观看| 国产精品综合色区在线观看| 午夜国产精品影院在线观看| 午夜精品久久久久久久久久久| 国产欧美日韩精品在线| 午夜精品视频| 裸体一区二区三区| 亚洲国产日韩美| 亚洲午夜性刺激影院| 国产精品一区二区欧美| 欧美亚洲色图校园春色| 久久在线免费观看| 亚洲激情影视| 亚洲男女自偷自拍| 国产欧美日韩综合一区在线播放| 欧美一区二区免费| 欧美国产精品一区| 一区二区三区免费看| 欧美一区二区女人| 狠狠色丁香婷婷综合影院| 亚洲精品日本| 国产精品av久久久久久麻豆网| 欧美一进一出视频| 欧美第一黄网免费网站| 亚洲免费黄色| 欧美在线观看你懂的| 在线播放国产一区中文字幕剧情欧美 | 欧美一区二区日韩| 欧美精品www在线观看| 亚洲综合成人婷婷小说| 老司机aⅴ在线精品导航| 亚洲三级性片| 欧美在线免费播放| 亚洲激情综合| 欧美一区二区三区视频在线| 伊人蜜桃色噜噜激情综合| 宅男噜噜噜66一区二区| 国产日韩欧美中文在线播放| 亚洲精品美女91| 国产欧美 在线欧美| 亚洲日本欧美| 国产精品麻豆va在线播放| 亚洲高清免费| 国产精品久久福利| 亚洲国产一区二区在线| 欧美午夜精品久久久久久孕妇| 亚洲高清电影| 国产精品一区视频网站| 日韩视频中文| 国内精品视频在线播放| 在线亚洲国产精品网站| 国语精品一区| 午夜精品久久一牛影视| 91久久视频| 久久久久欧美精品| 亚洲一级黄色av| 欧美激情亚洲一区| 久久国产主播| 国产精品久久亚洲7777| 亚洲乱亚洲高清| 精东粉嫩av免费一区二区三区| 亚洲综合日本| 91久久国产综合久久蜜月精品 |