2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩39頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、<p><b>  課程設(shè)計(jì)說明書</b></p><p>  課程設(shè)計(jì)名稱: 嵌入式系統(tǒng)課程設(shè)計(jì) </p><p>  課程設(shè)計(jì)題目: 音樂播放器 </p><p>  學(xué) 院 名 稱: 信息工程學(xué)院 </p><

2、p><b>  摘 要:1</b></p><p>  第一章 課程設(shè)計(jì)要求和內(nèi)容2</p><p>  1.1設(shè)計(jì)目標(biāo)和要求2</p><p>  1.2 設(shè)計(jì)內(nèi)容2</p><p>  第二章 開發(fā)工具介紹3</p><p>  第三章 系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)4</p>

3、<p>  3.1 宿主機(jī)開發(fā)環(huán)境配置4</p><p>  3.2功能分析與方案論證5</p><p>  3.2.1 功能分析5</p><p>  3.2.2 可行性分析5</p><p>  3.3 需求分析5</p><p>  3.4 詳細(xì)設(shè)計(jì)6</p><p&g

4、t;  3.4.1 系統(tǒng)的功能模塊設(shè)計(jì)6</p><p>  3.4.2 界面窗口模塊詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)6</p><p>  3.4.5 MP3 文件播放控制模塊詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)9</p><p>  3.4.6 主要程序文件(代碼見附錄)12</p><p>  第四章 調(diào)試分析12</p><p>  第五

5、章 設(shè)計(jì)總結(jié)12</p><p>  主要參考文獻(xiàn):13</p><p>  附錄(流程圖、源代碼):14</p><p>  附錄1 相關(guān)流程圖14</p><p>  附錄2 系統(tǒng)運(yùn)行效果16</p><p>  附錄3 程序源代碼17</p><p><b>  音

6、樂 播 放 器</b></p><p><b>  摘 要:</b></p><p>  隨著用戶要求的不斷提高,越來越多的嵌入式設(shè)備使用功能強(qiáng)大、價(jià)格低廉的嵌入式Linux作為操作系統(tǒng)并開始采用較為復(fù)雜的圖形用戶界面。Qt以其強(qiáng)大的功能、良好的可移植性逐漸成為一種被廣泛使用的GUI系統(tǒng)。正是由于嵌入式操作系統(tǒng)及其相應(yīng)圖形用戶界面的不斷發(fā)展,嵌入式軟件的開

7、發(fā)顯得越來越重要,其中嵌入式媒體播放器由于能夠滿足人們的視聽享受已經(jīng)逐漸成為了系統(tǒng)中不可或缺的重要組成部分,在嵌入式系統(tǒng)上開發(fā)媒體播放器已經(jīng)成為了一個技術(shù)熱點(diǎn),當(dāng)前許多嵌入式產(chǎn)品中都包含媒體播放器。因此在基于Qt的嵌入式Linux系統(tǒng)中實(shí)現(xiàn)媒體播放器具有深刻的意義和實(shí)用價(jià)值。本次課程設(shè)計(jì)運(yùn)用Qt技術(shù)在Linux下進(jìn)行GUI設(shè)計(jì),以一個圖形界面為例,運(yùn)用QT creator軟件編程,實(shí)現(xiàn)一個簡單的音樂播放器。此播放器能夠播放本地的音頻文件

8、,在功能方面,它具備一些基本的音樂操作處理功能,如暫停、播放、音量調(diào)節(jié)、停止等,此外,界面還能顯示歌曲信息,比如顯示播放列表,播放的時候能夠通過按鈕來實(shí)現(xiàn)歌詞顯示的功能。</p><p>  關(guān)鍵詞: 嵌入式系統(tǒng) 音樂播放器 QT Linux</p><p>  第一章 課程設(shè)計(jì)要求和內(nèi)容</p><p>  1.1設(shè)計(jì)目標(biāo)和要求</p><

9、;p>  掌握linux應(yīng)用開發(fā)的基本理論知識和基本方法技能,概念清楚明確,系統(tǒng)分析、系統(tǒng)設(shè)計(jì) 、系統(tǒng)實(shí)現(xiàn)、系統(tǒng)測試符合軟件工程的相關(guān)規(guī)范,結(jié)構(gòu)合理,程序運(yùn)行良好。</p><p>  實(shí)現(xiàn)Linux系統(tǒng)下的音樂播放器設(shè)計(jì),實(shí)現(xiàn)一個播放Mp3格式音樂的嵌入式多媒體播放系統(tǒng)。具有良好的圖形用戶設(shè)計(jì)界面。</p><p><b>  1.2 設(shè)計(jì)內(nèi)容</b><

10、/p><p>  運(yùn)用Qt技術(shù)在Linux下進(jìn)行GUI設(shè)計(jì),以一個圖形界面為例,運(yùn)用QT creator軟件編程,實(shí)現(xiàn)一個簡單的音樂播放器。此播放器能夠播放本地的音頻文件,在功能方面,它具備一些基本的音樂操作處理功能,如暫停、播放、音量調(diào)節(jié)、停止等,此外,界面還能顯示歌曲信息,比如顯示播放列表,播放的時候能夠通過按鈕來實(shí)現(xiàn)歌詞顯示的功能。</p><p>  第二章 開發(fā)工具介紹</p&

11、gt;<p>  Qt從4.4版本開始提供的一套多媒體框架,提供多媒體回放的功能。目前在Qt 4.6中實(shí)現(xiàn)多媒體播放圖形界面主要依賴于phonon框架,其實(shí)qt中還有一個Multimedia模塊,幫助文檔中對它的描述是:實(shí)現(xiàn)底層的多媒體播放功能,在一般情況下上層的接口phonon模塊更適合實(shí)現(xiàn)這些功能。phonon最初是一個源于KDE的項(xiàng)目,為使用音頻和視頻的應(yīng)用程序開發(fā)提供的一個框架。應(yīng)用程序不用去管多媒體播放是通過什么

12、實(shí)現(xiàn)的(如gstreamer、xine),只需調(diào)用相應(yīng)的接口就行,但這中間需要一個中轉(zhuǎn),被稱為backend。Qt也是通過phonon來實(shí)現(xiàn)夸平臺的多媒體播放。多媒體文件的播放主要過程包括:文件讀取、分流、解碼、輸出。如圖1所示</p><p>  圖1 多媒體文件的播放主要過程</p><p>  這些在不同的系統(tǒng)中實(shí)現(xiàn)方式不同,如windows下的DirectX、Linux下的 gst

13、reamer或xine及Mac下的QuickTime。而Qt中的phonon作為夸平臺的多媒體解決方案,就因該為用戶屏蔽掉這些差異。而實(shí)際上它做得還不夠好,因?yàn)橛脩暨€需要自己來安裝相應(yīng)的后端插件來完成播放任務(wù)。如圖2</p><p>  圖2 Phonon庫的調(diào)用使用過程</p><p>  應(yīng)用Phonon框架實(shí)質(zhì)上分4個部分,你的程序,Phonon庫,Phonon后端插件(phonon

14、_backend),真正的后端。Phonon其實(shí)什么都不干,他只是提供了一套API接口,這套接口可以給你的程序調(diào)用,同時也是給編寫后端插件提供一個規(guī)范。程序完全不知道最后誰來放我的Mp3,誰來解碼我的視頻,播放的又是哪個設(shè)備。同樣,Phonon庫也不知道,他只管搜索符合自己規(guī)范的插件。并告訴這些插件,現(xiàn)在程序發(fā)出的指令是什么,從插件返回給程序現(xiàn)在的媒體狀態(tài)和信息。而后端才是實(shí)際進(jìn)行讀入媒體、解碼并且播放的部分,他們和后端插件是一一對應(yīng)的

15、。后端可以是任何形式,只要你寫出了相應(yīng)的后端插件。所以,使用Phonon必需要先做2件事:</p><p>  1、編譯Phonon庫:通常情況下,Qt默認(rèn)沒有編譯,需要configure后加好參數(shù),然后單獨(dú)進(jìn)入phonon的文件夾進(jìn)行編譯就可以了</p><p>  2、編譯Phonon后端插件:Qt為3大平臺分別提供了一個可用的后端插件,放在src\plugins\phonon目錄下。

16、進(jìn)入目錄編譯即可,Qt會自動選擇你當(dāng)前系統(tǒng)的后端插件的。(出現(xiàn)phonon backend plugin could not be loaded就是這步?jīng)]有做).如果是MinGW用戶,Windows下Qt只提供了DirectShow這個后端插件,而這個后端插件因?yàn)檎{(diào)用了DX的SDK,所以只能由VC編譯。當(dāng)然其實(shí)有更好的選擇,比如這個phonon-vlc-mplayer插件,通過他,可以將mplayer作為后端,徹底拋棄臃腫的VS以及讀I

17、D3v2都會出錯的DirectShow,Phonon是KDE 4的多媒體API 。Phonon提供一個穩(wěn)定的API允許KDE 4獨(dú)立于任何一個聲音系統(tǒng)服務(wù)器如xine。</p><p>  Phonon讓各種后端提供界面給開發(fā)者所謂的"引擎";每個引擎運(yùn)作在一個具體的后端。每個后端都可讓Phonon控制基本功能,如播放、暫停和搜尋。Phonon也支持更高層次的功能,如讓音軌轉(zhuǎn)化之間變微弱。使用

18、Solid,Phonon將給予用戶更多配件的控制能力如耳機(jī)、揚(yáng)聲器、麥克風(fēng)。一個例子是,因?yàn)槟憧赡苤挥幸粋€VoIP會話使用您的耳機(jī),但所有其他的聲音通過揚(yáng)聲器出來。支援 Unix-like 系統(tǒng)下的后端xine、VLC、MPlayer。支援 Windows 下的后端 DirectShow、VLC和MPlayer.支援 Mac OS X下的后端QuickTime。</p><p>  如上所述,如果想要運(yùn)行使用Qt

19、中的phonon寫的程序,需要滿足一下條件:Qt基本庫、Qt phonon庫、phonon_backend(后端插件)和多媒體播放后臺。</p><p>  第三章 系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)</p><p>  3.1 宿主機(jī)開發(fā)環(huán)境配置</p><p>  安裝Linux系統(tǒng):宿主開發(fā)環(huán)境,我們選用在windows下安裝VMware WorkStation虛擬機(jī)RedHat

20、 Linux 5的組合來組建。 </p><p>  在虛擬機(jī)中安裝Linux系統(tǒng):我們選擇標(biāo)準(zhǔn)安裝(Typical)安裝過程中先創(chuàng)建一個虛擬空白盤,然后選擇Linux系統(tǒng)版本為RedHat Linux 5,整個安裝流程參照用戶手冊來完成。</p><p>  在Linux下安裝QT Creator: 從QT官網(wǎng)上可以直接下載到QT Creator,下載完畢后,直接在終端運(yùn)行安裝包,選擇默

21、認(rèn)安裝類型,即可完成QT Creator的安裝。</p><p>  3.2功能分析與方案論證 </p><p>  3.2.1 功能分析 </p><p>  通過運(yùn)用Qt技術(shù)在嵌入式Linux操作系統(tǒng)下,進(jìn)行GUI設(shè)計(jì),以一個圖形界面為例,運(yùn)用QT creator軟件編程,來完成音樂播放器的設(shè)計(jì)和實(shí)現(xiàn)音樂播放器的各種功能,使播放器能夠顯示播放列表,播放本地的音頻

22、文件,通過點(diǎn)擊相應(yīng)的按鈕來實(shí)現(xiàn)歌曲的播放、暫停、停止等功能,此外,界面還能進(jìn)行音量調(diào)節(jié),顯示歌曲信息,比如顯示正在播放在音頻文件的時間信息,播放的時候能夠通過按鈕來實(shí)現(xiàn)播放列表和歌詞的顯示的功能。</p><p>  3.2.2 可行性分析 </p><p>  計(jì)算機(jī)技術(shù)的發(fā)展目前Linux已被廣泛應(yīng)用于信息家電、數(shù)據(jù)網(wǎng)絡(luò)、工業(yè)控制、醫(yī)療衛(wèi)生、航空航天等眾多領(lǐng)域。在嵌入式領(lǐng)域,由于價(jià)格

23、低廉、結(jié)構(gòu)小巧的各種微處理器的出現(xiàn)為外設(shè)連接提供了穩(wěn)定可靠的硬件架構(gòu)限制嵌入式系統(tǒng)發(fā)展的瓶頸就突出表現(xiàn)在軟件方面。近年來隨著芯片技術(shù)的快速發(fā)展嵌入式系統(tǒng)的性能逐步提高,功能也越來越豐富。嵌入式系統(tǒng)在眾多領(lǐng)域的應(yīng)用給我們的生活帶來了便利并且對人們的生活方式的改變和生活質(zhì)量的提高具有重要的影響。在這些領(lǐng)域中,消費(fèi)電子產(chǎn)品的應(yīng)用具有更為廣泛的潛力,尤其是便攜式消費(fèi)電子產(chǎn)品。 </p><p><b> 

24、 3.3 需求分析 </b></p><p><b>  程序設(shè)計(jì)目標(biāo):</b></p><p>  程序設(shè)計(jì)目標(biāo)是:結(jié)合QT技術(shù)和C++語言實(shí)現(xiàn)一個圖形界面mp3音頻播放器。 </p><p><b>  具體目標(biāo)如下: </b></p><p>  1) 能夠方便地選擇本機(jī)上的一個m

25、p3文件進(jìn)行播放。選擇mp3文件時,不需要有鍵盤輸入操作。 </p><p>  2) 播放過程中可以暫停,暫停后可以從暫停處再次播放。播放過程中可以停止,點(diǎn)擊播放按鈕后,可以再次從開頭播放本文件。 </p><p>  3) 播放、暫停、或停止?fàn)顟B(tài)中,都可以選擇其它mp3文件代替當(dāng)前mp3文件進(jìn)行播放。</p><p>  4) 在面板上顯示mp3文件當(dāng)前播放的時

26、間和mp3文件的名字。播放時間隨時刷新,配合好前面的播放調(diào)節(jié)操作。 </p><p>  5) 本程序中要有一個滾動條來顯示當(dāng)前的mp3文件播放位置,拖動滾動條,可以調(diào)節(jié)mp3文件的播放位置。</p><p>  6) 本程序中要有一個滑塊來顯示當(dāng)前的mp3音頻文件的播放音量,拖動滑塊,可以調(diào)節(jié)音頻的播放音量。</p><p>  7)點(diǎn)擊打開按鈕可以打開/關(guān)閉播放

27、列表。</p><p>  8)點(diǎn)擊歌詞按鈕可以顯示/關(guān)閉桌面歌詞。</p><p>  9) 界面盡量美觀,程序運(yùn)行時不要出現(xiàn)異常。 </p><p><b>  3.4 詳細(xì)設(shè)計(jì)</b></p><p>  3.4.1 系統(tǒng)的功能模塊設(shè)計(jì)</p><p>  一個軟件系統(tǒng)設(shè)計(jì)的成敗,除了在功能

28、上要盡可能地完善以外,在界面設(shè)計(jì)上也有很大的決定性作用。如果你的軟件界面很糟糕,不能讓使用該軟件的用戶滿意,那么你開發(fā)的產(chǎn)品將被“凍結(jié)”起來,得不到用戶的響應(yīng)。所以,軟件產(chǎn)品的界面設(shè)計(jì)應(yīng)該具有友好性這一特點(diǎn)。除此之外,還應(yīng)該有簡潔性。如果你的產(chǎn)品只注意了友好美觀的界面,而使得你的界面很復(fù)雜,將會給用戶帶來極大的不便,從而會適得其反。比如,一個最簡單的操作用戶要點(diǎn)擊一個按鈕,而你的界面上到處都是按鈕圖片之類的,這就會讓用戶花上很長的時間去

29、尋找要點(diǎn)擊的按鈕,這樣一來,當(dāng)然就不能使用戶滿意了?;诖?,本系統(tǒng)使用Qt來設(shè)計(jì)界面,并且共有2個界面窗口,分別是:播放器控制窗口、播放列表窗口、歌詞顯示窗口。為了更好地實(shí)現(xiàn)系統(tǒng)的各項(xiàng)功能及這些功能的完整性,現(xiàn)在把系統(tǒng)共分為以下2大模塊進(jìn)行設(shè)計(jì): (1) 系統(tǒng)的播放控制窗口模塊(2) MP3文件的播放列表管理模塊 (3) MP3歌詞的實(shí)時顯示模塊</p><p>  3.4.2 界面窗口模塊詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)<

30、/p><p>  一款軟件的界面設(shè)計(jì)的成敗直接關(guān)系到該產(chǎn)品的成敗。本MP3播放器系統(tǒng)的界面設(shè)計(jì),利用Qt提供的強(qiáng)大的控件設(shè)計(jì)而成。系統(tǒng)的界面窗口包括有2個主要的界面,分別是:播放器的控制界面窗口和媒體文件播放列表窗口,背景都為藍(lán)綠色調(diào),下面分別作出詳細(xì)介紹。</p><p><b>  控制界面窗口:</b></p><p>  播放器的控制界面是

31、播放器系統(tǒng)與播放器的使用者直接交互的媒介。按照控制界面上的組件的功能來分,可以將這些組件分成兩部分:信息顯示和控制組件,如下圖3所示</p><p><b>  圖 3控制界面窗口</b></p><p>  信息顯示組件信息顯示是系統(tǒng)與使用者進(jìn)行交流的通道,它可以及時地將各種有用的信息提供給用戶,以便用戶對系統(tǒng)進(jìn)行控制。本播放器系統(tǒng)的所有信息顯示在操作控件四周,很方

32、便看到</p><p>  1.播放狀態(tài)顯示的作用,是及時準(zhǔn)確地顯示當(dāng)前播放器所處的狀態(tài)。其中,狀態(tài)有“播放”、“暫?!焙汀巴V埂比N,隨播放器狀態(tài)的改變而改變。</p><p>  2.音量顯示 這部分與音量控制滑動桿控件和菜單項(xiàng)中的“聲音”相關(guān)聯(lián),當(dāng)音量滑動桿的滑塊位置改變以后,音量大小會隨著變化。</p><p><b>  控制組件:</b&

33、gt;</p><p>  信息顯示是播放器系統(tǒng)提供給使用者各種有用的信息,而控制組件則剛好相反,它可以看作是使用者提供給播放器系統(tǒng)的各種有用的信息,用來指示系統(tǒng)是否工作及如何工作。1) 播放/暫停按鈕</p><p>  設(shè)計(jì)這個按鈕對一個播放器來說是最為重要的。如果一個播放器不能夠播放/暫停的話,就不能稱之為播放器了。對本播放器系統(tǒng)來說,這個按鈕集成了兩個重要的功能:“開始播放”和“暫

34、停播放”,這樣將兩個功能集成到一個位置上的好處就是減少了界面上的按鈕的個數(shù),這使得整個界面更加簡潔。這個按鈕的作用是:如果當(dāng)前播放器的狀態(tài)為正在播放,點(diǎn)擊它之后就會暫停播放;如果當(dāng)前播放器的狀態(tài)為暫停播放,點(diǎn)擊它之后就會繼續(xù)播放。如果播放器的狀態(tài)沒有播放,也不是處于暫停狀態(tài),點(diǎn)擊之后,系統(tǒng)就會從媒體播放列表中加載一個媒體文件并開始播放。因此,基于上述功能,為實(shí)現(xiàn)播放和暫停功能,使之重疊放置,按照播放狀態(tài)的改變在同一時間只顯示一個按鈕,這

35、樣就模擬實(shí)現(xiàn)了播放/暫停功能按鈕,如果在播放狀態(tài)時想點(diǎn)擊播放按鈕播放其他MP3可以通過菜單中實(shí)現(xiàn)。</p><p>  表 1 播放器控件的組成部分</p><p>  2) 停止按鈕的設(shè)計(jì) </p><p>  停止功能按鈕的設(shè)計(jì),是讓本播放器系統(tǒng)的使用者可以以手動的方式來停止當(dāng)前 媒體文件的播放。如果播放器當(dāng)前沒有文件正在進(jìn)行播放時,該按鈕將置為無效狀態(tài),此時該

36、按鈕不能點(diǎn)擊。 </p><p>  3) 上一首按鈕的設(shè)計(jì)</p><p>  如果沒有播放列表的話就不存在有多個媒體文件,也就不存在有上一首可以選擇了。所以,一個播放器的設(shè)計(jì)有這個功能按鈕的話,就表示它一定有一個用來保存媒體文件的播放列表。在本系統(tǒng)中,上一首按鈕設(shè)計(jì)在播放/暫停功能按鈕的前面。這樣設(shè)計(jì)的目的,是使得整個功能控制按鈕的順序與MP3文件在列表中的順序相似。 </p&g

37、t;<p>  4) 下一首按鈕的設(shè)計(jì)</p><p>  同樣,它的設(shè)計(jì)也是與播放列表的存在有關(guān),如果沒有播放列表的話就不存在有多個媒體文件,也就不存在有下一首可以選擇了。在本系統(tǒng)中,下一首按鈕設(shè)計(jì)在播放/暫停功能按鈕的后面。這樣設(shè)計(jì)的目的,是使得整個功能控制按鈕的順序與文件在列表中的順序相似。 </p><p>  5) 打開按鈕的設(shè)計(jì)</p><p&

38、gt;  打開功能按鈕的設(shè)計(jì),是方便用戶選擇一個媒體文件,并立即進(jìn)行播放。</p><p>  6) 列表按鈕的設(shè)計(jì) </p><p>  它主要是對播放列表窗口進(jìn)行顯示/隱藏控制,當(dāng)用戶點(diǎn)擊此按鈕后,如果當(dāng)前列表窗口的狀態(tài)為顯示狀態(tài)的話,用戶的操作將會隱藏列表窗口。相反,如果當(dāng)前列表窗口的狀態(tài)為隱藏狀態(tài),用戶的操作將會顯示列表窗口。</p><p>  7) 歌詞

39、按鈕的設(shè)計(jì)</p><p>  LRC是MP3歌詞文件的格式,此按鈕可以控制歌詞顯示窗口的顯示與隱藏。當(dāng)用戶點(diǎn)擊此按鈕時,將檢查歌詞顯示窗口的狀態(tài)。如果當(dāng)前狀態(tài)為顯示,則將其隱藏;反之,如果當(dāng)前狀態(tài)為隱藏,則將其顯示。</p><p><b>  8)靜音按鈕</b></p><p>  該按鈕可以控制播放器輸出聲音的開啟和關(guān)閉。當(dāng)用戶點(diǎn)擊此按

40、鈕時,系統(tǒng)將檢查播放器的聲音狀態(tài)。如果當(dāng)前聲音狀態(tài)為開啟,則將其管理,即靜音;如果當(dāng)前聲音狀態(tài)為關(guān)閉,則將其開啟。因?yàn)榕c音量控制有關(guān),所以在播放器中將其置于音量控制條的左方。</p><p><b>  9) 音量控制條 </b></p><p>  音量控制條的設(shè)計(jì)與音量大小和播放器的輸出音量關(guān)聯(lián),它的改變將直接影響播放器輸出音量的大小,其主要功能是用來控制系統(tǒng)播放

41、媒體文件時發(fā)出的音量大小。</p><p><b>  10)進(jìn)度控制條 </b></p><p>  進(jìn)度控制條的設(shè)計(jì),是用來方便用戶進(jìn)行控制播放媒體文件進(jìn)度的,它的移動將直接改變媒體文件的當(dāng)前播放進(jìn)度,同時歌詞顯示實(shí)時窗口的歌詞也將按照進(jìn)度進(jìn)行調(diào)整。當(dāng)控制條滑到最左邊時表示MP3文件的初始位置,當(dāng)控制條滑到最右邊時表示當(dāng)前位置為MP3文件的最后位置。</p&

42、gt;<p><b>  播放列表界面:</b></p><p>  本播放器系統(tǒng)的播放列表窗口界面的設(shè)計(jì)主要是用來方便使用者配置管理播放 器的播放列表,以提供給播放器更完整的功能。效果如圖4所示</p><p><b>  圖4 播放列表界面</b></p><p>  3.4.5 MP3 文件播放控制模

43、塊詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)</p><p>  MP3文件的播放控制模塊是本播放器系統(tǒng)的很重要的組成部分。在本播放器系統(tǒng) 中,播放控制主要集中在對播放器的控制界面上的操作。首先說明的是,媒體播放器的播放控制的類型,如表2所示</p><p>  表 2 播放控制模塊</p><p>  在本播放器中,總共有三種狀態(tài),即播放狀態(tài)、暫停狀態(tài)和停止?fàn)顟B(tài),通過表中所列的各種播放控制類

44、型可以實(shí)現(xiàn)這三種狀態(tài)之間的轉(zhuǎn)換,其具體轉(zhuǎn)換如圖5(見附錄1)所示。</p><p>  下面將根據(jù)上圖的各種轉(zhuǎn)換關(guān)系,詳細(xì)介紹各種播放控制類型的設(shè)計(jì)與實(shí)現(xiàn)</p><p><b>  播放:</b></p><p>  播放功能是媒體播放器所有控制功能中最重要的一個功能,沒有了它,播放器不能播放,也就不能稱之為播放器了。在本播放器系統(tǒng)中,當(dāng)點(diǎn)擊

45、播放會有三種狀態(tài)轉(zhuǎn)換:第一種是從播放狀態(tài)仍然轉(zhuǎn)換到播放狀態(tài);第二種是從停止?fàn)顟B(tài)轉(zhuǎn)換到播放狀態(tài);第三種是從暫停狀態(tài)轉(zhuǎn)換到播放狀態(tài)。下面具體介紹播放功能是怎樣設(shè)計(jì)的,其具體流程如圖6(見附錄1)所示。 當(dāng)播放器接收到播放命令后,會依次執(zhí)行下面的過程:</p><p>  (1)檢查播放器的當(dāng)前狀態(tài)是否是暫停狀態(tài)。如果是暫停狀態(tài),那么繼續(xù)播放,如果不是暫停狀態(tài),則執(zhí)行第2步;</p><p> 

46、 (2)檢查播放列表中是否有媒體文件,如果沒有則調(diào)用添加歌曲過程進(jìn)行添加,然后再次執(zhí)行本過程進(jìn)行播放;如果播放列表中有文件則執(zhí)行第3步;</p><p>  (3)檢查播放列表索引,判斷是否選中了播放列表的一首MP3來進(jìn)行播放,如果沒有選擇,則選擇播放列表中的第一首后執(zhí)行第4步,如果已經(jīng)選擇了要播放的MP3 則直接執(zhí)行第4步</p><p> ?。?) 判斷要播放的MP3在播放列表中的位置

47、,如果是第一首則將上一首按鈕置為無效,否則置為有效;如果是最后一首,則將下一首按鈕置為無效,否則置為有效。</p><p><b>  暫停:</b></p><p>  當(dāng)用戶播放一個媒體文件到某一個特定的點(diǎn)時,由于某些原因需要暫停當(dāng)前媒體文件的播放,這就要求設(shè)計(jì)的媒體播放器具有暫停播放的功能。既然是暫停播放,那么它前面的狀態(tài)就必然是播放狀態(tài),即暫停狀態(tài)只能由播放狀

48、態(tài)轉(zhuǎn)換而來。而這個狀態(tài)轉(zhuǎn)換的條件,就是在系統(tǒng)播放時用戶點(diǎn)擊暫停按鈕,暫停功能的流程如圖7(見附錄1)所示。</p><p><b>  停止播放:</b></p><p>  停止當(dāng)前MP3文件的播放有三種方式,第一種是當(dāng)播放器播放到當(dāng)前文件的最 后,系統(tǒng)會自動停止播放;第二種是用戶可以點(diǎn)擊停止播放按鈕來停止當(dāng)前媒體文件的播放。進(jìn)入停止?fàn)顟B(tài)的初始狀態(tài)也有兩種:第一種是

49、播放狀態(tài);第二種是暫停狀態(tài),當(dāng)播放器轉(zhuǎn)換為停止?fàn)顟B(tài)后,暫停功能和停止功能都變?yōu)闊o效功能,不能使用,直到轉(zhuǎn)換到播放狀態(tài)。停止功能的設(shè)計(jì)流程如圖8(見附錄1)所示。 當(dāng)播放器接收到停止命令后,會執(zhí)行以下過程: (1)設(shè)置各按鈕狀態(tài),播放為有效,暫停和停止置為無效;(2)檢查停止命令是用戶手動停止,還是播放器播放完一首MP3后自動轉(zhuǎn)換到停止?fàn)顟B(tài)。如果是手動停止則使播放控件停止播放,計(jì)時器停止計(jì)時,并將當(dāng)前播放進(jìn)度置0;如果是自然停止這執(zhí)行第3

50、步;(3)檢查播放模式是否是單曲播放模式,如果是則結(jié)束停止過程,否則執(zhí)行第4步; (4) 如果播放模式是循環(huán)播放且播放結(jié)束的是播放列表中的最后一首,這將播放列表的索引置0,否則直接播放下一首。</p><p><b>  上一首:</b></p><p>  上一首是針對播放列表所定義的操作。它是指用戶對播放器系統(tǒng)發(fā)送的命令(播 放上一首),然后由播放器系統(tǒng)做出播放上

51、一首的反應(yīng)。因?yàn)樵诒静シ牌飨到y(tǒng)中,如果當(dāng)前播放的MP3文件是播放列表中的第一首時,上一首功能設(shè)置為無效狀態(tài),所以在系統(tǒng)發(fā)送播放上一首命令時,不需要檢查當(dāng)前播放的文件是否是播放列表中的第一文件,而可以執(zhí)行播放上一首的操作。 上一首的具體流程如圖9(見附錄1)所示。</p><p><b>  下一首:</b></p><p>  同樣,播放下一首也是針對播放列表所定義的

52、操作。它是指用戶對播放器系統(tǒng)發(fā) 送播放下一首的命令,然后由播放器系統(tǒng)做出播放下一首的反應(yīng)。同樣,在本播放器系統(tǒng)中,如果當(dāng)前播放的文件是播放列表中最后一個文件,那么播放下一首功能會設(shè)置為無效狀態(tài),所以系統(tǒng)在響應(yīng)播放下一首命令時,無需檢查當(dāng)前播放文件是否是播放列表的最后一個文件。它的具體操作過程是:當(dāng)用戶發(fā)送了播放下一首的命令后,系統(tǒng)就會停止當(dāng)前正在播放的文件,然后去播放當(dāng)前播放文件的后面一個文件。下一首功能的流程可參照圖9。</p&

53、gt;<p><b>  打開文件并播放:</b></p><p>  打開文件并播放是用戶通過點(diǎn)擊打開按鈕向系統(tǒng)發(fā)送的命令。當(dāng)系統(tǒng)接收到該命令時,先會彈出一個打開文件對話框,然后由用戶選擇所要打開的MP3文件,把這個文件添加到播放列表,然后使用播放功能播放該文件。具體的操作流程如圖10(見附錄1)所示。</p><p>  向列表中添加單首 MP3 文

54、件:</p><p>  向播放列表中添加媒體文件,都是在系統(tǒng)的播放列表窗口界面上進(jìn)行操作的,以添加單首MP3文件。具體的添加過程是:當(dāng)系統(tǒng)獲取了一個添加媒體文件的命令時,會彈出一個文件對話框,等待用戶選擇媒體文件,這時,用戶可以選擇一個MP3文件。當(dāng)用戶點(diǎn)擊文件對話框上的打開按鈕以后,用戶所選擇的MP3文件就會被添加到播放列表中供用戶查看和控制。</p><p>  刪除列表中的一首 M

55、P3 文件:</p><p>  對播放列表有添加功能當(dāng)然也必然存在刪除操作。在對播放列表中的MP3文件進(jìn)行刪除操作時,前提是播放列表中必須有一首MP3文件被選中,否則將不會有任何事件發(fā)生。其具體操作是:當(dāng)用戶想要刪除一個MP3文件時,首先用鼠標(biāo)選擇該文件,然后右擊音樂曲目點(diǎn)擊刪除就可以了,剩下的工作由系統(tǒng)完成。其中,系統(tǒng)所做的工作是:記錄當(dāng)前用戶所刪除的文件在列表中的索引,然后根據(jù)這個索引值刪除掉播放列表中的該

56、索引項(xiàng),然后系統(tǒng)會自動將該項(xiàng)后面的項(xiàng)向前移動一位。</p><p>  3.4.6 主要程序文件(代碼見附錄)</p><p>  1)頭文件(為類加入相應(yīng)的標(biāo)準(zhǔn)流,庫)</p><p>  lrcwindow.h</p><p>  musiclist.h</p><p><b>  widget.h<

57、;/b></p><p>  2)源文件(完成各種類的定義與實(shí)現(xiàn))</p><p><b>  main.cpp</b></p><p>  lrcwindows.cpp</p><p>  musiclist.cpp</p><p>  widget.cpp</p><

58、p><b>  第四章 調(diào)試分析</b></p><p>  QT creator 在使用的過程中也出現(xiàn)了很多問題,首先是版本的問題,一開始編寫調(diào)試程序的時候應(yīng)當(dāng)選擇在WINDOWS下能夠直接運(yùn)行的QT SDK,下一步就是在虛擬機(jī)下QT creator的安裝這里要注意的問題就是QT編譯環(huán)境的建立。 </p><p>  其次就是QT creator的庫依賴問題

59、,在創(chuàng)建工程的時候可以用GUI選擇你需要依賴的Qt模塊,這樣你可以僅僅通過包含頭文件名即可正確包含頭文件,但是沒有選擇的話,你需要包含相對目錄。我此次的任務(wù)是多媒體播放器的設(shè)計(jì),而播放器需要用到QT phonon。Qt從4.4版本開始提供的一套多媒體框架,提供多媒體回放的功能。目前在Qt 4.6中實(shí)現(xiàn)多媒體播放圖形界面主要依賴于phonon框架,它能實(shí)現(xiàn)底層的多媒體播放功能,在一般情況下上層的接口phonon模塊更適合實(shí)現(xiàn)這些功能。ph

60、onon最初是 一個 源于KDE的項(xiàng)目為使用音頻和視頻的應(yīng)用程序開發(fā)提供的一個框架。應(yīng)用程序不用去管多媒體播放是通過什么實(shí)現(xiàn)的,如gstreamer、xine,只需調(diào)用相應(yīng)的接口就行,但這中間需要一個中轉(zhuǎn),被稱為backend。Qt也是通過phonon來實(shí)現(xiàn)夸平臺的多媒體播放。 </p><p>  最終通過編譯后可看到如附錄2的界面,可以通過按鈕實(shí)現(xiàn)播放器的簡單功能。</p><p>

61、<b>  第五章 設(shè)計(jì)總結(jié)</b></p><p>  本次設(shè)計(jì)在Linux操作系統(tǒng)下,Qt作為嵌入式系統(tǒng)圖形用戶界面GUI,通過虛擬機(jī)的RedHat Enterprise Linux 5系統(tǒng)進(jìn)行模擬,基本完成了基于QT的多媒體播放器的實(shí)現(xiàn)。在嵌入式系統(tǒng)基礎(chǔ)上,主要分析了Linux操作系統(tǒng)的的特點(diǎn)和優(yōu)勢,通過Linux系統(tǒng)下的QT編譯環(huán)境的學(xué)習(xí),了解了音頻解碼模塊,簡單應(yīng)用的QT crea

62、tor下的phonon構(gòu)架設(shè)計(jì)了音樂播放器。 不過本次設(shè)計(jì)過程中,由于時間因素的限制,對于QT庫的研究還不夠徹底,基于QT的播放器的設(shè)計(jì)與實(shí)現(xiàn)是需要依賴phonon框架的,我從網(wǎng)上下載的所有的版本都缺乏phonon庫,使得在最終結(jié)果的實(shí)現(xiàn)有了很大的阻礙。此外,在虛擬機(jī)下運(yùn)行的QT也遇到了版本的問題,這些問題都將在以后的學(xué)習(xí)過程中加以解決。 </p><p><b>  主要參考文獻(xiàn):</

63、b></p><p>  1、邢吉生等.嵌入式系統(tǒng)設(shè)計(jì)及應(yīng)用,北京:北京大學(xué)出版社,2011年</p><p>  2、王勇編著.《嵌入式系統(tǒng)原理與設(shè)計(jì)》. 杭州:浙江大學(xué)出版社,2007年</p><p>  3、(美)Christopher Hallinan 著,華清遠(yuǎn)見嵌入式培訓(xùn)中心 譯 《嵌入式Linux基礎(chǔ)教程》,人民郵電出版社,2009年</

64、p><p>  4、俞輝 主編,嵌入式Linux程序設(shè)計(jì)案例與實(shí)驗(yàn)教材,機(jī)械工業(yè)出版社,2009年</p><p>  5、韋東山 主編,嵌入式Linux應(yīng)用開發(fā)完全手冊,人民郵電出版社,2008年版</p><p>  6、俞建新等編,嵌入式應(yīng)用程序開發(fā)綜合實(shí)驗(yàn)9例,清華大學(xué)出版社,2004年</p><p>  7、(英)薩默菲爾德著,白建平

65、等譯,Qt高級編程,電子工業(yè)出版社2011年</p><p>  8、鄭阿奇,《Qt 4開發(fā)實(shí)踐》,電子工業(yè)出版社。2011年</p><p>  附錄(流程圖、源代碼):</p><p><b>  附錄1 相關(guān)流程圖</b></p><p><b>  圖5播放的三種狀態(tài)</b></p&g

66、t;<p>  圖6 播放功能流程圖</p><p>  圖7 暫停功能的流程</p><p><b>  圖8 停止功能流程</b></p><p><b>  圖9上一首功能流程</b></p><p>  圖10 打開功能操作流程</p><p>  附錄

67、2 系統(tǒng)運(yùn)行效果</p><p>  本播放器系統(tǒng)一共有3個界面窗口,分別是播放器的主控制窗口、播放列表窗口 和歌詞顯示窗口。在此,將詳細(xì)介紹這些窗口在不同狀態(tài)下的圖示,尤其是播放器的主要播放控制窗口。播放器運(yùn)行時的整體效果如圖11所示:</p><p>  圖11播放器整體運(yùn)行時效果</p><p>  1.播放狀態(tài)時播放器主控制窗口界面 此時播放器的主控制窗口界

68、面如圖12所示。</p><p><b>  圖12 播放狀態(tài)</b></p><p>  2.暫停狀態(tài)時播放器的主控制窗口界面 此時播放器的主控制窗口界面如圖13所示</p><p><b>  圖13 暫停狀態(tài)</b></p><p>  3.停止?fàn)顟B(tài)時播放的主控制窗口界面 此時播放器的主控制窗

69、口界面如圖14所示</p><p><b>  圖14 停止?fàn)顟B(tài)</b></p><p>  播放器的列表窗口界面也是由兩部分組成的,第一部分是播放列表項(xiàng)目;第二部分是MP3媒體文件顯示列表。其界面窗口如圖15所示。</p><p>  圖15 播放器的播放列表窗口界面效果</p><p><b>  附錄3

70、程序源代碼</b></p><p>  lrcwindow.h:</p><p>  #ifndef LRCWINDOW_H</p><p>  #define LRCWINDOW_H</p><p>  #include <QLabel></p><p>  #include <QTim

71、er></p><p>  class lrcWindow : public QLabel</p><p><b>  {</b></p><p><b>  Q_OBJECT</b></p><p><b>  public:</b></p><p&

72、gt;  lrcWindow(QWidget *parent);</p><p>  QAction *exit;</p><p>  void setTime(int num){time = num;}</p><p>  void setLrcWidth();</p><p>  QTimer *timer;</p><

73、;p><b>  private:</b></p><p>  QPoint dragPosition;</p><p><b>  int time;</b></p><p>  qreal length;</p><p>  qreal lrcWidth;</p><p

74、>  protected:</p><p>  void mousePressEvent(QMouseEvent *);</p><p>  void mouseMoveEvent(QMouseEvent *);</p><p>  void contextMenuEvent(QContextMenuEvent *ev);</p><p&g

75、t;  void paintEvent(QPaintEvent *);</p><p>  private slots:</p><p>  void timeout();</p><p><b>  };</b></p><p>  #endif // LRCWINDOW_H</p><p> 

76、 musiclist.h:</p><p>  #ifndef MUSICLIST_H</p><p>  #define MUSICLIST_H</p><p>  #include <QWidget></p><p>  namespace Ui {</p><p>  class musicList;

77、</p><p><b>  }</b></p><p>  class musicList : public QWidget</p><p><b>  {</b></p><p><b>  Q_OBJECT</b></p><p><b>

78、;  public:</b></p><p>  musicList(QWidget *parent = 0);</p><p>  ~musicList();</p><p>  Ui::musicList *ui;</p><p>  void listReadSettings();</p><p> 

79、 void listWriteSettings();</p><p>  protected:</p><p>  void changeEvent(QEvent *e);</p><p>  void closeEvent(QCloseEvent *);</p><p>  void moveEvent(QMoveEvent *);<

80、/p><p><b>  signals:</b></p><p>  void listClose();</p><p><b>  private:</b></p><p><b>  };</b></p><p>  #endif // MUSICLI

81、ST_H</p><p><b>  widget.h:</b></p><p>  #ifndef WIDGET_H</p><p>  #define WIDGET_H</p><p>  #include <QWidget></p><p>  #include <phon

82、on></p><p>  #include "lrcwindow.h"</p><p>  #include "musiclist.h"</p><p>  #include <QTimer></p><p>  #include <QSystemTrayIcon><

83、;/p><p>  #include <QMenu></p><p>  #include <QTextEdit></p><p>  class QLabel;</p><p>  namespace Ui {</p><p>  class Widget;</p><p>

84、;<b>  }</b></p><p>  class Widget : public QWidget {</p><p><b>  Q_OBJECT</b></p><p><b>  public:</b></p><p>  Widget(QWidget *paren

85、t = 0);</p><p>  ~Widget();</p><p>  void creatActions();</p><p>  void setCurrentLrc();</p><p>  protected:</p><p>  void changeEvent(QEvent *e);</p>

86、;<p>  void wheelEvent(QWheelEvent *);</p><p>  bool eventFilter(QObject *, QEvent *);</p><p>  void contextMenuEvent(QContextMenuEvent *);</p><p>  void dragEnterEvent(QDrag

87、EnterEvent *);</p><p>  void dropEvent(QDropEvent *);</p><p>  void closeEvent(QCloseEvent *);</p><p>  void moveEvent(QMoveEvent *);</p><p>  void mouseDoubleClickEven

88、t(QMouseEvent *);</p><p><b>  private:</b></p><p>  Ui::Widget *ui;</p><p>  musicList *mList;</p><p>  Phonon::MediaObject *audio;</p><p>  Ph

89、onon::MediaObject *musicInformationMediaObject;</p><p>  Phonon::VideoWidget *videoWidget;</p><p>  Phonon::AudioOutput *audioOutput;</p><p>  Phonon::SeekSlider *seekSlider;</p&

90、gt;<p>  Phonon::VolumeSlider *volumeSlider;</p><p>  QList<Phonon::MediaSource> musicSourceList;</p><p>  QWidget *lrcWidget;</p><p>  QLabel *lrcLabel;</p><

91、;p>  lrcWindow *lrc;</p><p>  lrcWindow *lrc2;</p><p>  QTimer *timer;</p><p>  QIcon *iconplay;</p><p>  QIcon *iconpause;</p><p>  QAction *play;</

92、p><p>  QAction *stop;</p><p>  QAction *open;</p><p>  QAction *sound;</p><p>  QAction *exit;</p><p>  QAction *remove;</p><p>  QSystemTrayIco

93、n *trayicon;</p><p>  QMenu *trayiconMenu;</p><p>  void readSettings();</p><p>  void writeSettings();</p><p>  QTextEdit *text;</p><p>  bool isTouched;&

94、lt;/p><p>  private slots:</p><p>  void on_toolButton_List_clicked(bool checked);</p><p>  void tableWidget_cellDoubleClicked(int row, int column);</p><p>  void on_toolB

95、utton_lrcD_clicked(bool checked);</p><p>  void on_toolButton_next_clicked();</p><p>  void on_toolButton_stop_clicked();</p><p>  void on_toolButton_playpause_clicked();</p>

96、<p>  void on_toolButton_previous_clicked();</p><p>  void on_toolButton_open_clicked();</p><p>  void showTime(qint64);</p><p>  void Timeout();</p><p>  void mu

97、sicInformationStateChanged(Phonon::State,Phonon::State);</p><p>  void mediaObjectStateChanged(Phonon::State,Phonon::State);</p><p>  void musicAboutToFinish();</p><p>  void curren

98、tMusicSourceChanged(Phonon::MediaSource);</p><p>  void removeSlot();</p><p>  void exitSlot();</p><p>  void iconActivated(QSystemTrayIcon::ActivationReason reason);</p><

99、;p><b>  signals:</b></p><p>  void mySignal();</p><p><b>  };</b></p><p>  #endif // WIDGET_H</p><p><b>  main.cpp:</b></p>

100、<p>  #include <QtGui/QApplication></p><p>  #include "widget.h"</p><p>  #include <QTextCodec></p><p>  int main(int argc, char *argv[])</p><

101、;p><b>  {</b></p><p>  QApplication a(argc, argv);</p><p>  QTextCodec::setCodecForTr(QTextCodec::codecForLocale());</p><p><b>  Widget w;</b></p>

102、<p><b>  w.show();</b></p><p>  return a.exec();</p><p><b>  }</b></p><p>  lrcwindow.cpp:</p><p>  #include "lrcwindow.h"</p&

103、gt;<p>  #include <QMouseEvent></p><p>  #include <QMenu></p><p>  #include <QTimer></p><p>  #include <QDebug></p><p>  #include <QPa

104、inter></p><p>  lrcWindow::lrcWindow(QWidget *parent):</p><p>  QLabel(parent)</p><p><b>  {</b></p><p>  this->setWindowFlags(Qt::SubWindow |Qt::Fram

105、elessWindowHint| Qt::WindowStaysOnTopHint);</p><p>  this->resize(1024,60);</p><p>  this->setText(tr("Music ..."));</p><p>  this->setAttribute(Qt::WA_Translucen

106、tBackground);//背景透明</p><p>  this->setCursor(Qt::OpenHandCursor);</p><p>  exit = new QAction(tr("隱藏(&D)"),this);</p><p>  connect(exit,SIGNAL(triggered()),this,SLO

107、T(close()));</p><p>  timer = new QTimer(this);</p><p>  connect(timer,SIGNAL(timeout()),this,SLOT(timeout()));</p><p>  this->move(400,700);</p><p>  lrcWidth = 0;&

108、lt;/p><p><b>  }</b></p><p>  void lrcWindow::mousePressEvent(QMouseEvent *event)</p><p><b>  {</b></p><p>  if(event->button() == Qt::LeftButto

109、n)</p><p><b>  {</b></p><p>  dragPosition = event->globalPos() - frameGeometry().topLeft();</p><p>  event->accept();</p><p><b>  }</b>&l

110、t;/p><p>  else if(event->button() == Qt::MidButton)//點(diǎn)擊鼠標(biāo)滾輪</p><p><b>  close();</b></p><p>  QLabel::mousePressEvent(event);</p><p><b>  }</b>

111、</p><p>  void lrcWindow::mouseMoveEvent(QMouseEvent *e)</p><p><b>  {</b></p><p>  if(e->buttons() & Qt::LeftButton)</p><p><b>  {</b>&l

112、t;/p><p>  move(e->globalPos() - dragPosition);</p><p>  e->accept();</p><p><b>  }</b></p><p>  QLabel::mouseMoveEvent(e);</p><p><b>

113、  }</b></p><p>  void lrcWindow::contextMenuEvent(QContextMenuEvent *ev)</p><p><b>  {</b></p><p>  QMenu menu;</p><p>  menu.addAction(exit);</p&g

114、t;<p>  menu.exec(ev->globalPos());</p><p>  QLabel::contextMenuEvent(ev);</p><p><b>  }</b></p><p>  void lrcWindow::paintEvent(QPaintEvent *)</p><

115、p><b>  {</b></p><p>  QPainter painter(this);</p><p>  // painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);</p><p>  //使用該行代碼可以實(shí)現(xiàn)反鋸齒,使歌詞顯示更

116、漂亮,但是會明顯增加CPU占用率</p><p>  QFont font(tr("Times New Roman"),30,QFont::Bold);</p><p>  painter.setFont(font);</p><p>  QLinearGradient lg(0,20,0,50);</p><p>  l

117、g.setColorAt(0,QColor(0,170,255,255));</p><p>  lg.setColorAt(0.2,QColor(61,214,191,250));</p><p>  lg.setColorAt(0.5,QColor(85,255,255,255));</p><p>  lg.setColorAt(0.8,QColor(61,2

118、14,191,250));</p><p>  lg.setColorAt(1,QColor(0,170,255,255));</p><p>  painter.setBrush(lg);</p><p>  painter.setPen(Qt::NoPen);</p><p>  QPainterPath textPath;</p&

119、gt;<p>  textPath.addText(0,50,font,text());</p><p>  painter.drawPath(textPath);</p><p>  length = textPath.currentPosition().x();</p><p>  painter.setPen(Qt::yellow);</p

120、><p>  painter.drawText(0,14,lrcWidth,50,Qt::AlignLeft,text());</p><p><b>  }</b></p><p>  void lrcWindow::timeout()</p><p><b>  {</b></p>&

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論