天天看點

基于Qt/Embedded和Qtopia的GUI設計(轉)

1 引言 木铎校園 BBS 社群:H9B#t#H1Rz 木铎校園 BBS 社群6w8f%C^ Zn}(j*S

   随着目前各種手持裝置、無線裝置及資訊家電等嵌入式産品的迅猛發展,相應的嵌入式軟硬體設計技術也在發生深刻的變化。如今,越來越多的嵌入式終端需要一 個圖形化的人機接口界面(GUI),良好的人機接口界面是嵌入式系統設計的一個關鍵技術,能夠極大地提高人機互動的效率。本文詳細闡述了在自行開發的嵌入 式主機闆上實作某平台的圖形顯示終端過程。木铎校園 BBS 社群+L7Y?r~�p4D

木铎校園 BBS 社群6hCF5Rx

  2 系統平台介紹木铎校園 BBS 社群rQG,m)K#I

Ir,K fTeN.C'l0  根據系統設計需求,本文目的是實作一個具有圖形接口界面的嵌入式顯示終端,該系統使用嵌入式系統設計技術。硬體上,使用自行開發的基于Samsung S3C2440A CPU的目标闆,該CPU使用arm920T核心,其主頻可達400Mhz;在軟體上,選擇嵌入式linux為作業系統,因為它源碼開放,而且穩定性與安全性較高。

}#f D`([email protected] 木铎校園 BBS 社群3GC2s5RM

  整個系統軟體由引導裝載程式(uboot)、 裝置驅動(包括幀緩存fb)、嵌入式Linux核心、檔案系統(yaffs)、基于QT/Embedded和Qtopia的使用者圖形界面以及應用程式組成,系統平台結構如圖(1)所示。

Y_v6S:/+r'b|kLd0

基于Qt/Embedded和Qtopia的GUI設計(轉)

$N/nD!Z3ytU0

圖(1) 系統平台軟體結構圖

"g%G'i0ClYZ�]W0 木铎校園 BBS 社群3b-w'O(]1^

  3 Qt/Embedded和Qtopia 介紹及其開發環境的建立

/I2M[3vGT)p0 木铎校園 BBS 社群 Qq4k,VoWJj1f&P%R

   目前嵌入式Linux的主流GUI系統主要有MiniGUI、Microwindows、OpenGUI、Qt/Embedded,這些GUI在接口定義、體系結構、功能特性存在很大差别,采取的技術路線也有所不同。MiniGUI是建立在比較成熟的圖形引擎之上,開發的重點在于視窗系統,其小巧 精緻并且盡量與Win32相容。MicroWindows目前開發的重點在底層的圖形引擎,視窗系統和圖形接口方面功能比較欠缺,與Win32和X Windows視窗系統保持相容,提供了相對完善的圖形功能。OpenGUI基于一個用彙編實作的x86圖形核心,提供了一個高層的C/C++圖形/視窗接口,它的資源消耗小,可移植性差,不支援多程序。

&/p"B�[RLBBq0 木铎校園 BBS 社群b'y ^*d8|iO'j

   Qt/Embedded是一個多平台的C++圖形使用者界面應用程式架構,其對象容易擴充,可移植性好,支援多個GUI平台的互動開發[2,3]。現 在,Qt/Embedded被廣泛地應用于各種嵌入式産品和裝置中,從消費電器(如智能手機、機頂盒)到工業控制裝置(如醫學成像裝置、移動資訊系統等)。是以本文選擇Qt/Embedded為本系統的GUI。木铎校園 BBS 社群&v3/&gB+[

[email protected]  (1) Qt/Embedded和Qtopia體系結構

"gVs*X,U R T6p5kpb-hs0

b'[email protected]  Qt/Embedded是Trolltech公司開發的面向嵌入式系統的Qt版本,與X11版本的Qt在最大程度上接口相容,采用幀緩存(framebuffer)作為底層圖形接口。Qt/Embedded類庫完全采用C++封裝,并且有着豐富的控件資源以及較好的可移植性,大範圍的Qt/Embedded API可用于多種開發項目。Qt/Embedded的實作結構如圖(2)所示:木铎校園 BBS 社群&v EOI-s}2m

基于Qt/Embedded和Qtopia的GUI設計(轉)

#[3kT N{HA/X/FQ)M0

圖(2) Qt/Embedded實作結構木铎校園 BBS 社群 a!t%glFi

木铎校園 BBS 社群4{-hd pW6EKe

  Qt/Embedded的底層圖形引擎基于framebuffer。 framebuffer是一種驅動程式接口,它将顯示裝置抽象為幀緩沖區[4]。該驅動程式的裝置檔案一般是/dev/fb0、/dev/fb1等。對使用者而言,它和/dev下的其他設 備沒有什麼差別,使用者可以把framebuffer看成一塊記憶體,既可以從這塊記憶體中讀取資料,也可以向其中寫入資料,而寫操作立即反應在螢幕上。為運作 Qt/Embedded,嵌入式Linux核心要支援framebuffer。  

    Qt/Embedded是Qt的面向嵌入式應用的簡化版本,它包括一組完備的GUI類、作業系統封裝、資料結構類、功能類群組合類。大部分Qt的應用程式可以經過簡單的編譯與重設視窗大小移植到Qt/Embedded。木铎校園 BBS 社群'`3`}Z /q p_

木铎校園 BBS 社群/KX3UX6h"cd6c]}

   Qtopia是基于QT/Embedded開發的一個嵌入式的視窗系統和應用程式集,如位址本、圖像浏覽、Media播放器等,還包括娛樂和配置工具, 廣泛用于PDA等掌上裝置。Qtopia平台由Qtopia 庫(Qt/E,libqpe,libqtopia1,qtopiapim)和Qtopia server/laucher組成。Qtopia server/laucher是控制視窗系統、程序間通信、發起所有應用和其他核心任務的主要服務程式。

A K;] [email protected] 木铎校園 BBS 社群4k$`7b0?[7W4ZJN'G|

  (2) Qt/Embedded和Qtopia的交叉編譯與運作

_!yU {;T`'d/-A0 木铎校園 BBS 社群#X/R L"i^

  整個GUI系統的建構需要對Qt/Embedded、Qtopia依次分别編鍊,然後有機地整合在一起。Qt/Embedded為Qtopia提供了底層支援,GUI系統的圖形庫視窗組建都由Qt/Embedded實作。

N _'Y[S:`NZ b0

y)U9Fb([email protected] N{E0  在建構GUI時用于Qt開發的典型工具如下:木铎校園 BBS 社群�Z"|7kJY�w k"?8|

  • tmake:跨平台的Makefile生成器。
  • moc:用于Qt C++擴充的metra-object編譯器。
  • uic:從XML檔案生成代碼的使用者界面編譯器。
  • designer:用于設計視窗組建的應用程式。

木铎校園 BBS 社群t$r IV"SA

  Qtopia的開發工具包SDK(Software Development Kit)是Qtopia開發環境的核心部分,編譯後得到建立應用程式所需的軟體包如下:

KF y"FH"x0

  • qvfb(virtual frame buffer):X視窗用來運作和測試Qtopia應用程式的系統程式。
  • qpe(Qtopia executable):用來處理所有的使用者程式界面[2,5]。

木铎校園 BBS 社群~ @eYwj

  由于我們使用的是ARM CPU,是以需要對Qt/Embedded和Qtopia開發工具包進行交叉編譯。本文使用arm-linux-gcc-3.3.2來建立交叉編譯環境。為了對Qt/Embedded和Qtopia進行交叉編譯,需要使用如下的源碼樹:木铎校園 BBS 社群2z[cpw?(x/W

  • tmake-1.13.tar.gz:用來得到tmake工具。
  • qt-embedded-2.3.7.tar.gz:Qt的嵌入式版本。
  • qt-x11-2.3.2.tar.gz:Qt的X11版本。
  • qtopia-free-1.7.0.tar.gz:官方網站提供的Qtopia免費版。
  • e2fsprogs-1.38.tar.gz:為了得到qtopia所需的uuid.h和libuuid.so。

;i:n�b4P uj0  假設将上述源碼樹放在同一目錄下,例如:/root/qtopia,并依次解壓,然後進行編譯,步驟如下:

    ①設定tmake的環境變量如下:木铎校園 BBS 社群0?z[|)L(l:d9J.B}'[email protected]`

export TMAKEPATH=/root/qtopia/tmake-1.13/lib/qws/linux-arm-g++

tr:RPg9V0  此處指定了tmake在生成Makefile時使用arm交叉編譯。木铎校園 BBS 社群0|2nF5T]

木铎校園 BBS 社群*PQ5zl+]

  ②編譯qt-x11,其目的是生成moc、uic、qvfb、designer,并将它們放在qt-embedded/bin目錄下。木铎校園 BBS 社群bBVX5eK*ev_0z

木铎校園 BBS 社群SD o%^QQ

  ③配置qt-embedded編譯選項,指令為:

rpry&@1{0

./configure -platform linux-arm-g++  -qconfig qpe -qvfb -depths 4,8,16,32.

木铎校園 BBS 社群"Rvh'g~(EY

  此處-platform linux-arm-g++表示在arm平台上進行交叉編譯;-qconfig local表示使用src/tools/qconfig-local.h;-depths 4,8,16,32表示需要qt支援的顯示顔色深度。木铎校園 BBS 社群U^/@K8q&u b2s

木铎校園 BBS 社群ej-r/r G:T

  ④使用make指令編譯qt-embedded,用來生成Qt庫(libqte.so)。

:Ya4]+Ki8?0

0{U%SSh"C MJ0  ⑤配置并交叉編譯Qtopia,生成應用程式以及桌面環境。木铎校園 BBS 社群U%pY+Fm T

木铎校園 BBS 社群�fmKrG

  假設編譯完成後将qt和qtopia相關的庫及所需檔案分别存放于目标闆檔案系統的/opt/qt和/opt/qtopia下,運作Qtopia的方法是:

$jNc1z5tR0 木铎校園 BBS 社群 V1/v`!m||

  ①設定QTDIR、QPEDIR和鍵盤滑鼠等環境變量

V#dn(U7_X5f0

export QTDIR=/opt/qt

|^g+jg8l�Y0export QPEDIR=/opt/qtopia 木铎校園 BBS 社群{6IgP*XQ!t

export QWS_KEYBOARD=USB:/dev/input/event1 木铎校園 BBS 社群3/QAt/H*nx0d

export QWS_MOUSE_PROTO=USB:/dev/input/mouse0

N`m `^FXO x5`Bq0  ②開啟qpe,也就是在Linux圖形模式下執行/opt/qtopia/bin/qpe &木铎校園 BBS 社群v#x/+? t"t

木铎校園 BBS 社群"D2fC??db `

  這樣就可以在顯示終端上看到qtopia桌面環境了。

,N0J6/q)LE#E.H-r0 木铎校園 BBS 社群QT?_ _1DZe8pN:v

  

    4 Qt/Embedded和Qtopia下應用程式的實作

W$kI/.G0

(dw%a"~2Tkpt0  (1) Qt/Embedded應用程式的實作

!M!Gxiq+?G0

c.z ~:m/lg0   Qt是一個建立GUI程式的C++類庫,編寫Qt應用程式的主要工作是基于已有的Qt類編寫使用者類。Qt應用程式的設計使用基于工程的方法,并通 過.pro檔案進行工程管理。實作應用程式的第一步是編寫.pro檔案,然後使用tmake根據該檔案生成Makefile,最後進行源代碼的編寫。 tmake的文法如下:木铎校園 BBS 社群T {8h3j7_

tmake *.pro –o Makefile

C(}(K"M5G-d*L%L8X$T0  .pro的具體内容可以參考/qt/examples/下其他應用程式的.pro檔案。木铎校園 BBS 社群%gGk9dlE&z#o#~

[email protected]  在本項目的研究中,需要涉及基本的視窗建構、應用程式的調用、圖像背景的顯示以及中文顯示,下面對此進行詳細闡述。

    建構主視窗 -k xysH;G2PDeC0 木铎校園 BBS 社群YUVKua}

  Qt擁有衆多的視窗部件,如按鈕、菜單、滾動條和應用程式視窗等,它們組合起來可以建立各種使用者界面。QWidget 是所有使用者界面對象的基類,視窗部件是QWidget或其子類的執行個體。木铎校園 BBS 社群k7J)t5P C9x4S�r/

木铎校園 BBS 社群*/.` o.XS }

   建立主視窗先要在main.cpp函數中建立QApplication類型的對象。QApplication類管理圖形使用者界面應用程式的控制流和主要 設定,它包含主事件循環,在其中來自視窗系統和其它資源的所有事件被處理和排程,它也處理應用程式的初始化和結束,并提供對話管理。對于任何一個使用Qt 圖形使用者界面應用程式,都正好存在一個QApplication對象。然後定義主視窗變量,并通過QApplication類型的函數調用主視窗變量來啟 動主視窗。

H0x0ca$p9p;?4U0

{TRa#YD!F(Y0   建立主視窗部件最常用的方法是基于QWidget或QDialog類建立一個使用者類。QDialog類是對話框視窗的基類,主要用于短期任務以及和使用者 進行簡要通訊的頂級視窗。在本程式中使用QWidget類建立使用者類,并使使用者類通過公有繼承派生于Qwidget類。

*`NH�U7ao,[email protected]/P0

%hi {-F{Y0   在建構視窗時需要注意使用者界面的風格和布局。Qt提供了Windows、WindowsXP、Motif、MotifPlus、CDE、 Platinum、SGI和Mac的内置風格。自定義風格可以通過繼承QStyle、QCommonStyle或其他QCommenStyle類來完成。 應用程式的風格可以如下設定:木铎校園 BBS 社群 G0C'p'bb U~

QApplication::setStyle(new MyCustomStyle)

木铎校園 BBS 社群A}^tB2|

   在布局上Qt提供了布局管理器來組織父部件區域中的子部件,Qt内建的布局管理器有QHBoxLayout,QVBoxLayout和 QGridLayout,而且布局也可以嵌套在任意層。例如使用QHBoxLayout(按行放置部件)的部件管理器為例在視窗水準放置兩個按鈕B1和 B2的代碼如下:木铎校園 BBS 社群'n^|8b7T

QHBoxLayout *hbox = new QHBoxLayout(this); 木铎校園 BBS 社群 O.QM&gZvO|

Hbox->addWidget(B1); 木铎校園 BBS 社群'D mp$T|]k

Hbox->addWidget(B2);

#E4Q9w2f|V%K;nO6m8nm0   建立按鈕實作對應用程式的調用

[email protected])|[email protected]

C6v6Tu$x8W0   Qt部件與使用者的互動方式不同于其他的GUI工具包,其他的GUI工具包使用回調函數建立使用者互動,但是Qt提供了信号/槽(signal /slots)[5]通信機制描述對象間的無縫通訊。槽(slot)是标準的成員函數,它能夠連接配接到信号,每當槽所連接配接的信号被發射時,槽(函數)就被執 行。信号(signal)是一種特殊類型的函數,都是傳回void型,它們被定義為當某個事件發生時就被發射,之後執行所有被連接配接的槽。當定義信号時必須 使用QT的宏SIGNAL(),定義槽時必須使用宏SLOT()。木铎校園 BBS 社群BAg6m+A

木铎校園 BBS 社群l6UvE8v7_%l

  通過調用QObject對象的connect函數可以将某個對象的信号與另一個對象的槽相關聯,這樣當發射對象發射信号時,接收對象的槽将被調用。該函數定義如下:

'{/ko-QuK4L0?0

bool QObject::connect(const QObject *sender,const char *signal,const QObject *receiver, const char *member)

B vub7L:nQ0  與這個函數對應的disconnect函數,可以将信号和槽斷開連接配接。木铎校園 BBS 社群v /2S.S*b7S

木铎校園 BBS 社群&w"l"e*B}7r

  本文使用了QT庫提供的按鈕clicked()信号,自定義了槽函數run()來實作對應用程式的調用,并且定義了槽函數mycall()調用已經使用了特定參數的run()函數。木铎校園 BBS 社群#RS*|S8Mpm

木铎校園 BBS 社群(N8T0J0ub-e O

  例如當一個按鈕B1被點選時,它就發送“clicked”信号,通過connect()函數将信号與槽“mycall”連接配接起來,調用/opt/qt/examples/clock/下的應用程式“clock”的代碼如下:木铎校園 BBS 社群#E*Q R}y ~

void MyMainWindow::mycall()

     中文顯示

L.D$Xf#u ~2r#uI ^y0

木铎校園 BBS 社群T,GE_    Qt的中文顯示是Qt國際化的一部分,“國際化”簡稱為i18n,用來提供一個架構,讓同樣的代碼可以适用于各種語種習慣和編碼系統,程式設計人員隻要利用這個架構的機制、準則編寫應用程式,就可以在不新編譯代碼的情況下,支援各種語言。

/[email protected]/w0

%[email protected]/L*da"t2x$d'R0  Qt支援Unicode—國際标準字元集,程式員可以在程式裡自由的混用英語、漢語和其他Unicode所支援的語言。為Qt增加一種編碼隻需要增加該編碼和Unicode的轉化編碼就可以了,Qt支援中文的GBK/Big5編碼。木铎校園 BBS 社群f KToE

/U%l#O^xM0   Qt支援的字型常用的是ttf和qpf。qpf是Qt/Embedded專用的一種适合嵌入式應用的字型,它屬于位圖字型,不可以縮放,而ttf字型可 以縮放。預設情況下Qt/Embedded在lib/fonts目錄下提供了一種可以顯示中文的字型庫UniFont,但是該字型庫中沒有ttf的字型。 為了使用ttf字型顯示中文,本文采取如下的方法:拷貝一種支援unicode編碼的ttf字型到lib/fonts目錄下,例如,windows系統下 的宋體simsun.ttf;同時還需要在此目錄的fontdir腳本中添加下面一行:

GAM ^W0

i{8{i3N#?,Eu q'Y-l0simsun simsun.ttf FT n 50 0 su木铎校園 BBS 社群9Qn&k#oy

 fontdir腳本用來向系統注冊所支援的字型,它的每一行定義了一種字型的設定,其格式如下:

:KnN4Y7i?1Ik$z6e0

<字型名稱><字型檔案名><字型渲染類型><是否斜體><尺寸><字型标志>[尺寸清單]

木铎校園 BBS 社群(zot[[!i#rNay5Y{

  在程式設計中,首先指定編碼方式以支援中文:木铎校園 BBS 社群jd5pe.n_ qi

QTextCodec *code=QTextCodec::codecForName("GBK")

木铎校園 BBS 社群 j$y {G~/ y$?g

  接着為部件(例如Mywidget)執行 Unicode的轉化編碼:

,YvNH)sY3|;M:`O'a0

QString uniStr=code -> toUnicode("要顯示的中文字元") 木铎校園 BBS 社群[email protected]

Mywidget-> setFont(QFont("simsun",20,QFont::Bold)) 木铎校園 BBS 社群7U_Go+}8KG1P

Mywidget-> setText(uniStr)

lHJJ3W/A0  (2) 向Qtopia移植應用程式

DoOyP0 木铎校園 BBS 社群/S/?&a&y iP8E*/_8N

   Qtopia是一個基于QT/Embedded開發的一個嵌入式的桌面環境和應用程式集,可以友善地在Qtopia桌面環境中添加使用者應用程式或者對桌 面進行配置。為了添加使用者應用程式,需要在Qtopia/apps/Application目錄下建立一個.desktop的桌面檔案,該檔案指明了桌面 檔案的圖示以及應用程式的入口點。應該注意的是為了讓新的應用程式在Qtopia桌面環境中運作,應用程式必須使用QT提供的圖形庫進行編譯。木铎校園 BBS 社群/d!wH&|6o�dw

0z/a+M"^j|G0l0  下面以移植嵌入式的web浏覽器konqueror為例,說明添加新的應用程式的過程。木铎校園 BBS 社群&cg7Z,P/5F5hO

木铎校園 BBS 社群W3u:N/vO

  (1)下載下傳konqueror源代碼,對其進行交叉編譯。為了支援中文顯示和flash,還需要進行必要的源代碼修改,并且加入相應的插件。木铎校園 BBS 社群 B*m5S-C$ZW;V1/z

JX$}%a u9/0  (2)将konqueror.png圖示檔案拷貝到在/opt/Qtopia/pic/下。

[email protected]}2^A0 木铎校園 BBS 社群GH/%ud;s~Q

   (3)将konqueror可執行檔案放于/opt/konqueror/下,然後在Qtopia/apps/Application目錄下建立 konqueror.desktop檔案,具體内容可參考qtopia自帶的.desktop檔案。需要注意的是konqueror.desktop的 Exec項應指明可執行檔案的具體位置。例如:Exec=/opt/konqueror/bin/konqueror木铎校園 BBS 社群5l1dg{NOH{Y

木铎校園 BBS 社群KY {PJ:^

  (4)導出konqueror的運作環境變量,就可以直接在桌面上點選其圖示浏覽網頁了。

)Em_f0`L6^0

[email protected]/kol/[%xB B0  

    5 結束語

0qB4b_"] p,[email protected]�T0 4k_%]4^r^V#u9In(Bh0  嵌入式産品的廣泛應用帶動了圖形使用者界面(GUI)的迅速發展,嵌入式系統需要一個高 性能、高可靠的GUI的支援。基于Qt/Embedded的Qtopia桌面系統為系統使用者提供了良好的使用和互動環境。本文系統介紹了基于Qt/Embedded開發應用程式的方法以及将現有的應用程式移植進Qtopia的具體過程,為類似的系統開發供了一個參考。

木铎校園 BBS 社群9eng2I&e

木铎校園 BBS 社群FbG0[|1g3DE*~

繼續閱讀