新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于Qt/E的嵌入式GUI的研究及其移植

        基于Qt/E的嵌入式GUI的研究及其移植

        作者: 時間:2012-03-21 來源:網絡 收藏

        服務器:服務器維護著一組區域,當窗口被創建、移動、改變大小和破壞時,通過這組區域來改變每個客戶的申請。該區域存放在共享內存中,在執行繪圖操作時,客戶可以從中讀取信息;客戶:嵌入式Qt為客戶提供的API與標準的Qt API是一致的。當Qt/E客戶使用Qt API畫線時,Qt/E庫直接訪問顯存,完成畫線工作。嵌入式Qt客戶庫還負責處理所有的繪畫操作,另外,他還處理那些定制的窗口裝飾(如標題條等)。

        3.1.3 Qt/E圖形引擎的實現

        Qt/E的底層圖形引擎基于幀緩沖(frame buffer)。幀緩沖是標準顯示設備驅動接口,使用MMAP系統將幀緩存映射到應用程序虛擬內存空間,這樣應用程序可以訪問它。

        幀緩沖驅動程序的實現分為兩個方面,一方面是LCD等相關硬件及緩存的初始化,包括圖形在緩沖區的創建和設置DMA通道;另外一方面是對畫面緩沖區的讀寫,read、write及lseek等系統調用接口可以調用驅動程序的讀寫函數。至于將畫面緩沖區的內容輸出到LCD顯示屏上,則由硬件自動完成。當設置DMA通道和畫面緩沖區后,DMA開始正常工作并將緩沖區中的內容不斷發送到LCD上,這個過程基于DMA對于LCD的不斷刷新。幀緩沖驅動程序則將數據寫入幀緩存中,這通過映射MMAP來實現[2]。

        在Qt/E中,QScreen類為抽象出的底層顯示設備基類,其中聲明了對于顯示設備的基本描述和操作方式,如打開、關閉、獲得顯示能力、創建 GFX操作對象等。另外一個重要的基類是QGFX類。該類抽象出對于顯示設備的具體操作接口(圖形設備環境),如選擇畫刷、畫線、畫矩形、alpha操作等。以上兩個基類是Qt/E圖形引擎的底層抽象,其中許多函數是虛函數。當具體的顯示設備(如具體的幀緩沖設備和虛擬幀緩沖設備)從其派生類時,這些派生類會繼承并重載基類中的虛函數來實現[3]。

        3.2 Qt系統的信號與槽(Signal and Slot)機制

        信號/槽是一種高級接口,應用于對象之間的通信,是Qt的核心特性,也是Qt區別于其他工具包的重要地方。信號/槽是Qt自行定義的一種通信機制,獨立與標準的C/C++語言,因此要正確的處理信號和槽,必須借助于一個稱為MOC(Meta Object Compiler)的Qt工具,該工具是一個C++預處理程序,它為高層次的事件處理自動生成所需要的附加代碼。

        Qt中使用信號/槽機制替代原始回調和消息映射機制。當一個特定事件發生的時候,一個信號被發射。Qt的窗口部件有很多預定義的信號,但是程序員總是可以通過繼承來加入自定義的信號。槽就是一個可以被調用處理特定信號的函數。Qt的窗口部件有很多預定義的槽,但是通常的習慣是加入程序員自己的槽,這樣就可以處理自己所感興趣的信號。

        所有從QObject或其子類派生的類都能夠包含信號和槽。當對象改變其狀態時,信號就由該對象發射出去,這就是對象所要做的全部事情。它不知道另一端是誰在接收這個信號,這就是真正的信息封裝,它確保對象被當作一個真正的軟件組件來使用。槽用于接收信號,但它們是普通的對象成員函數。一個槽并不知道是否有任何信號與自己相連接。而且,對象并不了解具體的通信機制,這樣就可以相對容易地開發出代碼可高重用的類[4]。

        多個信號可以連接一個槽,一個信號也可以連接多個槽,甚至一個信號與另外一個信號相連接也是可能的,這時無論第一個信號什么時候發射系統都將立刻發射第二個信號,如圖3所示[5]。總之,信號與槽構造了一個強大的部件編程機制。

        圖3 信號與槽的連接

        4 Qt/E的

        在PC上基于Qt/X11和qvfb的應用程序調試通過以后就可以將應用程序軟件到目標平臺上,但前提是要保證frame buffer、觸摸屏等驅動程序的正常運行[6]。Qt/E過程如下:

        1) 交叉工具鏈的安裝。

        本文選用的交叉工具鏈是arm-linux-gcc系列。安裝包為:cross-2.95.3.tar.bz2將其拷貝到某個目錄下,依次執行如下命令:

        tar -jxvf cross-2.95.3.tar.bz2

        這個工具鏈應該安裝的路徑是:/usr/local/arm/2.95.3(或者可以通過查看GCC版本號,可以得到一些信息,從版本信息中可以看到“-prefix=……”,這就是GCC安裝的路徑,它是在GCC編譯前通過prefix選項配置的)。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 大同县| 尚义县| 聂拉木县| 三都| 天长市| 长葛市| 桂林市| 新化县| 阳信县| 双辽市| 湾仔区| 富宁县| 井研县| 临清市| 青浦区| 尖扎县| 永顺县| 土默特右旗| 门头沟区| 蒲江县| 三江| 湖口县| 江孜县| 石景山区| 正阳县| 祥云县| 乌拉特前旗| 新宁县| 锦屏县| 搜索| 包头市| 东乌珠穆沁旗| 会泽县| 陕西省| 喀喇| 班戈县| 宜川县| 长垣县| 偃师市| 高阳县| 米泉市|