呂 澤
(山西大眾電子信息產(chǎn)業(yè)集團(tuán)有限公司,山西 太原 030024)
隨著交互技術(shù)的發(fā)展,觸摸交互方式已取代傳統(tǒng)的鍵盤、鼠標(biāo)等輸入方式。虛擬鍵盤作為觸摸屏上的重要信息輸入工具,代替了傳統(tǒng)的機(jī)械鍵盤,通過點(diǎn)擊觸摸屏上的按鍵完成數(shù)字、符號等內(nèi)容的輸入。
Qt是跨平臺(tái)C++圖形用戶界面應(yīng)用程序開發(fā)框架,它既可以開發(fā)GUI程序,也可用于開發(fā)非GUI程序,比如控制臺(tái)工具和服務(wù)器。Qt是面向?qū)ο蟮目蚣?,使用特殊的代碼生成擴(kuò)展以及一些宏,并且允許真正地組件編程。Qt支持桌面操作系統(tǒng)和嵌入式操作系統(tǒng)[1]。本文介紹了基于Qt設(shè)計(jì)和實(shí)現(xiàn)的虛擬鍵盤,以及設(shè)計(jì)流程,該虛擬鍵盤具有操作方便的特點(diǎn),可以實(shí)現(xiàn)字母、數(shù)字、刪除等多種輸入方式,并且能夠應(yīng)用于基于Linux操作系統(tǒng)的觸摸屏設(shè)備。
事件是對各種應(yīng)用程序需要知道的由應(yīng)用程序內(nèi)部或者外部產(chǎn)生的事情或者動(dòng)作的總稱,一個(gè)事件可以是單獨(dú)的事件類型,也可以包含多個(gè)事件類型。在Qt中事件有定時(shí)器事件QTimerEvent、鍵盤事件QKeyEvent、上下文菜單事件QContextMenuEvent、關(guān)閉事件QCloseEvent等。
QMouseEvent是Qt中的鼠標(biāo)事件,例如,在窗口中,當(dāng)按下鼠標(biāo)左右鍵或移動(dòng)鼠標(biāo)都會(huì)產(chǎn)生QMouseEvent。通過該事件可以得到當(dāng)前鼠標(biāo)左右鍵按下狀態(tài)、鼠標(biāo)移動(dòng)位置等信息。對于處理鼠標(biāo)事件的函數(shù)來說,通常進(jìn)行重定義部件以完成自定義的操作。鼠標(biāo)的滾輪事件用QWheelEvent表示,該事件能得到鼠標(biāo)滾輪移動(dòng)的距離、方向。除QMouseEvent事件外,還有描述鍵盤的QKeyEvent事件,當(dāng)鍵盤上的某個(gè)按鍵被按下或釋放時(shí),將會(huì)發(fā)送鍵盤事件給調(diào)用鍵盤輸入焦點(diǎn)的部件[2]。
虛擬鍵盤對象之間通信采用Qt的通信機(jī)制,Qt的通信機(jī)制是信號-槽,信號-槽是一種高級接口,主要用來實(shí)現(xiàn)對象間通信,這種通信機(jī)制取代了傳統(tǒng)的回調(diào)函數(shù)方式,實(shí)現(xiàn)了對象間靈活的傳遞消息,具有更高的安全性。在該通信機(jī)制中,當(dāng)某個(gè)控件狀態(tài)發(fā)生變化時(shí),相應(yīng)的控件就會(huì)發(fā)射(emit)一個(gè)信號(signal),而與該信號進(jìn)行連接(connect)的信號槽(slot)負(fù)責(zé)監(jiān)視接收信號,因此,當(dāng)一個(gè)信號被發(fā)射時(shí),與其相連接的信號槽將被調(diào)用,執(zhí)行信號槽里面的相應(yīng)操作[3]。而信號與槽的關(guān)系不只是簡單的一對一模式,還存在一對多、多對一、多對多、信號觸發(fā)信號的情況,如果存在一個(gè)信號與多個(gè)信號槽之間進(jìn)行連接,則會(huì)使相關(guān)的信號槽都會(huì)被觸發(fā),并且執(zhí)行的順序是隨機(jī)的。信號-槽具體關(guān)系模型如圖1所示。
圖1 Qt關(guān)系模型
雖然,信號-槽具有很好的執(zhí)行效率,但是,與回調(diào)函數(shù)相比,還是存在一定的缺點(diǎn),所以應(yīng)注意信號-槽的使用。在自定義信號槽時(shí),要避免間接地形成死循環(huán)。
本文的虛擬鍵盤是在Linux操作環(huán)境下使用Qt設(shè)計(jì)的鍵盤,根據(jù)實(shí)際項(xiàng)目需求,確定鍵盤大小、按鍵個(gè)數(shù)、按鍵大小、按鍵位置等屬性,并且點(diǎn)擊主界面的LineEdit彈出虛擬鍵盤,能夠進(jìn)行信息輸入,將所輸入信息更新至主界面的LineEdit。虛擬鍵盤的按鍵包含功能鍵和輸入鍵,其中,功能鍵包括Backspace(刪除)、Clr(清除)、Enter(確定)、Esc(退出),輸入鍵包括數(shù)字、字母、小數(shù)點(diǎn)。鍵盤布局圖如圖2所示。
圖2 鍵盤布局圖
本文設(shè)計(jì)的虛擬鍵盤主要采用Qt的QApplication、QPushButton、QWidget、QpushButtonGroup、QLineEdit及自定義類實(shí)現(xiàn),通過QGridLayout設(shè)計(jì)虛擬鍵盤界面,調(diào)用setLayout()、addWidget()、setText()、setFixedsize()等函數(shù)實(shí)現(xiàn)按鍵整體布局。
基于Qt的虛擬鍵盤設(shè)計(jì)如下:
1) 在工程自定義編輯框源文件中,從QLineEdit派生一個(gè)InputLineEdit類,重寫鼠標(biāo)點(diǎn)擊事件,并且點(diǎn)擊輸入框發(fā)送LineEdit_Show(QString str)信號,用來顯示虛擬鍵盤,自定義編輯框設(shè)計(jì)流程如圖3所示。
圖3 自定義編輯框設(shè)計(jì)流程圖
2) 在工程虛擬鍵盤源文件中分別創(chuàng)建QWidget對象KeyboardWidget、QPushButton對象KeyButton、InputLineEdit對象KeyLineEdit、QLayout對象KeyboardLayout。根據(jù)項(xiàng)目界面需求,對虛擬鍵盤的界面進(jìn)行設(shè)計(jì),同時(shí)將KeyboardWidget的邊框和標(biāo)題欄進(jìn)行隱藏,達(dá)到虛擬鍵盤能夠進(jìn)行拖拽操作。點(diǎn)擊虛擬鍵盤的Enter按鍵發(fā)送SendMessage(QString data)信號,此信號用來將鍵盤上輸入結(jié)果送至主界面輸入框。虛擬鍵盤設(shè)計(jì)流程如圖4所示。
圖4 虛擬鍵盤設(shè)計(jì)流程圖
由于傳統(tǒng)的虛擬鍵盤是對每個(gè)QPushButton添加click信號,并且在各自對應(yīng)的信號槽中實(shí)現(xiàn)按鍵功能,此方法設(shè)計(jì)的代碼雖然可實(shí)現(xiàn)功能,但會(huì)造成代碼數(shù)量大,執(zhí)行效率慢。為了減少代碼冗余,利用Button的屬性和按鍵數(shù)組對信號和信號槽進(jìn)行關(guān)聯(lián)。
3) 在工程主界面源文件中創(chuàng)建InputLineEdit對象KeyLineEdit,設(shè)置KeyLineEdit的大小、樣式等屬性,對KeyLineEdit添加sender()命令,用于判斷虛擬鍵盤的調(diào)用者。在該源文件中添加LineEdit_Show信號對應(yīng)的槽,用于將調(diào)用者與虛擬鍵盤顯示界面進(jìn)行關(guān)聯(lián),同時(shí),添加SendMessage信號對應(yīng)的信號槽,將虛擬鍵盤的輸入信息更新到主界面的編輯框中,完成虛擬鍵盤的輸入功能。編輯框調(diào)用鍵盤設(shè)計(jì)流程如圖5所示。
圖5 編輯框調(diào)用鍵盤設(shè)計(jì)流程圖
本文通過基于Qt設(shè)計(jì)的虛擬鍵盤,運(yùn)行環(huán)境為Linux操作系統(tǒng),可以在核心板imx6上進(jìn)行移植,以及在觸摸屏設(shè)備上測試成功,能夠有效地、簡單地替代機(jī)械鍵盤,為具有嵌入式系統(tǒng)的設(shè)備提供更經(jīng)濟(jì)、更合適的服務(wù)。