国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于QT的跨平臺虛擬鍵盤設(shè)計(jì)與實(shí)現(xiàn)

2015-09-21 01:30:02杜曉東舒明蕾孟利民華驚宇
關(guān)鍵詞:輸入法詞組鼠標(biāo)

杜曉東,舒明蕾,孟利民,華驚宇

(浙江工業(yè)大學(xué) 省通信網(wǎng)技術(shù)應(yīng)用研究重點(diǎn)實(shí)驗(yàn)室,浙江 杭州 310023)

0 引言

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

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

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

1 虛擬鍵盤的設(shè)計(jì)原理

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

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

圖1 信號與槽連接的簡單模型

2 虛擬鍵盤的設(shè)計(jì)與實(shí)現(xiàn)

2.1 英文輸入法的設(shè)計(jì)與實(shí)現(xiàn)

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

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

圖2 鍵盤布局

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

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

(4)創(chuàng)建 QToolButton為 QList類型鏈表,獲取虛擬鍵盤中所有的QToolButton類型的孩子項(xiàng),然后遍歷所有按鍵,依次關(guān)聯(lián)槽函數(shù),代碼如下:

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

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

至此實(shí)現(xiàn)了所有虛擬鍵盤的輸入以及焦點(diǎn)切換等功能,然后在此基礎(chǔ)上聯(lián)合使用了SQLite實(shí)現(xiàn)中文拼音輸入法。

2.2 中文拼音輸入法的設(shè)計(jì)與改進(jìn)

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

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

在前面實(shí)現(xiàn)的虛擬鍵盤基礎(chǔ)上,本節(jié)使用SQLite3設(shè)計(jì)制作了中文漢字字庫,設(shè)計(jì)了中文輸入法類(Input-demo)的基本接口,同時完成了事件過濾器對鍵盤以及鼠標(biāo)事件的分發(fā)調(diào)度。

2.2.1 中文輸入法字庫結(jié)構(gòu)

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

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

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

(3)frequency:漢字詞頻。

2.2.2 中文拼音輸入法設(shè)計(jì)以及實(shí)現(xiàn)

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

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

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

鍵盤以及鼠標(biāo)事件的處理流程如圖3所示。

圖3 鍵盤、鼠標(biāo)事件過濾器處理流程

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

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

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

QSqlQuery query;

QString sql="SELECT hanzi FROM pinyin WHERE

pinyin=′"+present_pinyin+"′";

query.exec(sql);

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

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

3 測試

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

圖4 輸入法運(yùn)行效果

4 結(jié)束語

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

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

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

[3]唐新華.QT的信號與槽機(jī)制介紹[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系統(tǒng)的軟鍵盤實(shí)現(xiàn)[J].電子設(shè)計(jì)工程,2012,20(5):177-179.

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

[6]章堅(jiān)武,吳寒君.基于嵌入式Linux和Qt4的中文輸入法的實(shí)現(xiàn)與改進(jìn)[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.

猜你喜歡
輸入法詞組鼠標(biāo)
要命的輸入法
Progress in Neural NLP: Modeling, Learning, and Reasoning
Engineering(2020年3期)2020-09-14 03:42:00
百度被訴侵犯商標(biāo)權(quán)和不正當(dāng)競爭
副詞和副詞詞組
iOS中為什么找不到安裝的第三方輸入法
電腦迷(2012年22期)2012-04-29 23:34:02
我們需要怎樣的輸入法?
45歲的鼠標(biāo)
超能力鼠標(biāo)
IM家庭電子(2008年11期)2008-12-05 09:49:20
鼠標(biāo)也可以是這樣的
金秀| 资中县| 阳城县| 临桂县| 彭山县| 昌宁县| 榆树市| 若尔盖县| 浮梁县| 定西市| 屏山县| 奈曼旗| 天台县| 博罗县| 景泰县| 中西区| 天峻县| 汉阴县| 肃南| 讷河市| 泗洪县| 平陆县| 广宗县| 旺苍县| 泰宁县| 大兴区| 宁乡县| 长兴县| 探索| 广宁县| 黑山县| 揭东县| 扎赉特旗| 波密县| 鸡东县| 巫山县| 安新县| 上虞市| 开鲁县| 镇雄县| 达孜县|