




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
10.1Linux圖形開發(fā)基礎(chǔ)10.2嵌入式Linux圖形用戶界面簡介10.3Qt/Embedded嵌入式圖形開發(fā)基礎(chǔ)練習(xí)題第10章嵌入式Linux圖形用戶界面編程
10.1Linux圖形開發(fā)基礎(chǔ)
本節(jié)簡單介紹圖形用戶界面GUI的一般架構(gòu),主要討論嵌入式Linux圖形開發(fā)的基礎(chǔ)知識,包括GUI的底層支持庫和高級函數(shù)庫,為后面的進(jìn)一步敘述奠定基礎(chǔ)。10.1.1GUI的一般架構(gòu)
GUI是GraphicalUserInterface的簡稱,即圖形用戶界面。圖形用戶界面(GUI)是計算機(jī)系統(tǒng)中最為成熟的人機(jī)交換技術(shù),是計算機(jī)與用戶之間的對話接口。它是一個圖形組成的用戶界面。比如,Windows界面、OS2界面等都是GUI。
GUI系統(tǒng)在邏輯上一般可分為以下幾層:
(1)最底層I/O設(shè)備驅(qū)動:直接與輸入硬件打交道,完成I/O設(shè)備的驅(qū)動,包括顯示設(shè)備驅(qū)動、鼠標(biāo)驅(qū)動、鍵盤驅(qū)動等,構(gòu)成了GUI的硬件基礎(chǔ)。
(2)中間層圖形引擎:直接和最底層I/O設(shè)備驅(qū)動打交道,主要完成一些圖形操作和圖形管理,如畫點、畫線、區(qū)域填充、畫窗口及按鈕等。
(3)最上層GUI應(yīng)用程序接口(API):是提供給程序員的編程接口,以快速開發(fā)GUI應(yīng)用程序。
GUI是嵌入式系統(tǒng)中的一個重要問題,越來越多的嵌入式系統(tǒng)要求提供全功能的Web瀏覽器,而這就要求有一個高性能、高可靠的GUI支持。由于嵌入式系統(tǒng)本身的特殊性,嵌入式GUI要求簡單、直觀、可靠、占用資源小且反應(yīng)快速,以適應(yīng)系統(tǒng)硬件資源有限的條件。另外,GUI還應(yīng)具備高度可移植性與可裁減性,以適應(yīng)不同的硬件條件和使用需求??傮w來講,嵌入式GUI應(yīng)具備以下特點:
(1)體積??;
(2)耗用系統(tǒng)資源??;
(3)上層接口與硬件無關(guān),高度可移植;
(4)高可靠性;
(5)在某些應(yīng)用場合應(yīng)具備實時性。10.1.2嵌入式GUI底層支持庫
一個能夠移植到多種硬件平臺上的嵌入式GUI系統(tǒng),應(yīng)至少抽象出兩類設(shè)備:
(1)圖形抽象層(GraphicAbstractLayer,GAL):基于圖形顯示設(shè)備,完成系統(tǒng)對具體顯示硬件設(shè)備的操作,為程序開發(fā)人員提供統(tǒng)一的圖形設(shè)備編程接口。
(2)輸入抽象層(InputAbstractLayer,IAL):基于輸入設(shè)備,實現(xiàn)對不同輸入設(shè)備的控制操作,提供統(tǒng)一的調(diào)用窗口。
嵌入式GUI底層實現(xiàn)基礎(chǔ)如圖10-1所示。
目前應(yīng)用于嵌入式Linux系統(tǒng)中比較成熟、功能比較強(qiáng)大的GUI系統(tǒng)底層支持庫有XWindow、FrameBuffer、SVGALib、LibGGI等。圖10-1嵌入式GUI底層實現(xiàn)基礎(chǔ)
1.?XWindow
XWindow是Unix的圖形界面標(biāo)準(zhǔn),它是以斯坦福的圖形化操作系統(tǒng)WWindowsSystem為基礎(chǔ)而發(fā)展起來的一套網(wǎng)絡(luò)透明窗口系統(tǒng)。XWindow系統(tǒng)是目前Linux系統(tǒng)中處于主導(dǎo)地位的桌面圖形系統(tǒng)。所有Linux版本的圖形界面標(biāo)準(zhǔn)均遵循XWindow,簡稱X。
XWindow采用標(biāo)準(zhǔn)的客戶端/服務(wù)器(Client/Server)模式,即參與運行的主體為客戶端(XClient)和服務(wù)端(XServer)。它由XServer、XClient、X協(xié)議、Xlib函數(shù)庫等組成。
(1)?XServer:主要是控制I/O設(shè)備的程序,對顯示器的輸出、鍵盤和鼠標(biāo)的輸入進(jìn)行管理,接收輸入設(shè)備的信息,并將其傳給XClient,而將XClient傳來的信息輸出到屏幕上,提供顯示功能。
(2)?XClient:也稱客戶程序,是應(yīng)用程序的核心部分,與硬件無關(guān)。它位于后端,提供處理功能。
(3)?X協(xié)議:是XWindow系統(tǒng)中各單元間通信的標(biāo)準(zhǔn),主要負(fù)責(zé)XClient與XServer間的通信。
(4)?Xlib函數(shù)庫:XWindow客戶程序的功能是通過調(diào)用Xlib中的函數(shù)實現(xiàn)的。
XWindow的這種工作方式為用戶提供了兩個重要的特性:一個是平臺無關(guān)性,即應(yīng)用程序可以在任何其他平臺的服務(wù)器上顯示其界面;另一個是網(wǎng)絡(luò)透明性,是指服務(wù)器和客戶端之間通信協(xié)議的運作對計算機(jī)網(wǎng)絡(luò)是透明的,客戶端和服務(wù)器可以在同一臺計算機(jī)上,也可以不是,一個應(yīng)用程序不管是在本地運行,還是在遠(yuǎn)程某臺機(jī)器上運行,都可以實現(xiàn)在本地顯示。
2.?FrameBuffer
FrameBuffer是一種獨立于硬件的抽象圖形設(shè)備,是Linux抽象出來的供用戶態(tài)進(jìn)程實現(xiàn)直接寫屏的設(shè)備。它模仿顯卡的功能,將顯卡硬件結(jié)構(gòu)抽象化。用戶可以將FrameBuffer看成是顯示內(nèi)存的一個映像,將其映射到進(jìn)程地址空間之后,就可以直接進(jìn)行讀/寫操作,而寫操作可以立即反映在屏幕上。
FrameBuffer設(shè)備提供了若干ioctl命令,通過這些命令,可以獲得顯示設(shè)備的一些固定信息(如顯存大小)、與顯示模式相關(guān)的可變信息(如分辨率、像素結(jié)構(gòu)等)以及偽彩色模式下的調(diào)色板信息等。此外,通過FrameBuffer設(shè)備還可以獲得當(dāng)前內(nèi)核所支持的加速顯示卡的類型,這種類型通常是和特定顯示芯片相關(guān)的。在獲得了加速芯片類型之后,應(yīng)用程序就可以將PCI設(shè)備的內(nèi)存I/O(memio)映射到進(jìn)程的地址空間。這些memio一般是用來控制顯示卡的寄存器的,通過對這些寄存器的操作,應(yīng)用程序就可以控制特定顯卡的加速功能。
FrameBuffer本身不具備運算數(shù)據(jù)的能力,它只暫存經(jīng)CPU運算后的數(shù)據(jù)結(jié)果,并將結(jié)果送到顯示器中,中間不對數(shù)據(jù)做任何處理。它只是一個(提供顯示內(nèi)存和顯示芯片寄存器從物理內(nèi)存映射到進(jìn)程地址空間的)設(shè)備。所以,對于應(yīng)用程序而言,如果希望在FrameBuffer之上進(jìn)行圖形編程,還需要自己動手完成其他許多工作。FrameBuffer就像一張畫布,使用什么樣的畫筆,如何畫畫,還需要自己動手完成。
FrameBuffer具有高度的可移植性、易使用性和穩(wěn)定性。使用Linux內(nèi)核的FrameBuffer驅(qū)動,可以輕松支持1024?×?768?×?32b/p以上的分辨率。目前,在可得到的絕大多數(shù)Linux版本所發(fā)行的內(nèi)核中,已經(jīng)預(yù)編譯了FrameBuffer支持。
3.?SVGALib
SVGALib(SuperVideoGraphicsArrayLib)是一個比較老的圖形支持庫,是Linux系統(tǒng)中最早出現(xiàn)的非X圖形支持庫。這個庫從最初對標(biāo)準(zhǔn)VGA(VideoGraphicsArray)兼容芯片的支持開始,一直發(fā)展到對老式SVGA芯片的支持以及對現(xiàn)今流行的高級視頻芯片的支持。它為用戶提供在控制臺上進(jìn)行圖形編程的接口,使用戶可以在PC兼容系統(tǒng)上方便地獲得圖形支持。但該系統(tǒng)存在以下不足:
(1)接口雜亂。SVGALib從最初的VGAlib發(fā)展而來,保留了老系統(tǒng)的許多接口,而這些接口卻不能良好地迎合新顯示芯片的圖形能力。
(2)未能較好地隱藏硬件細(xì)節(jié)。許多操作不能自動使用顯示芯片的加速能力支持。
(3)可移植性差。SVGALib目前只能運行在X86平臺上,除Alpha平臺之外,對其他平臺的支持能力較差。
(4)?SVGALib作為一個老的圖形支持庫,對高級圖形功能的支持(比如直線和曲線等)不能令人滿意,因此其應(yīng)用范圍越來越小,尤其在Linux內(nèi)核增加了FrameBuffer驅(qū)動支持之后,有逐漸被其他圖形庫替代的跡象。
盡管SVGALib有許多缺點,支持的顯卡種類也不多,但是有許多的游戲及程序還是用它來做開發(fā)的。此外,它是Linux
Console下的VGA驅(qū)動函數(shù)庫,如果用戶準(zhǔn)備在Console下撰寫圖形功能的程序,目前來說SVGALib是唯一的選擇。
4.?LibGGI
LibGGI(LibGraphicsInterface)是一個跨平臺的繪圖庫。它試圖建立一個一般性的圖形接口,而這個抽象接口連同相關(guān)的輸入抽象接口一起,可以方便地運行在XWindow、SVGALib、FrameBuffer等之上。建立在LibGGI之上的應(yīng)用程序,不需重新編譯,就可以在上述這些底層圖形接口上運行。
在Linux上,LibGGI是通過調(diào)用FrameBuffer或SVGALib來完成圖形操作的,可能速度比較慢。但在某些不支持FrameBuffer或是VGA的系統(tǒng)上使用LibGGI仍然是一種不錯的選擇。目前,LibGGI的發(fā)展緩慢。10.1.3嵌入式GUI高級函數(shù)庫
1.?Xlib及其他相關(guān)函數(shù)庫
Xlib即我們上面所提到的XWindow系統(tǒng)中實現(xiàn)客戶程序功能所需調(diào)用的函數(shù)庫。在XWindow系統(tǒng)中進(jìn)行圖形編程時,可以選擇直接使用Xlib。它實際上是對底層X協(xié)議的封裝,可通過該函數(shù)庫進(jìn)行一般的圖形輸出。如果用戶的XServer支持DGA(DirectGraphicsAccess,直接圖形訪問),則可以通過DGA擴(kuò)展直接訪問顯示設(shè)備,從而獲得加速支持。由于Xlib的接口原始而且復(fù)雜,使得應(yīng)用程序界面開發(fā)效率低,因此一般用戶選擇其他高級一些的圖形庫作為基礎(chǔ),比如GTK(TheGIMPToolkit)、QT等。但GTK、QT等函數(shù)庫也存在龐大、占用系統(tǒng)資源多的缺點,不太適合在嵌入式系統(tǒng)中使用。這時可選擇使用簡單而靈活的GUI工具箱—FLTK(FastLightToolkit),它是一個輕量級的圖形函數(shù)庫,特別適用占用資源少的環(huán)境。FLTK的主要功能集中在用戶界面上,提供了豐富的控件集。
2.?SDL
SDL(SimpleDirectMediaLayer)是一個跨平臺的多媒體游戲支持庫,它是專門為游戲和多媒體應(yīng)用而設(shè)計開發(fā)的。它可以運行在許多平臺上,包括XWindow、XWindowwithDGA、LinuxFrameBuffer控制臺、LinuxSVGALib以及WindowsDirectX等。
SDL提供了對圖形、聲音、游戲桿、線程等的支持,還提供了對高級圖形的支持,比如Alpha混合、透明處理、YUV覆蓋、Gamma校正等。
此外,在SDL環(huán)境中能夠非常方便地加載支持OpenGL
(OpenGraphicsLib)的Mesa庫,從而提供對二維和三維圖形的支持??梢哉f,SDL是編寫跨平臺游戲和多媒體應(yīng)用的最佳平臺,它得到了廣泛的應(yīng)用。
3.?Allegro
Allegro庫(Allegrolibrary)是一個自由的視頻游戲圖形庫,是專門為X86平臺設(shè)計的。
Allegro可運行在LinuxFrameBuffer控制臺、LinuxSVGALib、XWindow等系統(tǒng)上。它提供了一些豐富的圖形功能,包括矩形填充和樣條曲線生成等,而且具有較好的三維圖形顯示能力。由于Allegro的許多關(guān)鍵代碼是采用匯編語言編寫的,因此該函數(shù)庫具有運行速度快、資源占用少的優(yōu)點。但Allegro也存在如下缺點:
(1)對線程的支持較差。Allegro的許多函數(shù)是非線程安全的,不能同時在兩個以上的線程中使用。
(2)對硬件加速能力的支持不足,在設(shè)計上沒有為硬件加速提供接口。
4.?Mesa3D
Mesa3D是一個支持3D的圖形函數(shù)庫,它有API接口,非常像OpenGL(OpenGraphicsLib,即開放式圖形庫,是專業(yè)的3D程序接口,也是一個功能強(qiáng)大、調(diào)用方便的底層3D圖形庫)。Mesa3D是Linux下OpenGL的取代產(chǎn)品,提供和OpenGL幾乎完全一致的接口。
Mesa3D還是一個遵循GPL協(xié)議(部分遵循LGPL協(xié)議)的自由軟件。因此,Mesa3D是一個兼容OpenGL規(guī)范的開放源碼函數(shù)庫,是目前Linux上提供專業(yè)三維圖形支持的唯一選擇。
此外,Mesa3D是一個跨平臺的函數(shù)庫,能夠運行在XWindow、XWindowwithDGA、BeOS、LinuxSVGALib等多種平臺上。
5.?DirectFB
DirectFB是一個基于FrameBuffer的圖形庫,支持部分加速。DirectFB試圖建立一個兼容GTK(TheGIMPToolkit)的嵌入式GUI系統(tǒng)。它以可裝載函數(shù)庫的形勢提供對加速FrameBuffer驅(qū)動程序的支持。目前,該函數(shù)庫正在開發(fā)之中。
10.2嵌入式Linux圖形用戶界面簡介
目前,嵌入式Linux的主流GUI系統(tǒng)主要有Qt/Embedded、MicroWindows、MiniGUI和OpenGUI,這些GUI在接口定義、體系結(jié)構(gòu)、功能特性方面存在很大差別,采取的技術(shù)也有所不同。本節(jié)我們將分別介紹這幾種嵌入式GUI系統(tǒng)。10.2.1Qt/Embedded
Qt/Embedded是著名的Qt庫開發(fā)商TrollTech開發(fā)的,是專為嵌入式設(shè)備上的圖形用戶界面開發(fā)而訂做的C++工具包。它是面向嵌入式Linux系統(tǒng)的Qt版本,可以運行在多種不同處理器部署的嵌入式Linux操作系統(tǒng)上。
Qt/Embedded的主要特點是:界面美觀、色彩配比好;具有與Qt/Windows和QT/X11完全一致的API接口;具有豐富的控件資源;具有模塊化和可裁減性,用戶可根據(jù)實際需要對其進(jìn)行裁減,以適應(yīng)不同的應(yīng)用環(huán)境。此外,還有很重要的一點就是移植性好,開發(fā)者可以將許多基于Qt的XWindow程序非常方便地移植到嵌入式版本,只需重新編譯代碼(而不需對代碼進(jìn)行修改)即可使程序本地化。它還是面向?qū)ο缶幊痰睦硐氕h(huán)境?,F(xiàn)在,Qt/Embedded被廣泛地應(yīng)用于各種嵌入式產(chǎn)品和設(shè)備中,從消費電器(如智能手機(jī)、機(jī)頂盒)到工業(yè)控制設(shè)備(如醫(yī)學(xué)成像設(shè)備、移動信息系統(tǒng)等)。但Qt/Embedded對于系統(tǒng)資源的要求非常高,需要在較大的存儲空間和運行空間上才可以運行,資源消耗大。另外,Qt/Embedded不是開放源碼,若需修改Qt/Embedded并在商業(yè)產(chǎn)品中發(fā)布,則需要支付昂貴的授權(quán)費用。
本章后面將重點介紹Qt/Embedded及其編程方法(詳見10.3節(jié))。10.2.2MicroWindows
MicroWindows是由美國CenturySoftware公司開發(fā)的開放源碼的嵌入式GUI項目。
MicroWindows是一個基于典型客戶端/服務(wù)器體系結(jié)構(gòu)的GUI系統(tǒng),也是基于分層式設(shè)計的,它允許不同的層可以被重新設(shè)計以滿足系統(tǒng)實現(xiàn)的需要。它分為三層:最底層是屏幕、鼠標(biāo)或觸摸屏和鍵盤的驅(qū)動程序,直接與輸入硬件打交道;中間層是一個可移植的圖形引擎層,通過最底層提供的服務(wù)提供對畫線、填充、裁減區(qū)域、色彩等的支持;最上層是API,提供給圖形化應(yīng)用程序調(diào)用。
MicroWindows支持兩種API:類Win32/WinCEAPI和類XLIBAPI的Nano-XAPI。這些API與Win32和XWindow窗口系統(tǒng)兼容,使程序可以很容易地從其他系統(tǒng)上移植過來。其中比較完備的是Nano-XAPI。Nano-X是基于XWindow的一組Xlib風(fēng)格的API函數(shù)庫。它被設(shè)計成是一個客戶端/服務(wù)器的環(huán)境,在此模式下應(yīng)用程序與一個客戶端的庫相連,而這個庫則通過一個Unixsocket與Nano-X服務(wù)器相連。每個應(yīng)用程序都通過Unixsocket來傳遞各種參數(shù),并由服務(wù)端來完成客戶端的各種請求。為了提高運行速度,還可以通過共享的內(nèi)存空間來完成數(shù)據(jù)傳遞。該項目的主要特色在于提供了比較完善的圖形功能,包括一些高級的功能,比如Alpha混合、三維支持、TrueType字體支持等。它不需要其他圖形系統(tǒng)的支持,可以充分利用Linux提供的FrameBuffer機(jī)制來進(jìn)行圖形顯示。MicroWindows基本上是用C語言實現(xiàn)的,因此移植性很強(qiáng),目前已經(jīng)移植到包括ARM在內(nèi)的多種平臺上,但也同樣導(dǎo)致了系統(tǒng)的運行效率不高。
MicroWindows目前開發(fā)的重點是底層的圖形引擎,窗口系統(tǒng)和圖形接口方面功能比較欠缺,需進(jìn)一步完善,比如控件或構(gòu)件的實現(xiàn)還不完備,鍵盤和鼠標(biāo)等的驅(qū)動還不夠完善。同時,MicroWindows的圖形引擎還存在許多問題:圖形引擎中存在許多低效算法,未經(jīng)任何優(yōu)化;代碼質(zhì)量較差,參差不齊,影響整體系統(tǒng)的穩(wěn)定性,這也是MicroWindows的發(fā)展陷于停滯狀態(tài)的主要原因。10.2.3MiniGUI
MiniGUI是我國國內(nèi)自主開發(fā)的、比較成熟的一個圖形用戶界面系統(tǒng),它是由許多自由軟件開發(fā)人員支持的一個自由軟件項目,其目標(biāo)是為基于Linux的實時嵌入式系統(tǒng)提供一個輕量級的圖形用戶界面支持系統(tǒng)。
MiniGUI是建立在現(xiàn)有成熟的圖形引擎(SVGALib/
LinuxThread)上,支持IntelX86、ARM及PowerPC等硬件平臺,并且可在Linux、eCos與VxWorks等操作系統(tǒng)上運行。到目前為止,MiniGUI已經(jīng)發(fā)展成為一個非常成熟和穩(wěn)定的GUI系統(tǒng),可廣泛應(yīng)用于包括手持設(shè)備、機(jī)頂盒、游戲終端等在內(nèi)的各種高端或者低端的嵌入式系統(tǒng)當(dāng)中。從整體結(jié)構(gòu)看,MiniGUI是分層設(shè)計的:最底層,GAL和IAL提供底層圖形接口以及鼠標(biāo)和鍵盤驅(qū)動;中間層是MiniGUI的核心層,其中包括了窗口系統(tǒng)必不可少的各個模塊;最上層是API,即編程接口。
MiniGUI有三個版本:Mini-Threads、MiniGUI-Lite和MiniGUI-Standalone。
(1)?Mini-Threads:基于標(biāo)準(zhǔn)POSIX接口中的pthread庫,適用于功能較為單一的嵌入式系統(tǒng),存在系統(tǒng)健壯性不夠的缺點。
(2)?MiniGUI-Lite:采用多進(jìn)程運行方式設(shè)計的Server/Client架構(gòu),應(yīng)用于多進(jìn)程的應(yīng)用場合,為功能復(fù)雜的嵌入式系統(tǒng)提供了一個高效、穩(wěn)定的GUI系統(tǒng)。
(3)?MiniGUI-Standalone:以獨立的進(jìn)程方式運行,既不需要多線程,也不需要多進(jìn)程的支持,適應(yīng)范圍比較廣,和其他版本的區(qū)別主要在于編譯鏈接的時候代用靜態(tài)庫的方法。
MiniGUI的主要特性如下:
(1)具有完備的多窗口機(jī)制和消息傳遞機(jī)制。
(2)支持多字體和多字符集,支持各種光柵字體和矢量字體,可以實現(xiàn)在同一個窗口上同時顯示不同語種的文字。
(3)支持簡體中文輸入法,包括全拼、智能拼音、五筆輸入法等。
(4)有豐富的控件資源。
(5)小巧,包括全部功能的庫文件大小為300KB左右。
(6)可配置,可根據(jù)項目要求進(jìn)行定制配置和編譯。
(7)具有高穩(wěn)定性、高性能,可移植性好,目前MiniGUI可以在XWindow和Linux控制臺上運行。
MiniGUI的缺點是圖形功能尚不完善,應(yīng)用設(shè)計比較困難。10.2.4OpenGUI
OpenGUI在Linux系統(tǒng)上存在已經(jīng)很長時間了,最初的名字叫FastGL,只支持256色的線性顯存模式,但目前也支持其他顯示模式,并且支持多種操作系統(tǒng)平臺,比如MS-DOS、QNX和Linux等,不過目前只支持X86硬件平臺。OpenGUI也是一個公開源碼項目。
OpenGUI也分為三層:最底層是由匯編語言編寫的快速圖形引擎;中間層提供了圖形繪制API,包括線條、矩形、圓弧等,并且兼容于Borland的BGIAPI;第三層用C++編寫,提供了完整的GUI對象集。
OpenGUI比較適合基于X86平臺的實時系統(tǒng),但可移植性稍差。
10.3Qt/Embedded嵌入式圖形開發(fā)基礎(chǔ)
本節(jié)將具體介紹基于嵌入式Linux的圖形界面開發(fā)環(huán)境Qt/Embedded,并具體描述Qt/Embedded開發(fā)環(huán)境的創(chuàng)建和使用方法。10.3.1Qt/Embedded概述
1.關(guān)于Qt
Qt是挪威TrollTech公司的一個標(biāo)志性產(chǎn)品,它是一個支持多操作系統(tǒng)平臺的應(yīng)用程序開發(fā)框架,開發(fā)語言是C++。Qt開發(fā)的最初目的是為跨平臺的軟件開發(fā)者提供統(tǒng)一的、精美的圖形用戶編程接口,但現(xiàn)在它也提供了統(tǒng)一的網(wǎng)絡(luò)和數(shù)據(jù)庫操作的編程接口。簡而言之,Qt是一個跨平臺的C++圖形用戶界面庫,它支持所有Unix系統(tǒng),當(dāng)然也包括Linux,還支持WinNT/Win2k、Win95/98平臺,目前包括Qt、基于FrameBuffer的Qt/Embedded、嵌入式桌面平臺Qtopia。
Qt是以工具開發(fā)包的形式提供給開發(fā)者的,這些工具開發(fā)包包括了QtDesigner(圖形設(shè)計器)、Makefile制作工具、字體國際化工具和Qt的C++類庫等。
Qt的主要特點是:具有豐富的API;優(yōu)良的跨平臺特性;面向?qū)ο蟮取t不是自由軟件,如果利用Qt編寫非免費軟件,則需要購買他們的License。由于Qt具有面向?qū)ο?、技術(shù)成熟等優(yōu)點,因此,目前高端嵌入式設(shè)備生產(chǎn)商幾乎都選擇Qt作為開發(fā)工具。
其中,Qtopia(全稱QtPalmtopEnvironment)是構(gòu)建于Qt/Embedded之上的一個類似桌面系統(tǒng)的應(yīng)用環(huán)境,包含完整的應(yīng)用層、靈活的用戶界面、窗口操作系統(tǒng)、應(yīng)用程序的啟動程序以及開發(fā)框架。而Qt/Embedded是Qt的嵌入式Linux版本,它是為嵌入式設(shè)備的圖形用戶界面開發(fā)而訂做的開發(fā)工具包,在世界各地被廣泛使用。除了在商業(yè)上的許多應(yīng)用以外,Qt/Embedded還是為小型設(shè)備提供Qtopia應(yīng)用環(huán)境的基礎(chǔ)。Qt/Embedded以簡潔的系統(tǒng)、可視化的表單設(shè)計和翔實的API讓編寫代碼變得愉快和舒暢。
2.?Qt/Embedded的體系結(jié)構(gòu)
Qt/Embedded是Trolltech公司開發(fā)的面向嵌入式系統(tǒng)的Qt版本,與X11版本的Qt在最大程度上接口兼容。Qt/Embedded包括類庫以及支持嵌入式開發(fā)的工具等。Qt/Embedded類庫完全采用C++封裝,并且有著豐富的控件資源以及較好的可移植性。Qt/Embedded的實現(xiàn)結(jié)構(gòu)如圖10-2所示。圖10-2Qt/Embedded的實現(xiàn)結(jié)構(gòu)
QWSServer是一個圖形事件服務(wù)類,它提供了在Qt/Embedded中服務(wù)器特定的功能,當(dāng)運行Qt/Embedded應(yīng)用程序時,這個應(yīng)用程序可作為一個服務(wù)器運行或連接到一個存在的服務(wù)器。如果一個服務(wù)器運行,則一些附加操作通過QWSServer類來提供。
Qt/Embedded的底層圖形引擎基于FrameBuffer。如10.2節(jié)中所述,F(xiàn)rameBuffer(幀緩沖)是一種驅(qū)動程序接口,用戶可以把FrameBuffer看成是一塊內(nèi)存,既可以從這塊內(nèi)存中讀取數(shù)據(jù),也可以向其中寫入數(shù)據(jù),而寫操作立即反映在屏幕上。為運行Qt/Embedded,嵌入式Linux內(nèi)核要支持FrameBuffer。
Qt/Embedded同樣是Server/Client結(jié)構(gòu),Qt/Embedded通過QtAPI與LinuxI/O設(shè)備的直接交互,成為嵌入式Linux端口。Qt/Embedded提供自身的輕量級窗口系統(tǒng),比使用XLib和XWindow更加緊湊,因為它不需要一個XWindowServer或是XLib庫,它在底層摒棄了XLib,并采用幀緩沖(FrameBuffer)作為底層圖形接口。圖10-3為Qt/Embedded與Qt/X11的關(guān)系圖。圖10-3Qt/Embedded與Qt/X11的關(guān)系圖同Qt/X11相比,Qt/Embedded最顯著的效果就是減少了內(nèi)存消耗。因此,運行Qt/Embedded所需的系統(tǒng)資源可以很小,相對X窗口下的嵌入解決方案而言,Qt/Embedded只要求一個較小的存儲空間(Flash)和內(nèi)存。
3.?Qt/Embedded的開發(fā)工具
Qt/Embedded提供許多支持嵌入式開發(fā)的工具,其中兩個非常重要的Qt工具就是:qmake和QtDesigner(Qt圖形設(shè)計器)。
qmake是一個為編譯Qt/Embedded庫和應(yīng)用而提供的Makefile生成器,可以為Qt/Embedded鏈接庫和應(yīng)用程序生成Makefile文件。qmake可以根據(jù)一個項目文件(.pro)產(chǎn)生多種平臺下的Makefile文件,使應(yīng)用程序方便地在多種平臺間移植。
QtDesigner是一個具有可視化用戶接口的設(shè)計工具。Qt的應(yīng)用程序可以完全用源代碼編寫,也可以使用QtDesigner來加速開發(fā)工作。QtDesigner使用可視化的方式來設(shè)計對話框和窗口,而不用手工編寫代碼。在QtDesigner中還可以使用布局管理器來平滑地設(shè)置窗口部件的布局,使用代碼編寫器編寫代碼。qmake和QtDesigner是完全整合在一起的。
4.?Qt/Embedded的窗口系統(tǒng)
Qt/Embedded包括了它自身的窗口系統(tǒng)。一個Qt/Embedded窗口系統(tǒng)包含了一個或多個進(jìn)程,其中的一個進(jìn)程可作為服務(wù)器。這個服務(wù)進(jìn)程會分配客戶顯示區(qū)域,以及產(chǎn)生鼠標(biāo)和鍵盤事件。這個服務(wù)進(jìn)程還能夠提供輸入方法和一個用戶接口給運行起來的客戶應(yīng)用程序。這個服務(wù)進(jìn)程其實就是一個有某些額外權(quán)限的客戶進(jìn)程。任何程序都可以在命令行上加上“-qws”的選項來把它作為一個服務(wù)器運行??蛻襞c服務(wù)器之間的通信使用共享內(nèi)存的方法,通信量應(yīng)該保持最小,例如客戶進(jìn)程直接訪問幀緩沖來完成全部的繪制操作,而不會通過服務(wù)器,客戶程序需要負(fù)責(zé)繪制它們自己的標(biāo)題欄和其他式樣。這就是Qt/Embedded庫內(nèi)部的處理過程。
客戶可以使用QCOP通道交換消息。服務(wù)進(jìn)程簡單地廣播QCOP消息給所有監(jiān)聽指定通道的應(yīng)用進(jìn)程,接著應(yīng)用進(jìn)程可以把一個插槽連接到一個負(fù)責(zé)接收的信號上,從而對消息做出響應(yīng)。消息的傳遞通常伴隨著二進(jìn)制數(shù)據(jù)的傳輸,這是通過一個QDataStream類的序列化過程來實現(xiàn)的。QProcess類提供了另外一種異步進(jìn)程間通信的機(jī)制。它用于啟動一個外部的程序并且通過寫一個標(biāo)準(zhǔn)的輸入和讀取外部程序的標(biāo)準(zhǔn)輸出及錯誤碼來與它們通信。
5.字體
Qt/Embedded支持四種不同的字體格式:TrueType字體(TTF)、PostscriptType1字體(TYPE1)、位圖發(fā)布字體(BDF)和Qt的預(yù)呈現(xiàn)(Pre-rendered)字體(QPF)。Qt還可以通過增加QFontFactory的子類來支持其他字體,也可以支持以插件方式出現(xiàn)的反別名字體。
每個TTF或者TYPE1類型的字體首次被使用時,這些字體的字形都會以指定的大小被預(yù)先呈現(xiàn)出來,呈現(xiàn)的結(jié)果會以QPF的格式被保存下來,這樣可以節(jié)省內(nèi)存和CPU處理時間。QPF文件包含了一些必要的字體,這些字體可以通過makeqpf工具取得或者通過運行程序時加上“savefonts”選項獲取。如果應(yīng)用程序中使用到的字體都是QPF格式,那么Qt/Embedded將被重新配置,并排除對TTF和TYPE1類型的字體的編譯,這樣就可以減少Q(mào)t/Embedded的庫的大小和存儲字體的空間。
Qt/Embedded的字體通常包括Unicode字體的一部分子集,如ASII和Latin-1。一個完整的16點陣的Unicode字體的存儲空間通常超過1MB,我們應(yīng)盡可能存儲一個字體的子集,而不是存儲所有的字,例如在用戶的應(yīng)用中,用戶僅僅需要以Cappuccino字體、粗體的方式顯示產(chǎn)品的名稱,但是用戶卻有一個包含了全部字形的字體文件。
6.輸入設(shè)備和輸入方法
Qt/Embedded3.0支持以下幾種鼠標(biāo)協(xié)議:BusMouse、IntelliMouse、Microsoft和MouseMan,支持NECVr41XX和iPAQ的觸摸屏,還支持標(biāo)準(zhǔn)的101鍵盤和Vr41XX按鍵。若通過子類化QWSKeyboardHandler可以讓Qt/Embedded支持更多的客戶鍵盤和其他的非指示設(shè)備。
在一個無鍵盤的設(shè)備上,輸入法成了唯一的輸入字符的手段。Qtopia提供了4種輸入方法:筆跡識別器、Unicode鍵盤、圖形化的標(biāo)準(zhǔn)鍵盤以及字典式提取鍵盤。這些鍵盤的樣式如圖10-4所示。圖10-4Qtopia的4種輸入方法(a)筆跡識別器;(b)?Unicode鍵盤;(c)標(biāo)準(zhǔn)鍵盤;(d)字典式提取鍵盤10.3.2創(chuàng)建Qt/Embedded開發(fā)環(huán)境
一般來說,基于Qt/Embedded開發(fā)的應(yīng)用程序最終會發(fā)布到安裝有嵌入式Linux操作系統(tǒng)的小型設(shè)備上,所以使用裝有Linux操作系統(tǒng)的PC或者工作站來完成Qt/Embedded開發(fā)是最理想的環(huán)境,盡管Qt/Embedded也可以安裝在Unix和Windows系統(tǒng)上。
下面介紹在一臺裝有Linux操作系統(tǒng)的機(jī)器上建立Qt/Embedded開發(fā)環(huán)境的方法。
1.準(zhǔn)備軟件安裝包
首先,準(zhǔn)備三個軟件安裝包:tmake工具安裝包、Qt/Embedded安裝包和Qt的X11版安裝包(注意:QtforX11的版本應(yīng)比Qt/Embedded的版本舊)。
我們以下列版本的安裝包逐步介紹Qt/Embedded開發(fā)環(huán)境的創(chuàng)建過程:
(1)?tmake1.11:用于生成Qt/Embedded應(yīng)用工程的Makefile文件。
(2)?Qt/Embedded2.3.7:Qt/Embedded安裝包。
(3)?Qt2.3.2forX11:Qt的X11版安裝包,用于產(chǎn)生X11開發(fā)環(huán)境所需要的兩個工具。
2.安裝tmake
在Linux命令模式下運行以下命令:
tarxfztmake-1.11.tar.gz
exportTMAKEDIR=$PWD/tmake-1.11
exportTMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++
exportPATH=$TMAKEDIR/bin:$PATH
3.安裝Qt/Embedded2.3.7
在Linux命令模式下運行以下命令:
tarxfzqt-embedded-2.3.7.tar.gz
cdqt-2.3.7
exportQTDIR=$PWD
exportQTEDIR=$QTDIR
exportPATH=$QTDIR/bin:$PATH
exportLD_LIBRARY_PATH=$QTDIR/lib:$LD_
LIBRARY_PATH
./configure-qconfig-qvfb-depths4,8,16,32
makesub-src
cd..命令“./configure-qconfig-qvfb-depths4,8,16,32”指定Qt嵌入式開發(fā)包生成虛擬緩沖幀工具qvfb,并支持4、8、16、32位的顯示顏色深度。另外,還可以在configure的參數(shù)中添加-system-jpeg和gif,使Qt/Embedded平臺能支持jpeg、gif格式的圖形。
命令“makesub-src”指定按精簡方式編譯開發(fā)包,也就是說,有些Qt類未被編譯。Qt嵌入式開發(fā)包有5種編譯范圍的選項,使用這些選項,可控制Qt生成的庫文件的大小,但是用戶應(yīng)用時所使用到的一些Qt類將可能因此在Qt的庫中找不到鏈接。編譯選項的具體用法可通過“./configure-help”命令查看。
4.安裝Qt/X112.3.2
在Linux命令模式下運行以下命令:10.3.3Qt/Embedded的使用
1.信號與插槽(signals/slots)機(jī)制
Trolltech創(chuàng)立了一種新的機(jī)制—信號與插槽(signals/slots)機(jī)制。信號與插槽機(jī)制是Qt的重要特征,它是一種強(qiáng)有力的對象間通信機(jī)制,它完全可以取代原始的回調(diào)和消息映射機(jī)制。信號與插槽是迅速的、類型安全的、健壯的、完全面向?qū)ο蟛⒂肅++來實現(xiàn)的一種機(jī)制。
1)原理
原始的回調(diào)函數(shù)機(jī)制是指,將某段響應(yīng)代碼和某個按鈕的動作相關(guān)聯(lián),把響應(yīng)代碼寫成一個函數(shù),然后把這個函數(shù)的地址指針傳給按鈕,當(dāng)那個按鈕被按下時,這個函數(shù)就會被執(zhí)行。這種方式存在兩個問題:一是,回調(diào)函數(shù)被執(zhí)行時所傳遞進(jìn)來的函數(shù)參數(shù)不能確保是否正確,容易造成進(jìn)程崩潰;二是,回調(diào)這種方式緊緊地綁定了圖形用戶接口的功能元素,因而很難把開發(fā)獨立地分類。然而,Qt的信號與插槽機(jī)制是不同的。Qt的窗口在事件發(fā)生后會激發(fā)信號。程序員通過建立一個函數(shù)(稱做一個插槽),然后調(diào)用connect()函數(shù)把這個插槽和一個信號連接起來,這樣就完成了一個事件和響應(yīng)代碼的連接。例如,如果一個退出按鈕的clicked()信號被連接到了一個應(yīng)用的退出函數(shù)quit()插槽,那么一個用戶點擊退出鍵將使應(yīng)用程序終止運行。此連接過程用代碼寫出來就是:
connect(button,SIGNAL(clicked()),qApp,SLOT(quit()));信號與插槽機(jī)制(如圖10-5所示)中的一個對象的信號可以被多個不同的插槽連接,而多個信號也可以被連接到相同的插槽。當(dāng)信號和插槽被連接起來時,應(yīng)當(dāng)確保它們的參數(shù)類型是相同的,如果插槽的參數(shù)個數(shù)小于和它連接在一起的信號的參數(shù)個數(shù),那么從信號傳遞插槽的多余的參數(shù)將被忽略。圖10-5信號與插槽機(jī)制
2)特性
(1)可開發(fā)出代碼重用的類,因為它不要求類之間互相知道細(xì)節(jié)。
(2)類型安全的,因為它以警告的方式報告類型錯誤,而不會使系統(tǒng)產(chǎn)生崩潰。
(3)面向?qū)ο蟮?,因為它完全采用C++來實現(xiàn),利用了C++面向?qū)ο蟮奶卣鳌?/p>
3)元對象編譯器(MetaObjectCompiler,MOC)
信號與插槽機(jī)制是以純C++代碼來實現(xiàn)的,實現(xiàn)的過程使用了Qt開發(fā)工具包提供的預(yù)處理器和元對象編譯器(MOC)。MOC的作用是讀取應(yīng)用程序的頭文件,并產(chǎn)生支持信號與插槽的必要的代碼。開發(fā)者沒必要編輯或是瀏覽這些自動產(chǎn)生的代碼,當(dāng)有需要時,qmake生成的Makefile文件里會顯式運行MOC的規(guī)則。除了可以處理信號與插槽機(jī)制之外,MOC還支持翻譯機(jī)制、屬性系統(tǒng)和運行時的信息。
4)實例
如果一個類要使用信號與插槽機(jī)制,它就必須是從QObject或者QObject的子類繼承,而且在類的定義中必須加上Q_OBJECT宏。其中,信號被定義在類的信號部分,而插槽則定義在publicslots、protectedslots或者privateslots部分。下面定義了一個使用到信號與插槽機(jī)制的類:
BankAccount類和大部分C++的類一樣。其中,有一個信號balanceChanged(),聲明了它在BankAccount類的成員curBalance的值被改變時產(chǎn)生。信號不需要被實現(xiàn),當(dāng)信號被激發(fā)時,和該信號連接的插槽將被執(zhí)行。插槽函數(shù)setBalance(intnewBalance)的實現(xiàn)代碼如下:其中:“emitbalanceChanged(curBalance);”的作用是當(dāng)curBalance的值被改變后,將新的curBalance的值作為參數(shù)去激活balanceChanged()信號。對于關(guān)鍵詞“emit”,它和信號、插槽一樣是由Qt提供的,這些關(guān)鍵詞都會被C++的預(yù)處理機(jī)制轉(zhuǎn)換為C++代碼。
2.窗體(Qwidget及其子類)
一個窗體可以包含很多的子窗體,子窗體可以顯示在父窗體的客戶區(qū)。而一個沒有父窗體的窗體我們稱之為頂級窗體(一個“窗口”)。一個窗體通常由一個邊框和標(biāo)題欄來裝飾。
Qt并未對窗體有什么限制,任何類型的窗體都可以是頂級窗體,也可以是別的窗體的自窗體。同時,標(biāo)簽、消息框和工具欄等可以使用任何顏色、任何字體和語言。Qt窗體使用起來很靈活,它可以被子類化,以滿足客戶不同的需求。
窗體是Qwidget類或其子類的實例,客戶自己的窗體類需要從Qwidget的子類繼承(見圖10-6)。圖10-6Qwidget類的繼承圖例如:繪制一個模擬的時鐘,顯示當(dāng)前時間,并自動地更新時間。
(1)在“analogclock.h”頭文件中,定義AnalogClock,代碼如下:
AnalogClock類繼承了Qwidget,它有一個典型的窗體類構(gòu)造函數(shù),這個函數(shù)有父窗口對象指針和名字指針兩個參數(shù)。
timerEvent()函數(shù)是從QObject(Qwidget的父類)對象繼承而來的,這個函數(shù)會被系統(tǒng)定期調(diào)用。paintEvent()函數(shù)是從QWidget繼承而來的,并且當(dāng)窗體需要重畫時,這個函數(shù)就會被調(diào)用。timerEvent()和paintEvent()函數(shù)是“事件句柄”的兩個例子。應(yīng)用對象以重載父類對象的虛擬函數(shù)events(QEventobjects)的形式接收系統(tǒng)的事件。大約有超過50個的系統(tǒng)事件是較常用的,例如MouseButtonPress、MouseButtonRelease、KeyPress、KeyRelease、Paint、Resize和Close。
(2)?analogclock.cpp文件是定義在analogclock.h中的函數(shù)的實現(xiàn)源文件,代碼如下:構(gòu)造函數(shù)設(shè)置窗口的尺寸大小為100×100,并且告訴系統(tǒng)每隔12秒調(diào)用一次timerEvent()函數(shù),從而對模擬鐘的窗體進(jìn)行刷新。
在timerEvent()函數(shù)中,通過調(diào)用QWidget的函數(shù)update()就可以告訴Qt,窗體需要立即重畫,緊接著Qt就會產(chǎn)生一個繪制事件并且調(diào)用paintEvent()函數(shù)。
在paintEvent()函數(shù)中,一個Qpainter對象用于在窗體上繪制12個刻度以及分針、時針。Qpainter類提供了一種統(tǒng)一的方式用于繪制窗體、位圖、矢量圖等,它提供了繪制點、線、橢圓、多邊形、弧、貝塞爾曲線等功能。一個Qpainter的坐標(biāo)系可以被轉(zhuǎn)變、縮放、旋轉(zhuǎn)和剪切,這樣對象就可以根據(jù)它在窗口或者窗體上的位置繪制出一個剪切的視圖。剪切可以使窗體繪制時減少閃爍。使用QPainter的子類QdirectPainter可以鎖定和直接訪問幀緩沖區(qū)域。
(3)文件analogclock.h與analogclock.cpp完全地定義和實現(xiàn)了AnalogClock客戶窗體類,這個窗體是現(xiàn)在就可以使用的。
3.主窗口(QMainWindow類)
QMainWindow類是為應(yīng)用的主窗口提供了一個擺放相關(guān)窗體的框架。
通常情況下,主窗口的頂部是一個菜單欄,底部有一個狀態(tài)欄,中間區(qū)域可以包含其他的窗體,而菜單欄下方放置著一個工具欄。另外,當(dāng)鼠標(biāo)在窗體的某些位置移動時,還會出現(xiàn)一些旁述的按鈕,如“提示欄”和“這是什么”幫助按鈕等。其中,工具欄可以被拖放到一個??康奈恢茫纬梢粋€浮動的工具面板。
1)菜單欄(QmenuBar類)
QmenuBar類實現(xiàn)了一個菜單欄,它會自動地設(shè)置幾何尺寸并在它的父窗體的頂部顯示出來,如果父窗體的寬度不夠?qū)挘灾虏荒茱@示一個完整的菜單欄,那么菜單欄將會分為多行顯示出來。Qt內(nèi)置的布局管理能夠自動地調(diào)整菜單欄。Qt的菜單系統(tǒng)是非常靈活的,菜單項可以被動態(tài)地使能、失效、添加或者刪除。通過子類化QcustomMenuItem,我們可以建立客戶化外觀和功能的菜單項。
QpopupMenu(彈出式菜單)類以垂直列表的方式顯示菜單項,它可以是單個的,也可以是以菜單欄的方式出現(xiàn)的,或者是以別的彈出式菜單的子菜單出現(xiàn)的。每個菜單項可以有一個圖標(biāo)、一個復(fù)選框和一個加速器(快捷鍵)。菜單項通常對應(yīng)一個動作(例如存盤),分隔器通常顯示成一條豎線,它用于把一組相關(guān)聯(lián)的動作菜單分立成組。例如,建立一個包含有New、Open和Exit菜單項的文件菜單:當(dāng)一個菜單項被選中時,和它相關(guān)的插槽將被執(zhí)行。加速器(快捷鍵)很少在一個沒有鍵盤輸入的設(shè)備上使用,Qt/Embedded的典型配置并未包含對加速器的支持。上面出現(xiàn)的“&New”代碼的意思是在桌面機(jī)器上以“New”的方式顯示出來,但是在嵌入式設(shè)備上,它只會顯示為“New”。
2)工具欄(QtoolButton類)
QtoolButton類實現(xiàn)了一個帶有圖標(biāo)、三維邊框和可選標(biāo)簽的工具欄按鈕。切換工具欄按鈕具有開、關(guān)的特征,其他的按鈕則執(zhí)行相應(yīng)命令。不同的圖標(biāo)用來表示按鈕的活動,無效、使能模式,或者是開或關(guān)的狀態(tài)。如果用戶僅為按鈕指定了一個圖標(biāo),那么Qt會使用可視提示來表現(xiàn)按鈕不同的狀態(tài),例如按鈕失效時顯示灰色。
工具欄按鈕通常以一排的形式顯示在工具欄上。對于一個有幾組工具欄的應(yīng)用,用戶可以隨便地到處移動這些工具欄,工具欄差不多可以包含所有的窗體,例如QComboBoxes和QspinBoxes。
3)旁述
Qt提供了兩種旁述的方式:“提示欄”和“這是什么”幫助按鈕。
(1)“提示欄”按鈕:通常是小的黃色的矩形,當(dāng)鼠標(biāo)在窗體的一些位置游動時,它就會自動出現(xiàn),主要用于解釋工具欄按鈕,特別是那些缺少文字標(biāo)簽說明的工具欄按鈕的用途。
例如,設(shè)置一個“存盤”按鈕提示的代碼:
QToolTip::add(saveButton,“Save”);
當(dāng)提示字符出現(xiàn)之后,用戶還可以在狀態(tài)欄顯示更詳細(xì)的文字說明。
(2)“這是什么”幫助按鈕:通常指在靠近應(yīng)用窗口的關(guān)閉按鈕“×”附近看到的“?”符號的小按鈕。它同“提示欄”按鈕有些相似,只不過“提示欄”按鈕是要鼠標(biāo)點擊了才會顯示旁述。對于一些沒有鼠標(biāo)的設(shè)備,也許就需要使用“這是什么”幫助按鈕。此外,“這是什么”幫助按鈕按下后顯示的提示信息一般比“提示欄”要多一些。
例如,設(shè)置一個存盤按鈕的“這是什么”文本提示信息:
QWhatsThis::add(saveButton,"Savesthecurrentfile.");
QToolTip和QWhatsThis類提供了虛擬函數(shù)以供開發(fā)者重新實現(xiàn)更多的特定的用途。Qtopia并未使用上述提及的兩種旁述機(jī)制。它在應(yīng)用窗口的標(biāo)題欄上放置一個“?”符號的按鈕來代替上述的旁述機(jī)制,這個“?”按鈕可以啟動一個瀏覽器來顯示和當(dāng)前應(yīng)用相關(guān)的HTML頁面。Qtopia使用按下和握住的姿態(tài)來調(diào)用上下文菜單與屬性對話框。
4)動作(QAction類)
應(yīng)用程序通常提供給用戶幾種不同的方式去執(zhí)行特別的動作。例如,大部分應(yīng)用提供了一個“Save”動作給用于存盤的菜單(File|Save)以及工具欄(一個“軟盤”圖標(biāo)的工具欄按鈕)和快捷鍵(Ctrl+S)。
QAction類可以讓上述過程變得簡潔,它允許程序員在一個地方定義一個動作,然后把這個動作加入到菜單或者工具欄。
QAction類可以確保菜單的狀態(tài)與工具欄按鈕的狀態(tài)保持一致,必要時還可顯示提示欄。使一個動作(Action)失效將導(dǎo)致和該動作相關(guān)聯(lián)的菜單項以及工具按鈕的失效。同樣地,如果用戶切換一個工具按鈕的狀態(tài),那么相關(guān)的菜單項也會跟著被選中或不選中。例如,實現(xiàn)一個“Save”菜單項和一個“Save”工具按鈕:
4.對話框
Qt提供了許多現(xiàn)成的包含了實用的靜態(tài)函數(shù)的對話框類。
如圖10-7所示,QmessageBox類是一個用于向用戶提供信息或是給用戶進(jìn)行一些簡單選擇(例如“yes”或“no”)的對話框類。QprogressDialog對話框包含了一個進(jìn)度欄和一個“Cancel”按鈕。Qwizard類提供了一個向?qū)υ捒虻目蚣堋?/p>
Qt提供的對話框還包括QColorDialog、QFileDialog、QFontDialog和QprintDialog。圖10-7QmessageBox與QprogressDialog對話框
5.窗體的布局管理
布局管理的作用是組織管理父窗體區(qū)域內(nèi)的子窗體。它可以自動設(shè)置子窗體的位置和大小,并可判斷出一個頂級窗體的最小和缺省的尺寸,當(dāng)窗體的字體或內(nèi)容變化后,它可以重置一個窗體的布局。布局管理使得圖形用戶界面的開發(fā)高效而簡便,也使得提供部分用戶接口組件(如輸入法和任務(wù)欄)變得更容易。
Qt提供了三種用于布局管理的類:QHBoxLayout、QVBoxLayout和QGridLayout。QHBoxLayout布局管理把窗體按照水平方向從左至右排成一行;QVBoxLayout布局管理把窗體按照垂直方向從上至下排成一列;QGridLayout布局管理以網(wǎng)格的方式來排列窗體,一個窗體可以占據(jù)多個網(wǎng)格。三者的布局效果見圖10-8。
例如,建立兩個如圖10-9所示的不同尺寸的對話框。圖10-8QHBoxLayout、QVBoxLayout和QGridLayout的布局效果圖10-9兩個不同尺寸
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 家庭教育咨詢指導(dǎo)師練習(xí)題復(fù)習(xí)試題含答案
- 焊工理論試題及答案復(fù)習(xí)試題有答案
- 商用合同范例
- 農(nóng)村建筑工程承包合同書樣本
- 農(nóng)村房屋建房報告書
- 國際黃金進(jìn)口合同范例
- 借貸對象寫合同范本
- 傳媒類公司合同范本
- 代理傭金合同范本
- 業(yè)務(wù)傭金 合同范例
- DeepSeek:從入門到精通3天教程
- GB/T 44994-2024聲學(xué)助聽器驗配管理
- 2025年上海鐵路局集團(tuán)公司招聘筆試參考題庫含答案解析
- 2024年04月北京中信銀行總行社會招考(423)筆試歷年參考題庫附帶答案詳解
- 2025年中國航天科工招聘筆試參考題庫含答案解析
- 兒童教育總經(jīng)理聘任合同
- 4《公民的基本權(quán)利和義務(wù)》(第2課時)教學(xué)實錄-2024-2025學(xué)年道德與法治六年級上冊統(tǒng)編版
- 公司前臺接待禮儀培訓(xùn)
- 人工智能導(dǎo)論知到智慧樹章節(jié)測試課后答案2024年秋天津大學(xué)
- (完整版)施工現(xiàn)場機(jī)械設(shè)備維修保養(yǎng)記錄表
- 2024解析:第四章光現(xiàn)象-基礎(chǔ)練(解析版)
評論
0/150
提交評論