版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
數(shù)字城市查詢系統(tǒng)——嵌入式linux下的GUI編程摘要本設(shè)計(jì)以EmbestS3CEB2410(ARM9)開發(fā)板為硬件底層,在Linux操作系統(tǒng)平臺(tái)的基礎(chǔ)上,利用開源Qt圖形用戶應(yīng)用程序框架,基于SQLite數(shù)據(jù)庫(kù),開發(fā)出軟硬件一體化的便攜式嵌入式電子地圖,功能包括數(shù)字建筑物的查詢,以及相關(guān)公交系統(tǒng)查詢的地圖信息查詢系統(tǒng)。本系統(tǒng)具有可擴(kuò)展性好,實(shí)用性強(qiáng)、可移動(dòng)的特點(diǎn),易于移植到不同的硬件平臺(tái)和其他操作系統(tǒng)軟件環(huán)境.關(guān)鍵詞:S3CEB2410,SQLite,Qt,Linux,Map,EmbeddedDigitalCityforSystemDesign——EmbeddedlinuxundertheGUIProgrammingABSTRACTThisdesignusingtheEmbestS3CEB2410(ARM9)developmentboardasbottomofhardwareonthebasisoftheLinuxoperatingsystemplatform,anditalsousingopensourceOTgraphicaluserapplicationframework,basingonSQLitedatabase,developedportableembeddedelectronicmapwhichistheintegrationofhardwareandsoftware.Thissystemisexpansibilitywell,usefulandtransplatable,anditisalsoeasilytotransplanttodifferenthardwareplatformsandotheroperatingsystemsoftwareenvironment.Keywords:S3CEB2410,SQLite,Qt,Linux,Map,Embedded目錄目錄 41 引言 11.1 項(xiàng)目簡(jiǎn)介紹 11.2 項(xiàng)目背景 11.3 項(xiàng)目的創(chuàng)新點(diǎn) 21.4 相關(guān)技術(shù) 31.4.1 基于ARM處理器的硬件開發(fā)平臺(tái) 31.4.2 嵌入式數(shù)據(jù)庫(kù) 31.4.3 嵌入式操作系統(tǒng) 51.4.4 Qt開發(fā)語(yǔ)言 61.5 定義 82 系統(tǒng)需求分析 82.1 功能需求 82.2 開發(fā)環(huán)境 92.2.1 硬件平臺(tái) 92.2.2 軟件開發(fā)平臺(tái) 92.2.3 開發(fā)語(yǔ)言 92.3 運(yùn)行環(huán)境 92.4 性能需求 92.4.1 時(shí)間特性要求 93 總體設(shè)計(jì) 93.1 基本設(shè)計(jì)概念和處理流程 94 系統(tǒng)GUI編程設(shè)計(jì) 114.1 地圖移動(dòng) 114.1.1 開始狀態(tài) 114.1.2 上下左右移動(dòng) 144.1.3 上下移動(dòng) 164.1.4 圖片裝載 184.1.5 畫布 194.2 利用線程播放聲音 235 致謝 246 參考文獻(xiàn) 24數(shù)字城市查詢系統(tǒng)——嵌入式linux下的GUI編程PAGE23引言項(xiàng)目簡(jiǎn)介紹隨著時(shí)代的進(jìn)步,人們的活動(dòng)領(lǐng)域不斷地?cái)U(kuò)大,地理環(huán)境的不熟悉程度越來(lái)越大,人們迫切需要有一種方便快捷的地理信息查詢工具。本項(xiàng)目的目的在于開發(fā)出價(jià)格更低廉、功能更實(shí)用、可移動(dòng)性強(qiáng)、運(yùn)行速度更快更穩(wěn)定、軟件移植性好、界面友好的電子地圖信息查詢系統(tǒng)嵌入作品,方便廣大的用戶,給用戶最實(shí)用的功能。項(xiàng)目是以EmbestS3CEB2410(arm9)開發(fā)板為硬件底層,是以Linux為操作系統(tǒng),是以SQLite為數(shù)據(jù)庫(kù),是以C++為開發(fā)語(yǔ)言,是以Qt來(lái)支撐C++圖形用戶界面應(yīng)用程序框架。最終開發(fā)出軟硬件一體化的地圖信息查詢系統(tǒng)。本系統(tǒng)具有實(shí)用性強(qiáng)、可移動(dòng)性好的等特點(diǎn)。本項(xiàng)目就是為了滿足廣大用戶的需要具有在陌生的環(huán)境下尋找各個(gè)地點(diǎn),并快速察看目的地的地理位置,查詢到達(dá)目的地的行走路線。使用戶處在一個(gè)陌生的環(huán)境里不會(huì)迷失方向。項(xiàng)目背景在當(dāng)前數(shù)字信息技術(shù)和網(wǎng)絡(luò)技術(shù)高速發(fā)展的后PC(Post-PC)時(shí)代,嵌入式系統(tǒng)已經(jīng)廣泛地滲透到科學(xué)研究、工程設(shè)計(jì)、軍事技術(shù)、各類產(chǎn)業(yè)和商業(yè)文化藝術(shù)以及人們的日常生活等方方面面中。隨著國(guó)內(nèi)外各種嵌入式產(chǎn)品的進(jìn)一步開發(fā)和推廣,嵌入式技術(shù)越來(lái)越和人們的生活緊密結(jié)合。Linux從1991年問(wèn)世到現(xiàn)在,短短的十幾年時(shí)間已經(jīng)發(fā)展成為功能強(qiáng)大、設(shè)計(jì)完善的操作系統(tǒng)之一;越來(lái)越多的企業(yè)和研發(fā)機(jī)構(gòu)都轉(zhuǎn)向嵌入式Linux的開發(fā)和研究上,在新興的嵌入式操作系統(tǒng)領(lǐng)域內(nèi)也獲得了飛速發(fā)展。地圖已成為人們?nèi)粘9ぷ鳌W(xué)習(xí)、旅行經(jīng)常利用的工具!一張普通地圖綜合反映地面上物體和現(xiàn)象一般特征的地圖,內(nèi)容包括各種自然地理要素(地形、水系、植被等)和社會(huì)經(jīng)濟(jì)要素(居民點(diǎn)、行政區(qū)劃、交通線路等)。從古至今,人們已經(jīng)形成一個(gè)意識(shí):地圖用來(lái)查找地理位置。生活中常常會(huì)遇到這樣一個(gè)問(wèn)題:不知道想要去的目的地具體在什么地方,即問(wèn)路問(wèn)題。在以前,人們一般有兩種解決方法。1、去問(wèn)人;2、查找地圖。第一種方式,實(shí)際效果并不是很理想;在大城市中,如廣州,即使一個(gè)長(zhǎng)年居住在那里的人也不能對(duì)該城市每一個(gè)地方都清楚;如果知道那個(gè)地方,未必能表述清楚,無(wú)法在詢問(wèn)者腦海中產(chǎn)生空間感、方位感??梢?jiàn)這種方式解決給問(wèn)題,效果很一般。但是在目標(biāo)地區(qū)附近詢問(wèn)他人,關(guān)于目標(biāo)位置卻是十分可行的辦法之一!第二種方式,效果較好,但是很難提高查找效率;讀者會(huì)有這一個(gè)理性的認(rèn)識(shí):地圖上所含的信息內(nèi)容多,要在地圖上找到需要的信息,并非易事。尤其是找一些中小企業(yè)公司和后街小巷。在地圖上這樣相似信息多如牛毛。一般需要幾分鐘到幾十分鐘,甚至上一個(gè)小時(shí)來(lái)看地圖,找地方??梢?jiàn)兩種傳統(tǒng)的解決方式都有諸多不便之處!隨著計(jì)算機(jī)電子技術(shù)的飛速發(fā)展,現(xiàn)在為上述問(wèn)題提供了更方便的解決方式電子地圖。電子地圖的應(yīng)用從上個(gè)世紀(jì)九十年代初就已經(jīng)開始,那個(gè)時(shí)候的電子地圖大多被企業(yè)內(nèi)部所應(yīng)用,隨著它與網(wǎng)絡(luò)的逐步結(jié)合,開始被諸多大眾所接受和使用。2004年年終GOOGLE推出了電子地圖的服務(wù),2005年電子地圖與搜索引擎的緊密接觸,對(duì)電子地圖的發(fā)展產(chǎn)生了巨大的推動(dòng)作用,受眾群體產(chǎn)生了巨大變化。從單純的通過(guò)網(wǎng)站查詢地圖位置,到手機(jī)、車載GPS等各種導(dǎo)航定位服務(wù),電子地圖與各種終端結(jié)合所產(chǎn)生的巨大價(jià)值,使其成為數(shù)字時(shí)代的新熱點(diǎn)而被廣泛關(guān)注起來(lái)。我們可以相信未來(lái)對(duì)電子地圖的應(yīng)用將更為普及。目前市面上使用的電子地圖基于網(wǎng)站查詢地圖位置,手機(jī)、車載GPS等服務(wù)和產(chǎn)品。這些服務(wù)和產(chǎn)品對(duì)人們提供了不少的便利是毋庸置疑的。每一種方式都有其優(yōu)點(diǎn)和局限性。網(wǎng)站查詢地圖位置。網(wǎng)絡(luò)依賴性強(qiáng),沒(méi)有網(wǎng)絡(luò)的支持無(wú)法服務(wù),查詢結(jié)果返回的快慢很大程度與網(wǎng)速有關(guān);如果用個(gè)人pc機(jī)位查詢終端,可移動(dòng)性差、成本高。一般人只能在固定地點(diǎn)使用電腦查詢地圖,如果出門在外,這種方式不可行。優(yōu)點(diǎn):查詢速度快。手機(jī)GPS產(chǎn)品。價(jià)格昂貴,手機(jī)產(chǎn)品能支持該功能或平臺(tái)的售價(jià)至少要1500元以上;手機(jī)GPS功能的開通或使用也需要一筆費(fèi)用。網(wǎng)絡(luò)依賴性強(qiáng),如果沒(méi)有網(wǎng)絡(luò)的支持,功能無(wú)法實(shí)現(xiàn)。查詢速度慢,手機(jī)GPS必須通過(guò)無(wú)線網(wǎng)絡(luò)進(jìn)行通信,數(shù)據(jù)通過(guò)網(wǎng)絡(luò)傳輸必定有時(shí)延,也會(huì)占用嵌入式系統(tǒng)有限的資源。軟件的可移植性差,其軟件產(chǎn)品只能在手機(jī)平臺(tái)上使用。優(yōu)點(diǎn):可移動(dòng)性。車載GPS產(chǎn)品。價(jià)格昂貴,產(chǎn)品售價(jià)一般2000元以上。網(wǎng)絡(luò)依賴性強(qiáng),如果沒(méi)有網(wǎng)絡(luò)的支持,功能無(wú)法實(shí)現(xiàn)。查詢速度慢,車載GPS同樣也必須通過(guò)無(wú)線網(wǎng)絡(luò)進(jìn)行通信,數(shù)據(jù)通過(guò)網(wǎng)絡(luò)傳輸必定有時(shí)延,也會(huì)占用嵌入式系統(tǒng)有限的資源。優(yōu)點(diǎn):可移動(dòng)性、軟件可移植性我們的項(xiàng)目正是為了改進(jìn)上面所提出不足的。該項(xiàng)目的目的在于開發(fā)出價(jià)格更低廉、功能更實(shí)用、可移動(dòng)性強(qiáng)、無(wú)網(wǎng)絡(luò)依賴性、運(yùn)行速度更快更穩(wěn)定、軟件移植性好、界面友好的作品,方便廣大的用戶,給用戶最實(shí)用的功能。項(xiàng)目的創(chuàng)新點(diǎn)本項(xiàng)目將開發(fā)的“數(shù)字城市查詢系統(tǒng)”應(yīng)用于城市信息查詢,主要具有以下幾方面的優(yōu)勢(shì):軟硬件相結(jié)合,軟硬件一體化,可移動(dòng)性好;信息集成化,把最實(shí)用的功能集成到一起,地圖搜索、公交查詢、建筑介紹(歷史、用途、娛樂(lè)服務(wù)內(nèi)容、特色飲食、聯(lián)系方式、營(yíng)業(yè)時(shí)間、火車汽車輪船客貨運(yùn)輸線路班次等);有輸入檢測(cè)功能,有含糊查詢功能;查詢速度快,有顯示所需查詢時(shí)間;查詢結(jié)果立體形象,圖文相結(jié)合。既有地圖標(biāo)示、劃線,也有文字信息;具有聲音提示功能,查詢結(jié)果更形象立體;人性化的人機(jī)交互界面,采用人們習(xí)慣的界面風(fēng)格(goolge地圖界面風(fēng)格),界面簡(jiǎn)單,符合用戶使用的習(xí)慣,易上手便使用的特點(diǎn)。軟件相對(duì)獨(dú)立性,軟件系統(tǒng)可移植在多個(gè)硬件平臺(tái)如:手機(jī)、mp4、個(gè)人pc機(jī)等,和多個(gè)軟件平臺(tái)上運(yùn)行如:Windows、Linux和Unix系統(tǒng)軟件上使用。相關(guān)技術(shù)基于ARM處理器的硬件開發(fā)平臺(tái)作為一種16/32位的高性能、低成本、低功耗的嵌入式RISC微處理器,ARM微處理器目前已經(jīng)成為應(yīng)用最為廣泛的嵌入式微處理器。ARM技術(shù)還將不斷發(fā)展。在嵌入式領(lǐng)域,ARM已取得了極大的成功,造就了IP核商業(yè)化、市場(chǎng)化的神話,迄今為止,還沒(méi)有任何商業(yè)化的IP核交易和使用達(dá)到ARM的規(guī)模。ARM系列芯片已經(jīng)被廣泛的應(yīng)用于移動(dòng)電話、手持式計(jì)算機(jī)以及各種各樣的嵌入式應(yīng)用領(lǐng)域,成為世界上銷量最大的32位微處理器。ARM9系列處理器是英國(guó)ARM公司設(shè)計(jì)的主流嵌入式處理器,主要包括ARM9TDMI和ARM9E-S等系列。新一代的ARM9處理器,通過(guò)全新的設(shè)計(jì),采用了更多的晶體管,能夠達(dá)到兩倍以上于ARM7處理器的處理能力。這種處理能力的提高是通過(guò)增加時(shí)鐘頻率和減少指令執(zhí)行周期實(shí)現(xiàn)的。ARM7處理器采用3級(jí)流水線,而ARM9采用5級(jí)流水線。增加的流水線設(shè)計(jì)提高了時(shí)鐘頻率和并行處理能力。5級(jí)流水線能夠?qū)⒚恳粋€(gè)指令處理分配到5個(gè)時(shí)鐘周期內(nèi),在每一個(gè)時(shí)鐘周期內(nèi)同時(shí)有5個(gè)指令在執(zhí)行。在同樣的加工工藝下,ARM9TDMI處理器的時(shí)鐘頻率是ARM7TDMI的1.8~2.2倍。ARM9系列微最適合用于對(duì)價(jià)位和功耗要求較高的消費(fèi)類應(yīng)用。ARM9微處理器系列具有如下特點(diǎn):32bit定點(diǎn)RISC處理器,改進(jìn)型ARM/Thumb代碼交織,增強(qiáng)性乘法器設(shè)計(jì)。支持實(shí)時(shí)(real-time)調(diào)試;片內(nèi)指令和數(shù)據(jù)SRAM,而且指令和數(shù)據(jù)的存儲(chǔ)器容量可調(diào);片內(nèi)指令和數(shù)據(jù)高速緩沖器(cache)容量從4K字節(jié)到1M字節(jié);設(shè)置保護(hù)單元(protcctionunit),非常適合嵌入式應(yīng)用中對(duì)存儲(chǔ)器進(jìn)行分段和保護(hù);采用AMBAAHB總線接口,為外設(shè)提供統(tǒng)一的地址和數(shù)據(jù)總線;支持外部協(xié)處理器,指令和數(shù)據(jù)總線有簡(jiǎn)單的握手信令支持;支持標(biāo)準(zhǔn)基本邏輯單元掃描測(cè)試方法學(xué),而且支持BIST(built-in-self-test);支持嵌入式跟蹤宏單元,支持實(shí)時(shí)跟蹤指令和數(shù)據(jù)。ARM9系列微處理器的主要應(yīng)用領(lǐng)域?yàn)椋簾o(wú)線網(wǎng)絡(luò)設(shè)備、PDA功能、移動(dòng)電話等多種多媒體和嵌入式應(yīng)用.ARM9系列微處理器包括如下幾種類型的核:ARM9TDMI,ARM920T,ARM940T,ARM9E-S。嵌入式數(shù)據(jù)庫(kù)什么是嵌入式數(shù)據(jù)庫(kù)通常我們采用數(shù)據(jù)庫(kù)來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)的存儲(chǔ)檢索等功能,像MySQL這類基于C/S結(jié)構(gòu)的關(guān)系型數(shù)據(jù)庫(kù)系統(tǒng)雖然代表著目前數(shù)據(jù)庫(kù)應(yīng)用的主流,卻并不能滿足所有應(yīng)用場(chǎng)合的需要。很多的應(yīng)用僅僅利用到了這些數(shù)據(jù)庫(kù)產(chǎn)品的基本特性而已。有時(shí)我們需要的可能只是一個(gè)簡(jiǎn)單的基于磁盤文件的數(shù)據(jù)庫(kù)系統(tǒng)。這樣就不必安裝龐大的數(shù)據(jù)庫(kù)服務(wù)器以簡(jiǎn)化數(shù)據(jù)庫(kù)應(yīng)用程序的設(shè)計(jì),在某些特殊應(yīng)用場(chǎng)合,比如在嵌入式系統(tǒng)中,由于系統(tǒng)的硬件軟件資源都有限,這些數(shù)據(jù)庫(kù)產(chǎn)品就明顯有一些臃腫甚至是不可實(shí)現(xiàn)的。在這些情況下嵌入式數(shù)據(jù)庫(kù)的優(yōu)勢(shì)就特別明顯了。嵌入式數(shù)據(jù)庫(kù)的名稱來(lái)自其獨(dú)特的運(yùn)行模式。這種數(shù)據(jù)庫(kù)嵌入到了應(yīng)用程序進(jìn)程中,消除了與客戶機(jī)服務(wù)器配置相關(guān)的開銷。嵌入式數(shù)據(jù)庫(kù)實(shí)際上是輕量級(jí)的,在運(yùn)行時(shí),它們需要較少的內(nèi)存。它們是使用精簡(jiǎn)代碼編寫的,對(duì)于嵌入式設(shè)備,其速度更快,效果更理想。嵌入式運(yùn)行模式允許嵌入式數(shù)據(jù)庫(kù)通過(guò)SQL來(lái)輕松管理應(yīng)用程序數(shù)據(jù),而不依靠原始的文本文件。典型嵌入式數(shù)據(jù)庫(kù)比較目前,基于嵌入式數(shù)據(jù)庫(kù)應(yīng)用的市場(chǎng)需求已經(jīng)進(jìn)入加速發(fā)展的階段,適用于嵌入式開發(fā)的嵌入式數(shù)據(jù)庫(kù)主要有mSQL、BerkeleyDB、SQLite等。(1)BerkeleyDBBerkeleyDB是一個(gè)開放源代碼的嵌入式數(shù)據(jù)庫(kù)管理系統(tǒng),為許多編程語(yǔ)言提供了實(shí)用的API接口,包括C、C++、Java、Perl、Tcl、Python和PHP等。它通過(guò)調(diào)用這些API來(lái)完成對(duì)數(shù)據(jù)的保存、查詢、修改和刪除等操作,能夠用來(lái)管理多達(dá)256TB的數(shù)據(jù),并且在許多方面的性能還能夠同商業(yè)級(jí)的數(shù)據(jù)庫(kù)系統(tǒng)相抗衡。BerkeleyDB能夠很輕松地應(yīng)付幾千個(gè)用戶同時(shí)訪問(wèn)同一個(gè)數(shù)據(jù)庫(kù)的情況。另外,由于其應(yīng)用程序和數(shù)據(jù)庫(kù)管理系統(tǒng)運(yùn)行在相同的進(jìn)程空間當(dāng)中,進(jìn)行數(shù)據(jù)操作時(shí)可以避免繁瑣的進(jìn)程間通信,因此耗費(fèi)在通信上的開銷自然也就降低到了極低程度。但是BerkeleyDB不是關(guān)系型的數(shù)據(jù)庫(kù),不能應(yīng)用標(biāo)準(zhǔn)的SQL語(yǔ)句對(duì)數(shù)據(jù)庫(kù)操作,缺少靈活性,而且學(xué)習(xí)起來(lái)有一定難度,必然會(huì)加大開發(fā)成本。(2)mSQLmSQL是一種簡(jiǎn)化的SQL數(shù)據(jù)庫(kù),體系結(jié)構(gòu)小巧,占用系統(tǒng)資源少,特別適合在嵌入式Linux系統(tǒng)中使用。同時(shí),mSQL提供專門的API函數(shù),使得用C語(yǔ)言編寫的CGI程序可以與mSQL的數(shù)據(jù)庫(kù)引擎進(jìn)行通信。但它只有30天的使用期限,并非完全的開源。(3)SQLiteSQLite是D.RichardHipp用C語(yǔ)言編寫的開源嵌入式數(shù)據(jù)庫(kù),是同類產(chǎn)品中的后起之秀,2005年獲得了開源大獎(jiǎng)。SQLite可以在所有主要的操作系統(tǒng)上運(yùn)行,并且支持大多數(shù)計(jì)算機(jī)語(yǔ)言。SQLite還非常健壯。其創(chuàng)建者保守地估計(jì)SQLite可以處理每天負(fù)擔(dān)多達(dá)100,00次點(diǎn)擊率的Web站點(diǎn),并且SQLite有時(shí)候可以處理10倍于上述數(shù)字的負(fù)載。SQLite采用單文件存放數(shù)據(jù)庫(kù),速度又比MySQL快上1~2倍,存儲(chǔ)量也不是問(wèn)題,在操作語(yǔ)句上更類似關(guān)系型數(shù)據(jù)庫(kù)的使用,使用操作非常方便。其主要的特點(diǎn):支持多數(shù)SQL92標(biāo)準(zhǔn)ACID事務(wù)支持,甚至在數(shù)據(jù)庫(kù)崩潰和恢復(fù)時(shí)也支持零配置-無(wú)需安裝和管理整個(gè)數(shù)據(jù)庫(kù)存儲(chǔ)在單個(gè)文件中支持?jǐn)?shù)據(jù)庫(kù)大小至2TB足夠小,大致3萬(wàn)行C代碼,250K二進(jìn)制目標(biāo)代碼大部分普通數(shù)據(jù)庫(kù)操比一些流行的數(shù)據(jù)庫(kù)還要快提供簡(jiǎn)單、易用、多種語(yǔ)言的API完全獨(dú)立的,不具有外部依賴性作為一款嵌入式數(shù)據(jù)庫(kù),SQLite與BerkelyDB一樣,以庫(kù)的形式提供,通過(guò)C函數(shù)直接操作數(shù)據(jù)庫(kù)文件(也支持其他的訪問(wèn)方式,比如Tcl)SQLite不是Server,所以和SQLServer等不同,它和程序運(yùn)行在同一進(jìn)程,中間沒(méi)有進(jìn)程間通信,速度很快,而且體積小巧,易于分發(fā),非常適合運(yùn)行在單機(jī)環(huán)境和嵌入式環(huán)境。與BerkelyDB相比,SQLite功能雖較BerkeleyDB略有遜色,但在開源組織的推動(dòng)下差距正在縮小。實(shí)際上,很多情況,特別是在嵌入式系統(tǒng)應(yīng)用中,并不需要存儲(chǔ)過(guò)程或復(fù)雜的表之間的關(guān)聯(lián),這時(shí)會(huì)發(fā)現(xiàn)SQLite在大小和功能之間找到了一個(gè)理想的平衡點(diǎn)。其次SQLite是關(guān)系型數(shù)據(jù)庫(kù),支持大部分SQL語(yǔ)句,這是它比BerkelyDB優(yōu)秀的地方。體積也比BDB小一倍。更重要的是,SQLiate允許自由地用于任何目的甚至包括商業(yè)應(yīng)用,故能大大降低開發(fā)成本。因此本項(xiàng)目嵌入式數(shù)據(jù)庫(kù)將采用SQLite。
嵌入式操作系統(tǒng)什么是嵌入式系統(tǒng)近年來(lái)隨著微電子技術(shù)的迅速發(fā)展,實(shí)際應(yīng)用領(lǐng)域產(chǎn)生了很大變化,各種各樣的應(yīng)用于工業(yè)設(shè)備、電子產(chǎn)品中專用的計(jì)算機(jī)大量涌現(xiàn)。這種計(jì)算機(jī)隱藏在各種產(chǎn)品和系統(tǒng)中,嵌入式計(jì)算機(jī)由此而得名。嵌入式計(jì)算機(jī)系統(tǒng)正式定義為以應(yīng)用為中心,軟硬件可裁減的,適應(yīng)應(yīng)用系統(tǒng)對(duì)功能、可靠性、成本、體積、功耗等綜合性嚴(yán)格要求的專用計(jì)算機(jī)系統(tǒng)。嵌入式系統(tǒng)主要由嵌入式處理器、相關(guān)支撐硬件、嵌入式操作系統(tǒng)和應(yīng)用軟件等組成。 嵌入式系統(tǒng)是面向用戶、面向產(chǎn)品、面向應(yīng)用的,是針對(duì)具體應(yīng)用的專用系統(tǒng)。它的硬件和軟件都必須高效率地設(shè)計(jì)、量體裁衣去除冗余、力爭(zhēng)在同樣的硅片面積上實(shí)現(xiàn)更高的性能。經(jīng)典嵌入式系統(tǒng)的比較嵌入式操作系統(tǒng)EOS(EmbeddedOperatingSystem)是一種用途廣泛的系統(tǒng)軟件,EOS負(fù)責(zé)嵌入系統(tǒng)的全部軟、硬件資源的分配、調(diào)度作業(yè),控制、協(xié)調(diào)并發(fā)活動(dòng);它必須體現(xiàn)其所在系統(tǒng)的特征,能夠通過(guò)裝卸某些模塊來(lái)達(dá)到系統(tǒng)所要求的功能。以下對(duì)比了幾種最常用的嵌入式操作系統(tǒng)。WindowsCEWindowsCE是微軟開發(fā)的一個(gè)開放的、可升級(jí)的32位嵌入式操作系統(tǒng),是基于掌上型電腦類的電子設(shè)備操作。它是精簡(jiǎn)的Windows95。WindowsCE的圖形用戶界面相當(dāng)出色。它的設(shè)計(jì)目標(biāo)是:模塊化及可伸縮性、實(shí)時(shí)性能好,通信能力強(qiáng)大,支持多種CPU。它不僅繼承了傳統(tǒng)的Windows圖形界面,并且在WindowsCE平臺(tái)上可以使用Windows95/98上的編程工具(如VisualBasic、VisualC++等)、使用同樣的函數(shù)、使用同樣的界面網(wǎng)格,使絕大多數(shù)的應(yīng)用軟件只需簡(jiǎn)單的修改和移植就可以在WindowsCE平臺(tái)上繼續(xù)使用。PalmOS這是一種32位的嵌入式操作系統(tǒng),主要運(yùn)用于移動(dòng)終端上。此系統(tǒng)最初由3Com公司的PalmComputing部開發(fā),目前PalmComputing已經(jīng)獨(dú)立成一家公司。PalmOS與同步軟件HotSync結(jié)合可以使移動(dòng)終端與電腦上的信息實(shí)現(xiàn)同步,把臺(tái)式機(jī)的功能擴(kuò)展到了移動(dòng)設(shè)備上。它更傾向于PDA的操作系統(tǒng),在PDA市場(chǎng)占有主導(dǎo)地位。在編寫程序時(shí),PalmOS充分考慮了掌上電腦內(nèi)存相對(duì)較小的情況,因此它只占有非常小的內(nèi)存。由于基于PalmOS編寫的應(yīng)用程序占用的空間也非常?。ㄍǔV挥袔资甂B),所以,基于PalmOS的掌上電腦(雖然只有幾MB的RAM)可以運(yùn)行眾多應(yīng)用程序。LinuxLinux是一個(gè)類似于Unix的操作系統(tǒng)。它起源于芬蘭一個(gè)名為L(zhǎng)inusTorvalds的業(yè)余愛(ài)好,但是現(xiàn)在已經(jīng)是最為流行的一款開放源代碼的操作系統(tǒng)。Linux從1991年問(wèn)世到現(xiàn)在,短短10年的時(shí)間內(nèi)已發(fā)展成為一個(gè)功能強(qiáng)大、設(shè)計(jì)完善的操作系統(tǒng),伴隨網(wǎng)絡(luò)技術(shù)進(jìn)步而發(fā)展起來(lái)的LinuxOS已成為Microsoft公司的DOS和Windows95/98的強(qiáng)勁對(duì)手。Linux系統(tǒng)不僅能夠運(yùn)行于PC平臺(tái),還在嵌入式系統(tǒng)方面大放光芒,在各種嵌入式LinuxOS迅速發(fā)展的狀況下,LinuxOS逐漸形成了可與WindowsCE等EOS進(jìn)行抗衡的局面。目前正在開發(fā)的嵌入式系統(tǒng)中,49%的項(xiàng)目選擇Linux作為嵌入式操作系統(tǒng)。Linux現(xiàn)已成為嵌入式操作的理想選擇。嵌入式Linux操作系統(tǒng)與WindowsCE相比的優(yōu)點(diǎn):第一,Linux是開放源代碼的,不在存黑箱技術(shù),遍布全球的眾多Linux愛(ài)好者都是Linux開發(fā)者的強(qiáng)大技術(shù)支持者;而WindowsCE是非開放性O(shè)S,使第三方很難實(shí)現(xiàn)產(chǎn)品定制。第二,Linux的源代碼隨處可得,注釋豐富,文檔齊全,易于解決各種問(wèn)題。第三,Linux的內(nèi)核小、效率高;而WindowsCE在這方面是笨拙的,占用過(guò)多的RAM,應(yīng)用程序龐大。第四,Linux是開放源代碼的OS,在價(jià)格上極具競(jìng)爭(zhēng)力,適合中國(guó)國(guó)情。WindowsCE的版權(quán)費(fèi)用是廠家不得不考慮的因素。第五,Linux不僅支持x86芯片,還是一個(gè)跨平臺(tái)的系統(tǒng),移植容易實(shí)現(xiàn)。第六,Linux內(nèi)核的結(jié)構(gòu)在網(wǎng)絡(luò)方面是非常完整的,它提供了對(duì)包括十兆位、百兆位及千兆位的以太網(wǎng)絡(luò),還有無(wú)線網(wǎng)絡(luò)、Tokenring(令牌環(huán))和光纖甚至衛(wèi)星的支持。第七,Linux的內(nèi)核結(jié)構(gòu)是高度可裁減的,WindowsCE在內(nèi)核結(jié)構(gòu)的設(shè)計(jì)中并未考慮適應(yīng)系統(tǒng)的高度可裁減性的要求。PalmOS、WindowsCE、Linux這三種嵌入式操作系統(tǒng)各有不同的特點(diǎn),不同的用途;但Linux比PalmOS和WindowsCE更小、更穩(wěn)定,而且Linux是開放的OS,在價(jià)格上極具競(jìng)爭(zhēng)力。當(dāng)然嵌入式linux操作系統(tǒng)也有其明顯不足的地方:第一,是開發(fā)難度較高,需要很高的技術(shù)實(shí)力;第二,是核心調(diào)試工具不全,調(diào)試不太方便,尚沒(méi)有很好的用戶圖形界面。Qt開發(fā)語(yǔ)言Qt是一個(gè)多平臺(tái)的C++圖形用戶界面應(yīng)用程序框架。它提供給應(yīng)用程序開發(fā)者建立藝術(shù)級(jí)的圖形用戶界面所需的所用功能。Qt是完全面向?qū)ο蟮暮苋菀讛U(kuò)展,并且允許真正地組件編程。自從1996年早些時(shí)候,Qt進(jìn)入商業(yè)領(lǐng)域,它已經(jīng)成為全世界范圍內(nèi)數(shù)千種成功的應(yīng)用程序的基礎(chǔ)。Qt也是流行的Linux桌面環(huán)境KDE的基礎(chǔ),KDE是所有主要的Linux發(fā)行版的一個(gè)標(biāo)準(zhǔn)組件。Qt支持所有Unix系統(tǒng),當(dāng)然也包括Linux,還支持Windows平臺(tái)。支持下述平臺(tái):MS/Windows-95、98、NT4.0、ME、和2000Unix/X11-Linux、SunSolaris、HP-UX、CompaqTru64UNIX、IBMAIX、SGIIRIX和其它很多X11平臺(tái)Macintosh-MacOSXEmbedded-有幀緩沖(framebuffer)支持的Linux平臺(tái)。Qt
具有下列優(yōu)點(diǎn):優(yōu)良的跨平臺(tái)特性:Qt支持下列操作系統(tǒng):MicrosoftWindows95/98,MicrosoftWindowsNT,Linux,Solaris,SunOS,HP-UX,DigitalUNIX(OSF/1,Tru64),Irix,F(xiàn)reeBSD,BSD/OS,SCO,AIX,OS390,QNX等等。面向?qū)ο驫t的良好封裝機(jī)制使得Qt的模塊化程度非常高,可重用性較好,對(duì)于用戶開發(fā)來(lái)說(shuō)是非常方便的。Qt提供了一種稱為signals/slots的安全類型來(lái)替代callback,這使得各個(gè)元件之間的協(xié)同工作變得十分簡(jiǎn)單。豐富的APIQt包括多達(dá)250個(gè)以上的C++類,還替供基于模板的collections,serialization,file,I/Odevice,directorymanagement,date/time類。甚至還包括正則表達(dá)式的處理功能。支持2D/3D圖形渲染,支持OpenGL大量的開發(fā)文檔XML支持Qt把下面這些特性添加到了C++當(dāng)中:一種關(guān)于無(wú)縫對(duì)象通訊被稱為信號(hào)和槽的非常強(qiáng)大的機(jī)制,可查詢和可設(shè)計(jì)的屬性,強(qiáng)大的事件和事件過(guò)濾器,根據(jù)上下文進(jìn)行國(guó)際化的字符串翻譯,完善的時(shí)間間隔驅(qū)動(dòng)的計(jì)時(shí)器使得在一個(gè)事件驅(qū)動(dòng)的圖形界面程序中很好地集成許多任務(wù)成為可能。以一種自然的方式組織對(duì)象所有權(quán)的分層次和可查詢的對(duì)象樹。被守護(hù)的指針,QGuardedPtr,當(dāng)參考對(duì)象被破壞時(shí),可以自動(dòng)地設(shè)置為無(wú)效,不像正常的C++指針在它們的對(duì)象被破壞的時(shí)候變成了“搖擺指針”。Qt的授權(quán)是分為兩條線,商業(yè)版和開源版。如果使用商業(yè)版的Qt,那么開發(fā)出的程序可以是私有的和商業(yè)的;如果使用的是開源版的Qt,由于其使用的是GPL協(xié)議(不是LGPL),那么可發(fā)出的程序也必須是GPL的。Qt自由版是Qt僅僅為了開發(fā)自由和開放源碼軟件
提供的Unix/X11版本。在Q公共許可證和GNU通用公共許可證
下,它是免費(fèi)的。Qt/嵌入式自由版是Qt為了開發(fā)自由軟件提供的嵌入式版本。在GNU通用公共許可證下,它是免費(fèi)的。
Qt-embedded和Qtopia:Qt在剛出現(xiàn)的時(shí)候,對(duì)于Linux和Unix系統(tǒng),只有構(gòu)建于Xlib之上的X11版。但隨著Linux操作系統(tǒng)在嵌入式領(lǐng)域的應(yīng)用日漸廣泛,Qt推出了嵌入式的版本Qt-embedded(Qte)。由于嵌入式受限的硬件環(huán)境往往難以運(yùn)行龐大的X服務(wù)器,Qt的嵌入式版跳過(guò)了Xlib和XServer直接操作幀緩沖,可以在速度和體積上有很大的提高。Qtopia最初是上的一個(gè)開源項(xiàng)目,全稱是QtPalmtopEnvironment,是構(gòu)建于Qte之上一個(gè)類似桌面系統(tǒng)的應(yīng)用環(huán)境,包括了PDA和手機(jī)等掌上系統(tǒng)常見(jiàn)的功能如電話簿、日程表等。現(xiàn)在Qtopia已經(jīng)成為了Trolltech的又一個(gè)主打產(chǎn)品,為基于Linux操作系統(tǒng)的PDA和手機(jī)提供了一個(gè)完整的圖形環(huán)境。值得特別注意的是Qte和Qtopia之間的關(guān)系。在版本4之前,Qte和Qtopia是不同的兩套程序,Qte是基礎(chǔ)類庫(kù),Qtopia是構(gòu)建于Qte之上的一系列應(yīng)用程序。但從版本4開始,Trolltech將Qte并入了Qtopia,并推出了新的Qtopia4。在該版中,原來(lái)的Qte被稱為QtopiaCore,作為嵌入式版本的核心,既可以與Qtopia配合,也可以獨(dú)立使用。原來(lái)的Qtopia則被分成幾層,核心的應(yīng)用框架和插件系統(tǒng)被稱為QtopiaPlatform,上層的應(yīng)用程序則按照不同的目標(biāo)用戶分為不同的包,如QtopaiPDA,QtopiaPhone。定義界面:直接和用戶交互的軟件結(jié)構(gòu)。內(nèi)核:完成核心功能的,與界面無(wú)關(guān)的軟件結(jié)構(gòu)。硬件:嵌入式系統(tǒng)中各種設(shè)備的總稱。嵌入式系統(tǒng):根據(jù)IEEE(國(guó)際電機(jī)工程師協(xié)會(huì))的定義,嵌入式系統(tǒng)是“控制、監(jiān)視或者輔助裝置、機(jī)器和設(shè)備運(yùn)行的裝置”(原文為devicesusedtocontrol,monitor,orassisttheoperationofequipment,machineryorplants)。國(guó)內(nèi)一個(gè)普遍被認(rèn)同的定義是:以應(yīng)用為中心、以計(jì)算機(jī)技術(shù)為基礎(chǔ)、軟件硬件可裁剪、適應(yīng)應(yīng)用系統(tǒng)對(duì)功能、可靠性、成本、體積、功耗嚴(yán)格要求的專用計(jì)算機(jī)系統(tǒng)。Qt:Qt是一個(gè)多平臺(tái)的C++圖形用戶界面應(yīng)用程序框架。SQLite:SQLite是D.RichardHipp用C語(yǔ)言編寫的開源嵌入式數(shù)據(jù)庫(kù)。系統(tǒng)需求分析功能需求建筑定位:地圖上標(biāo)示廣州主要建筑的位置,實(shí)現(xiàn)主要建筑搜索功能,顯示與建筑相關(guān)信息(簡(jiǎn)介、歷史、用途;所在區(qū)、街道、公交地鐵情況),顯示附近主要建筑情況(包括附近銀行、停車場(chǎng))。交通定位(公交;客運(yùn)站;碼頭;地鐵;火車站):公交:查詢各路車的行車路線,同時(shí)顯示行車路線的站點(diǎn)。點(diǎn)擊站點(diǎn),能在地圖上標(biāo)出該站點(diǎn)的位置,并顯示該站點(diǎn)的附近建筑情況;地鐵:地鐵經(jīng)過(guò)的各路線,地鐵各出口,附近建筑??瓦\(yùn)站:顯示該客運(yùn)到省內(nèi)外的線路;碼頭:顯示航班信息;火車站:顯示該火車站到省內(nèi)外的線路。道路定位:在地圖上標(biāo)示出該道路。酒店餐飲定位:地圖上標(biāo)示酒店店餐的位置,顯示附近主要建筑情況,提供該目標(biāo)的聯(lián)系方式、服務(wù)性質(zhì)等信息。二級(jí)地圖的顯示:校園、公園等都有相關(guān)建筑分布地圖,系統(tǒng)能顯示其相關(guān)建筑分布地圖,即二級(jí)地圖。地圖的縮放:放大和縮小地圖。聲音提示功能:能報(bào)讀出查詢的主要建筑的名稱。計(jì)算查詢所需時(shí)間:顯示一次查詢所用的時(shí)間。開發(fā)環(huán)境硬件平臺(tái)pc機(jī) CPUinterP3賽揚(yáng)1G內(nèi)存128+64Mpc機(jī) CPUAthlon3000+1.8G內(nèi)存1G嵌入式開發(fā)板 EmbestS3CEB2410(arm9)開發(fā)板+仿真器軟件開發(fā)平臺(tái)操作系:LinuxFedoraCore6,LinuxRedhat9.0WindowsXP,Windows2000工具:EmbestIDECygwinArm-Linux-gcc-2.95.3linux-2.4.18qtopia-free-1.7.0qt-embedded-2.3.7開發(fā)語(yǔ)言CC++Qt/Embedded運(yùn)行環(huán)境嵌入式機(jī)器+Linux操作系統(tǒng)(包含手機(jī)、MP4等)PC機(jī)+Linux操作系統(tǒng)性能需求時(shí)間特性要求系統(tǒng)穩(wěn)定,算法效率高,對(duì)用戶的操作實(shí)時(shí)響應(yīng)??傮w設(shè)計(jì)基本設(shè)計(jì)概念和處理流程系統(tǒng)數(shù)據(jù)流圖:0層數(shù)據(jù)流圖1層數(shù)據(jù)流圖系統(tǒng)GUI編程設(shè)計(jì)地圖移動(dòng)開始狀態(tài)開始的時(shí)候,地圖轉(zhuǎn)載圖片的狀態(tài)。在(圖一)中,圖片處理模塊用于處理圖片的顯示、移動(dòng)、隱藏。紫色區(qū)域?yàn)?×5個(gè)圖片處理模塊,每個(gè)圖片處理模塊存放有地圖圖片。而這5×5個(gè)圖片處理模塊用一個(gè)數(shù)組存放著,這數(shù)組用圖(二)表示。淺藍(lán)色區(qū)域?yàn)榈貓D顯示區(qū),顯示地圖給用戶。在圖(二)中,這表示一個(gè)5×5的數(shù)組,用于存放圖片處理模塊。白色部分存放著中心地圖,淺藍(lán)色表示中心地圖的左邊部分,綠色表示中心地圖的右邊部分。一開始填充5×5幅圖片到有5×5個(gè)圖片處理模塊的數(shù)組上,而用戶只能看到地圖顯示區(qū)里面的圖片。片段代碼:變量說(shuō)明:centermapnum//當(dāng)前中心地圖的編號(hào)MapImage//預(yù)先定義好的用于存放圖片數(shù)據(jù)的數(shù)組指針m_PictureItem//預(yù)先定義的圖片處理模塊數(shù)組(5×5)m_banck//存儲(chǔ)一幅白色圖片m_ImageWidth//圖片的寬度m_ImageHeight//圖片的高度canvas//畫布m_vertical//保存中心地圖在5×5個(gè)圖片處理模塊數(shù)組的行m_horizontal//保存中心地圖在5×5個(gè)圖片處理模塊數(shù)組的列函數(shù)說(shuō)明:inttoQString//將整型轉(zhuǎn)化為Qstring(qt的字符串類)Qstringtoint//將Qstring轉(zhuǎn)化為整型setPicture//重新設(shè)置圖片處理模塊的圖片setName//重新設(shè)置圖片處理模塊的名字Qimage//qt內(nèi)庫(kù)里面的圖片類Move//移動(dòng)圖片處理模塊setZ//設(shè)置深度show//顯示裝載圖片源代碼: for(inti=0;i<5;i++) for(intj=0;j<5;j++) { QStringtemp; temp=inttoQString(centermapnum+(i-2)*100+(j-2));/*根據(jù)中心地圖編號(hào),計(jì)算出相應(yīng)位置應(yīng)該存放哪張地圖圖片.*/ temp=path+temp;//得到地圖圖片的絕對(duì)路徑MapImage[i][j]=newQImage(temp);//裝載圖片if(MapImage[i][j]->isNull())//判斷是否存在這幅地圖{deleteMapImage[i][j];//刪除申請(qǐng)的空間MapImage[i][j]=&m_banck;//賦值為白色圖片} }圖片映射到圖片處理模塊源代碼:intcentermapx=(canvas->width()-m_ImageWidth)/2;//計(jì)算中心地圖的x的位置intcentermapy=(canvas->height()-m_ImageHeight)/2;//計(jì)算中心地圖的y的位置 m_vertical=2;//行 m_horizontal=2;//列for(inti=0;i<5;i++) for(intj=0;j<5;j++) { intcentermapnum=QStringtoint(m_CenterMap);//轉(zhuǎn)化為中心地圖編號(hào)QStringtemp; temp=inttoQString(centermapnum+(i-2)*100+(j-2));//計(jì)算相應(yīng)圖片的編號(hào)m_PictureItem[i][j].setPicture(MapImage[i][j]);//設(shè)置圖片 m_PictureItem[i][j].setName(temp);//把相應(yīng)圖片的編號(hào)設(shè)置為該圖片處理模塊的名字m_PictureItem[i][j].move(m_ImageWidth*(j-2)+centermapx,m_ImageHeight*(i-2)+centermapy);//設(shè)置該圖片處理模塊在畫布的相應(yīng)位置 m_PictureItem[i][j].setZ(60);//設(shè)置深度 m_PictureItem[i][j].show();//顯示}上下左右移動(dòng)上圖表示地圖向左平移時(shí)的示意圖①地圖向左移動(dòng),即所有的圖片處理模塊向右移動(dòng)②最右邊的圖片處理模塊重新裝載圖片③重新裝載圖片后的圖片處理模塊移動(dòng)到最左邊經(jīng)過(guò)向左移動(dòng)之后,只有5個(gè)圖片處理模塊在改變圖片數(shù)據(jù),其他的保持原狀。上面兩幅圖是圖片處理模塊數(shù)組移動(dòng)的前后狀態(tài)示意圖。上面兩幅圖中,表示同一個(gè)5×5的數(shù)組,用于存放圖片處理模塊。白色部分存放著中心地圖,淺藍(lán)色代表以中心地圖為中心的左邊部分,綠色表示以中心地圖為中心的右邊部分。片段代碼:變量說(shuō)明:m_vertical//保存中心地圖在5×5個(gè)圖片處理模塊數(shù)組的列m_horizontal//保存中心地圖在5×5個(gè)圖片處理模塊數(shù)組的行centermapnum//當(dāng)前中心地圖的編號(hào)verticalNum//以中心地圖的位置為基礎(chǔ)計(jì)算最頂端的行MapImage//預(yù)先定義好的用于存放圖片數(shù)據(jù)的數(shù)組指針m_PictureItem//預(yù)先定義的圖片處理模塊數(shù)組(5×5)m_banck//存儲(chǔ)一幅白色圖片m_ImageWidth//圖片的寬度函數(shù)說(shuō)明:inttoQString//將整型轉(zhuǎn)化為Qstring(qt的字符串類)Qstringtoint//將Qstring轉(zhuǎn)化為整型setPicture//重新設(shè)置圖片處理模塊的圖片setName//重新設(shè)置圖片處理模塊的名字Qimage//qt內(nèi)庫(kù)里面的圖片類Move//移動(dòng)圖片處理模塊show//顯示Qrect//qt內(nèi)庫(kù)里面的區(qū)域類圖片處理模塊向左移動(dòng)的源代碼:inthorizontalMoveNum=(m_horizontal+5+2)%5;/*以中心地圖的位置為基礎(chǔ)計(jì)算要重新裝載圖片的圖片處理模塊數(shù)組的列*/intverticalNum=(m_vertical+5-2-1)%5;/*以中心地圖的位置為基礎(chǔ)計(jì)算最頂端的行*/intcentermapnum=QStringtoint(m_CenterMap);//計(jì)算中心地圖的編號(hào)for(inti=0;i<5;i++){verticalNum=(verticalNum+1)%5;//計(jì)算列,從頂端開始 QStringtemp; temp=inttoQString(centermapnum+(i-2)*100-3);//相應(yīng)的地圖編號(hào) if(MapImage[verticalNum][horizontalMoveNum]!=&m_banck)//判斷是否白色圖片 deleteMapImage[verticalNum][horizontalMoveNum]; MapImage[verticalNum][horizontalMoveNum]=newQImage(path+temp);//裝載圖片 if(MapImage[verticalNum][horizontalMoveNum]->isNull())//判斷是否存在這圖片 { deleteMapImage[verticalNum][horizontalMoveNum]; MapImage[verticalNum][horizontalMoveNum]=&m_banck;//白色圖片 } QRectrect; rect=m_PictureItem[verticalNum][horizontalMoveNum].rect();//要移動(dòng)模塊的原來(lái)位置m_PictureItem[verticalNum][horizontalMoveNum].setPicture(MapImage[verticalNum][horizontalMoveNum]);//圖片處理模塊重新設(shè)置片m_PictureItem[verticalNum][horizontalMoveNum].move(rect.x()-m_ImageWidth*5,rect.y());//移動(dòng)到新的位置 m_PictureItem[verticalNum][horizontalMoveNum].show();//顯示 m_PictureItem[verticalNum][horizontalMoveNum].setName(temp);//重新設(shè)置名字 } m_CenterMap=inttoQString(centermapnum-1);//改變中心地圖的編號(hào) m_horizontal=(m_horizontal+5-1)%5;//改變中心地圖在5×5個(gè)圖片處理模塊數(shù)組的行 向右平移地圖的原理同上。上下移動(dòng)①地圖向上移動(dòng),即所有的圖片處理模塊向下移動(dòng)②最下邊的圖片處理模塊重新裝載圖片③重新裝載圖片后的圖片處理模塊移動(dòng)到最上邊經(jīng)過(guò)向上移動(dòng)之后,只有5個(gè)圖片處理模塊在改變圖片數(shù)據(jù),其他的保持原狀。上面兩幅圖中,表示同一個(gè)5×5的數(shù)組,用于存放圖片處理模塊。白色部分存放著中心地圖,淺藍(lán)色代表以中心地圖為中心的上邊部分,綠色表示以中心地圖為中心的下邊部分。片段代碼:變量說(shuō)明:m_vertical//保存中心地圖在5×5個(gè)圖片處理模塊數(shù)組的列m_horizontal//保存中心地圖在5×5個(gè)圖片處理模塊數(shù)組的行centermapnum//當(dāng)前中心地圖的編號(hào)horizontalNum//以中心地圖的位置為基礎(chǔ)計(jì)算最頂端的行MapImage//預(yù)先定義好的用于存放圖片數(shù)據(jù)的數(shù)組指針m_PictureItem//預(yù)先定義的圖片處理模塊數(shù)組(5×5)m_banck//存儲(chǔ)一幅白色圖片m_ImageHeight//圖片的寬度函數(shù)說(shuō)明:inttoQString//將整型轉(zhuǎn)化為Qstring(qt的字符串類)Qstringtoint//將Qstring轉(zhuǎn)化為整型setPicture//重新設(shè)置圖片處理模塊的圖片setName//重新設(shè)置圖片處理模塊的名字Qimage//qt內(nèi)庫(kù)里面的圖片類Move//移動(dòng)圖片處理模塊show//顯示Qrect//qt內(nèi)庫(kù)里面的區(qū)域類圖片處理模塊向上移動(dòng)的源代碼:intverticalMoveNum=(m_vertical+5+2)%5;/*以中心地圖的位置為基礎(chǔ)計(jì)算要重新裝載圖片的圖片處理模塊數(shù)組的行*/inthorizontalNum=(m_horizontal+5-2-1)%5;/*以中心地圖的位置為基礎(chǔ)計(jì)算最頂端的行*/intcentermapnum=QStringtoint(m_CenterMap);//計(jì)算中心地圖的編號(hào)for(inti=0;i<5;i++){horizontalNum=(horizontalNum+1)%5;//計(jì)算行,從頂端開始 QStringtemp; temp=inttoQString(centermapnum-300+i-2);//相應(yīng)的地圖編號(hào) if(MapImage[verticalMoveNum][horizontalNum]!=&m_banck)//判斷是否白色圖片 deleteMapImage[verticalMoveNum][horizontalNum]; MapImage[verticalMoveNum][horizontalNum]=newQImage(path+temp);//裝載圖片 if(MapImage[verticalMoveNum][horizontalNum]->isNull())//判斷是否存在這圖片 { deleteMapImage[verticalMoveNum][horizontalNum]; MapImage[verticalMoveNum][horizontalNum]=&m_banck;//白色圖片 } QRectrect; rect=m_PictureItem[verticalMoveNum][horizontalNum].rect();//要移動(dòng)模塊的原來(lái)位置m_PictureItem[verticalMoveNum][horizontalNum].setPicture(MapImage[verticalMoveNum][horizontalNum]);//圖片處理模塊重新設(shè)置片m_PictureItem[verticalMoveNum][horizontalNum].move(rect.x(),rect.y()-m_ImageHeight*5);//移動(dòng)到新的位置 m_PictureItem[verticalMoveNum][horizontalNum].show();//顯示 m_PictureItem[verticalMoveNum][horizontalNum].setName(temp);//重新設(shè)置名字 } m_CenterMap=inttoQString(centermapnum-1);//改變中心地圖的編號(hào) m_vertical=(m_vertical+5-1)%5;//改變中心地圖在5×5個(gè)圖片處理模塊數(shù)組的行向下平移地圖的原理同上。圖片裝載“數(shù)字城市查詢系統(tǒng)”利用qt所提供的畫布模塊實(shí)現(xiàn)地圖的顯示與移動(dòng)。畫布模塊使用文檔/視圖模型。QCanvasView類是被用來(lái)顯示畫布的特定視圖。多視圖能同時(shí)在同一畫布中顯示。畫布可以有任意數(shù)量的QCanvasItems,而qt為我們提供了以下的幾個(gè)項(xiàng)目:QCanvasItem--所有畫布項(xiàng)的抽象基類。QCanvasEllipse--橢圓或者“餅的部分”。QCanvasLine--線條。QCanvasPolygon--多邊形。QCanvasPolygonalItem--非矩形形狀的基類。大多數(shù)畫布項(xiàng)都派生于此類。QCanvasRectangle--矩形。此類矩形不能被傾斜或旋轉(zhuǎn)。繪制可旋轉(zhuǎn)的矩形使用QCanvasPolygon。QCanvasSpline--多重貝塞爾曲線。QCanvasSprite--活動(dòng)的圖片。QCanvasText--文本字符串。然而“數(shù)字城市查詢系統(tǒng)”利用了QCanvasRectangle項(xiàng)作為裝載圖片的基類。裝載圖片類的頭文件:#ifndefCPICTUREITEM_H_#defineCPICTUREITEM_H_#include<qcanvas.h>#include<qimage.h>#include<qpainter.h>classCPictureItem:publicQcanvasRectangle//以QcanvasRectangle為基類,{public:CPictureItem(QString&filename,QCanvas*canvas);//構(gòu)造函數(shù),filename為圖片文件名,canvas為畫布。voidsetPicture(QString&filename);//設(shè)置圖片的文件名voidsetName(QString&filename){name=filename;}//設(shè)置該項(xiàng)的名字voidgetName(QString&filename){filename=name;}//獲取該項(xiàng)的名字protected:voiddrawShape(QPainter&);//畫圖private:QStringname;QImage*m_pimage;QPixmapm_pixmap;};#endif源文件:#include<qimage.h>#include<qpainter.h>#include"pictureitem.h"CPictureItem::CPictureItem(QString&filename,QCanvas*canvas)//構(gòu)造函數(shù):QCanvasRectangle(canvas){m_pimage=newQImage(filename,"PNG");//加載圖片this->setSize(m_pimage->width(),m_pimage->height());//設(shè)置矩形的大小}voidCPictureItem::setPicture(QString&filename)//重新裝載圖片{deletem_pimage;//刪除原來(lái)的圖片m_pimage=newQImage(filename,"PNG");//裝載新圖片if(m_pimage->isNull())//判斷是否裝載成功,或是否有該圖片{m_pimage=newQImage("banck.png","PNG");//無(wú)則裝載一幅白色的圖片}}voidCPictureItem::drawShape(QPainter&p)//畫圖{p.drawPixmap(int(x()),int(y()),m_pixmap);}畫布“數(shù)字城市查詢系統(tǒng)”利用畫布進(jìn)行地圖的顯示,通過(guò)繼承QcanvasView畫布視圖,制作出符合“數(shù)字城市查詢系統(tǒng)”的畫布。畫布的頭文件:#ifndefCMAPVIEW_H_#defineCMAPVIEW_H_#include<qcanvas.h>#include<qimage.h>#include"pictureitem.h"classCMapView:publicQCanvasView{Q_OBJECTpublic:CMapView(QCanvas*,QWidget*parent=0,constchar*name=0,WFlagsf=0); ~CMapView();voidclear();voiddown();//地圖向下滾動(dòng)時(shí),圖片項(xiàng)目向上移動(dòng) voidup();//地圖向上滾動(dòng)時(shí),圖片項(xiàng)目向下移動(dòng) voidleft(); voidright(); intQStringtoint(QStringMapName);QStringinttoQString(intnum); voidLoadImage(QStringCenterMap); voidresetItemPosition(); voidShowTheArrowhead(QString&map,intx,inty,QString&text,boolflag);//顯示箭頭 voidSplitTheName(int&mapnum,int&horizontal,int&vertical);//拆分地圖名字 voidLine(QString&map1,intx1,inty1,QString&map2,intx2,inty2);//兩點(diǎn)之間畫線 voidmapMove(intx,inty);//移動(dòng)地圖 voidcentermap_zb(QPoint&point);//中心地圖左上角的位置 voidhit(QString&mapname,QPoint&p);//返回地圖中心的地圖和相對(duì)坐標(biāo) voidmovetocenter(intx,inty);//將中心地圖的指定點(diǎn)移到中心點(diǎn) voidAllMaphide();//隱藏地圖 voidAllMapshow();//顯示地圖 voidzoo_move(intx,inty);//公園導(dǎo)航圖的移動(dòng) voidgo_zoo(QString&map);//公園導(dǎo)航圖裝載 voidleave_zoo();//離開公園導(dǎo)航 voidloadpic_last();//多線程調(diào)用,完成剩下的圖片載人 public:intgetleftborder(){returnleftborder;}intgetrightborder(){returnrightborder;}intgettopborder(){returntopborder;}intgetdownborder(){returndownborder;}intgetlefttotal(){returnlefttotal;}intgetrighttotal(){returnrighttotal;}intgettoptotal(){returntoptotal;}intgetdowntotal(){returndowntotal;}intgetimagewidth(){returnm_ImageWidth;}intgetimageheight(){returnm_ImageHeight;}intgetHorizontalValue(){returnm_horizontal;}intgetVerticalValue(){returnm_vertical;}QStringgetCenterMap(){returnm_CenterMap;}int*getmapcount(){returnmapcount;}protected:voidcontentsMousePressEvent(QMouseEvent*event);voidcontentsMouseReleaseEvent(QMouseEvent*event);voidmymoveevent();voidMoveAllItem(doublecurrent_x,doublecurrent_y);booliszoo_map;signals:voidstatus(constQString&);private:QCanvasItem*moving;QPointmoving_start; QPointmoving_end; QStringm_CenterMap;//中心小地圖的文件名 intm_horizontal;//橫 intm_vertical;//豎 CPictureItem*m_pPictureItem[5][5]; CPictureItem*m_zoo_map; CPictureItem*m_jt; intm_horizontalcounter;//標(biāo)記左右移動(dòng) intm_verticalcounter;//標(biāo)記上下移動(dòng) intm_ImageWidth; intm_ImageHeight; intleftborder,rightborder,topborder,downborder;//邊界值 intlefttotal,righttotal,toptotal,downtotal;//移動(dòng)累加(控制邊界躍出) inthorizontal,vertical;//邊界控制 intmapcount[10];//各層地圖的小地圖個(gè)數(shù)(行,列) QStringpath;//地圖路徑 intm_canvas_width;//canvas的寬 intm_canvas_height;//canvas的高 QCanvas*canvas;};#endif部分源代碼:voidCMapView::contentsMousePressEvent(QMouseEvent*event)//視圖,鼠標(biāo)按下事件{if(event->button()==LeftButton){ moving_start=event->pos();//保存當(dāng)前位置}}voidCMapView::clear()//清除所有項(xiàng)目{QCanvasItemListlist=canvas->allItems();//提取畫布的所有項(xiàng)目到QCanvasItemListQCanvasItemList::Iteratorcurrent=list.begin();//第一個(gè)項(xiàng)目for(;current!=list.end();++current)//歷遍所有的項(xiàng)目{ if(*current) { moving=(QCanvasItem*)(*current); doublez=moving->z(); if(z==70) moving->hide();//隱藏 if(z>=80) delete*current;//刪除項(xiàng)目 }}}voidCMapView::MoveAllItem(doublecurrent_x,doublecurrent_y)//應(yīng)動(dòng)所有的項(xiàng){QCanvasItemListlist=canvas->allItems();//提取畫布的所有項(xiàng)目到QCanvasItemL
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024芒果種植基地?zé)o人機(jī)噴灑農(nóng)藥服務(wù)合同3篇
- 儀器設(shè)備采購(gòu)合同5篇
- 經(jīng)濟(jì)法關(guān)于大學(xué)生就業(yè)維權(quán)方面
- 贊助合同模板(5篇)
- 山東特殊教育職業(yè)學(xué)院《醫(yī)學(xué)基本技能》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年度政府投資項(xiàng)目財(cái)務(wù)監(jiān)管代理合同3篇
- 鐘山職業(yè)技術(shù)學(xué)院《商務(wù)英語(yǔ)視聽說(shuō)(4)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年礦山石料直供采購(gòu)協(xié)議綱要版B版
- 2025年度新疆棉花采摘機(jī)械化作業(yè)合同范本3篇
- 南京師范大學(xué)泰州學(xué)院《口腔臨床醫(yī)學(xué)概論(口腔修復(fù)學(xué))》2023-2024學(xué)年第一學(xué)期期末試卷
- 職業(yè)暴露處理方法與報(bào)告流程圖
- 蘇教版一年級(jí)上冊(cè)《科學(xué)》期末知識(shí)點(diǎn)匯總 重點(diǎn)知識(shí)梳理 總復(fù)習(xí)【版 】課件
- 青島版小學(xué)科學(xué)三年級(jí)下冊(cè)課程綱要
- 目標(biāo)、計(jì)劃與行動(dòng)課件
- 動(dòng)態(tài)變形模量Evd試驗(yàn)記錄
- 2020-2021學(xué)年浙江省溫州市八年級(jí)(上)期末數(shù)學(xué)試卷(附答案詳解)
- 蔬菜籽種采購(gòu)清單
- 工期定額-民用建筑
- 低壓電能表安裝作業(yè)指導(dǎo)書
- 能見(jiàn)度不良時(shí)船舶航行須知
- 軟膠囊的制備
評(píng)論
0/150
提交評(píng)論