1. 程式人生 > >基於Linux和QT/E的軟鍵盤設計

基於Linux和QT/E的軟鍵盤設計

  隨著對嵌入式系統體積小型化和操作人性化的要求,以及大尺寸觸控式顯示屏的廣泛應用,在嵌入式系統中採用軟鍵盤實現字元的輸入,已經成為目前的發展主流。QT是一個跨平臺的C++圖形介面庫,是由挪威TrollTech公司推出的產品。它採用的是面向物件的程式設計思想,因此,具有良好的可擴充套件性和可移植性,同時支援多個GUI平臺的互動開發。QT採用了良好的封裝機制,使得它的模組化程度非常高,可重用性好,開發方便。憑藉其良好的效能,QT已成為目前GUI開發中使用最為廣泛的圖形介面庫之一。QT/E(QT/Embedded)是用於嵌入式系統的QT版本。QT/E去掉了對XLib的依賴而直接工作於Frame Buffer上,因而效率更高,文中主要使用QT4.5.3版本,在嵌入式Linux環境下實現軟鍵盤設計。

1 QT/E體系結構

QT/E是2001年Trolltech公司開發的一款面向嵌入式系統的QT版本。它採用輕量級視窗系統,完全摒棄了底層的XLib,以Framebuffer作為底層圖形介面,極大地減少了對記憶體的消耗。QT/E在上層仍然保持著原來的QT架構,因此,針對在Xwindow上設計的QT程式仍然具有很好的移植性。QT/E的基本體系結構如圖1所示。

1)QT/E體系結構中的圖形引擎是通過相關的圖形演算法和Framebuffer操作底層的硬體裝置來實現的;事件驅動則是通過底層的輸入輸出裝置驅動來實現對外界事件的響應。

2)如圖1所示,由圖形引擎層實現對圖形介面的繪圖操作,然後由QT基本類提供對外界的操作介面。其中,圖形類提供圖形操作介面,比如:畫線、畫矩形等;控制元件類通過繼承公共抽象類QWidget來實現基本的控制元件,為外界提供介面。

2 QT/E通訊機制



在圖形介面程式設計時,我們經常要實現介面之間的相互切換或者相互通知,更具體的來說就是需要實現類與類之間的相互通訊。比如,在軟鍵盤的設計中,當一個事件產生時,系統就會發出一個訊號。訊號和槽(Signal&slot)機制是QT的核心特徵,在QT庫中有很多已經設定好的訊號,比如:clicked()、triggered()等,開發人員也可以根據需要來自定義某些訊號。事件的響應對應著QT窗口裡的槽函式,和訊號類似,系統有很多預定義的槽,比如exit()、quit()等,使用者也可以根據需要來新增自己的槽函式。

當物件改變其狀態時,訊號就由該物件發射(emit)出去,這就是物件所要做的全部事情,它不知道另一端是誰在接收這個訊號。這就是真正的資訊封裝,它確保物件被當作一個真正的軟體元件來使用。槽用於接收訊號,但它們是普通的物件成員函式。一個槽並不知道是否有任何訊號與自己相連線。而且,物件並不瞭解具體的通訊機制。可以將很多訊號與單個槽進行連線,也可以將單個訊號與很多槽進行連線,甚至於將一個訊號與另外一個訊號相連線也是可能的。

因此,整個QT視窗的設計簡單、靈活且擴充套件性好。訊號與槽之間的連結一般用connect()函式來實現,具體關聯方式和實現函式如圖2所示:


3 基於QT/E軟鍵盤的實現

文中主要根據專案的實際需要,在軟鍵盤上制定了數字鍵、字母鍵、退出鍵和確定鍵。具體分兩步實現,第一步:在基於linux環境的PC機上制定軟鍵盤,並編寫程式碼實現其按鍵功能;第二步:生成能夠在ARM板上執行的程式碼,並移植到ARM板上。

3.1 PC機x11環境下制定軟鍵盤的模型

根據專案的實際需求,在PC機x11/QT環境下設計了軟鍵盤介面,該軟鍵盤具有數字鍵、字母鍵、退出鍵和確定鍵,總共42個按鍵,如圖3所示。在linux環境的QT designer下,建立新的widget,然後根據專案中所需要的按鍵個數來確定軟鍵盤的大小,在此,選擇軟鍵盤的外框大小為:540x160。軟鍵盤外框搭建完成之後,需要在軟鍵盤區域內加入實際所需要的按鍵。將Widget Box下Buttons選項中的PushButton按鍵拖入到軟鍵盤區域內,在PushButton按鍵屬性的文字編輯中填入按鍵值,比如“1”。在PushButton按鍵屬性的名字編輯中填入按鍵名,比如“n1”。

同理,在軟鍵盤區域內拖入實際所需要按鍵個數的按鍵,根據所需要的鍵值修改每個按鍵上面的文字屬性和名字屬性。按照一般鍵盤的佈局對它們進行排列

3.2 軟鍵盤實現

如圖3所示,首先建立了足專案要求的軟鍵盤的基本模型,接下來要實現的就是當按鍵響應時能夠讀出鍵盤值並將其傳送出去,具體實現的流程如圖4所示。

圖4中,初始化按鍵時,可以使用QSignalMapper類來捆綁不同按鍵所傳送的一系列無引數訊號,並將其轉發為有引數的訊號:
QSignalMapper*mapper=new QSignalMapper(this);
QSignalMapper的主要應用為可以實現一個函式響應不同按鈕的功能,下面舉例來說明圖4的具體實現過程:

首先設定軟鍵盤介面名稱為ui,然後以數字鍵“1”為例:將在圖3中數字鍵1對應的按鍵名稱設為:n1,在圖4中的第(1)步中,建立鍵值“1”所對應的對映,程式碼如下:

mapper->setMapping(ui.n1,“1”);

接著,在圖4中的第(2)步,需要建立鍵值clicked對應的訊號與槽之間的關係程式碼如下:

connect(ui.n1,SIGNAL(clicked()),mapper,SLOT(map()));

最後,將所需要用到的字母或者數字通過上述方式連線到槽函式中。如圖4中的(3),將這些所要求得到的字母或者數字傳送給焦點控制元件,程式碼如下:

connect(mapper,signal(mapped(const QString&)),im,slot(sendcontent(const QStling&)))

上面語句中sendcontent()函式為發射子函式,具體程式碼如下:
sendCommitString(content); (1)
content.clear(); (2)
語句(1)將焦點控制元件內的字母和數字傳送出去,語句(2)清除傳送框中的字母和數字,供下一次使用。

可以採用同樣的方式,對軟鍵盤中其它的按鍵進行對映函式和連線函式的編寫,然後在arm-linux-gcc環境下編譯,生成可以在arm板上執行的二進位制檔案。

3.3 下載到目標板上執行

本文的設計思路是:先將程式程式碼在PC機上除錯通過,然後將除錯通過的程式程式碼在RAM-linux-gcc環境下進行編譯,生成可以在RAM板上執行的二進位制檔案,最後將此二進位制檔案下載到目標板中。本文的前提是QT4.5.3環境已經移植到開發板上,具體移植步驟在這裡不作介紹。在終端上面,執行啟動軟鍵盤指令,命令列後面加上“-qws”指令,執行結果如圖5所示。

圖5是在實際專案中需要的預設手機號碼的介面,在系統執行前要先設定手機號碼,以便系統故障時能夠自動的給對應的手機使用者傳送預警資訊,使使用者能夠實時的瞭解自己系統的執行狀態。在該介面中,準備預設手機號碼時,直接選擇開啟軟鍵盤按鈕,圖3所示的預製的軟鍵盤會彈出介面,選擇要求預設的手機號碼值,完成之後選擇exit按鍵,軟鍵盤關閉。在此就可以用圖5所示的軟鍵盤完成手機號碼的預設。

4 結束語

隨著Linux作業系統的廣泛應用以及人們對GUI人機互動介面的更多需求,本文在linux作業系統的QT開發套件下,分析了軟鍵盤實現的原理,並完成了軟鍵盤的設計。此軟體盤可以根據使用者的要求來新增按鍵,與外部接入實體鍵盤相比,不僅便利,還節約成本。通過實踐證明此軟鍵盤具有較強的實時性和可靠性,可以廣泛的應用於各種QT介面中。