<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于Qt/E的嵌入式GUI的研究及其移植

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

          作者: 時(shí)間:2012-03-21 來(lái)源:網(wǎng)絡(luò) 收藏

          服務(wù)器:服務(wù)器維護(hù)著一組區(qū)域,當(dāng)窗口被創(chuàng)建、移動(dòng)、改變大小和破壞時(shí),通過(guò)這組區(qū)域來(lái)改變每個(gè)客戶的申請(qǐng)。該區(qū)域存放在共享內(nèi)存中,在執(zhí)行繪圖操作時(shí),客戶可以從中讀取信息;客戶:嵌入式Qt為客戶提供的API與標(biāo)準(zhǔn)的Qt API是一致的。當(dāng)Qt/E客戶使用Qt API畫線時(shí),Qt/E庫(kù)直接訪問(wèn)顯存,完成畫線工作。嵌入式Qt客戶庫(kù)還負(fù)責(zé)處理所有的繪畫操作,另外,他還處理那些定制的窗口裝飾(如標(biāo)題條等)。

          3.1.3 Qt/E圖形引擎的實(shí)現(xiàn)

          Qt/E的底層圖形引擎基于幀緩沖(frame buffer)。幀緩沖是標(biāo)準(zhǔn)顯示設(shè)備驅(qū)動(dòng)接口,使用MMAP系統(tǒng)將幀緩存映射到應(yīng)用程序虛擬內(nèi)存空間,這樣應(yīng)用程序可以訪問(wèn)它。

          幀緩沖驅(qū)動(dòng)程序的實(shí)現(xiàn)分為兩個(gè)方面,一方面是LCD等相關(guān)硬件及緩存的初始化,包括圖形在緩沖區(qū)的創(chuàng)建和設(shè)置DMA通道;另外一方面是對(duì)畫面緩沖區(qū)的讀寫,read、write及l(fā)seek等系統(tǒng)調(diào)用接口可以調(diào)用驅(qū)動(dòng)程序的讀寫函數(shù)。至于將畫面緩沖區(qū)的內(nèi)容輸出到LCD顯示屏上,則由硬件自動(dòng)完成。當(dāng)設(shè)置DMA通道和畫面緩沖區(qū)后,DMA開(kāi)始正常工作并將緩沖區(qū)中的內(nèi)容不斷發(fā)送到LCD上,這個(gè)過(guò)程基于DMA對(duì)于LCD的不斷刷新。幀緩沖驅(qū)動(dòng)程序則將數(shù)據(jù)寫入幀緩存中,這通過(guò)映射MMAP來(lái)實(shí)現(xiàn)[2]。

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

          3.2 Qt系統(tǒng)的信號(hào)與槽(Signal and Slot)機(jī)制

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

          Qt中使用信號(hào)/槽機(jī)制替代原始回調(diào)和消息映射機(jī)制。當(dāng)一個(gè)特定事件發(fā)生的時(shí)候,一個(gè)信號(hào)被發(fā)射。Qt的窗口部件有很多預(yù)定義的信號(hào),但是程序員總是可以通過(guò)繼承來(lái)加入自定義的信號(hào)。槽就是一個(gè)可以被調(diào)用處理特定信號(hào)的函數(shù)。Qt的窗口部件有很多預(yù)定義的槽,但是通常的習(xí)慣是加入程序員自己的槽,這樣就可以處理自己所感興趣的信號(hào)。

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

          多個(gè)信號(hào)可以連接一個(gè)槽,一個(gè)信號(hào)也可以連接多個(gè)槽,甚至一個(gè)信號(hào)與另外一個(gè)信號(hào)相連接也是可能的,這時(shí)無(wú)論第一個(gè)信號(hào)什么時(shí)候發(fā)射系統(tǒng)都將立刻發(fā)射第二個(gè)信號(hào),如圖3所示[5]??傊?,信號(hào)與槽構(gòu)造了一個(gè)強(qiáng)大的部件編程機(jī)制。

          圖3 信號(hào)與槽的連接

          4 Qt/E的

          在PC上基于Qt/X11和qvfb的應(yīng)用程序調(diào)試通過(guò)以后就可以將應(yīng)用程序軟件到目標(biāo)平臺(tái)上,但前提是要保證frame buffer、觸摸屏等驅(qū)動(dòng)程序的正常運(yùn)行[6]。Qt/E過(guò)程如下:

          1) 交叉工具鏈的安裝。

          本文選用的交叉工具鏈?zhǔn)莂rm-linux-gcc系列。安裝包為:cross-2.95.3.tar.bz2將其拷貝到某個(gè)目錄下,依次執(zhí)行如下命令:

          tar -jxvf cross-2.95.3.tar.bz2

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



          關(guān)鍵詞: Embedded 嵌入式GUI 移植

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();