版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 課程設(shè)計(jì)說(shuō)明書(shū)</b></p><p> 課程設(shè)計(jì)名稱: 嵌入式系統(tǒng)課程設(shè)計(jì) </p><p> 課程設(shè)計(jì)題目: 音樂(lè)播放器 </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> 第二章 開(kāi)發(fā)工具介紹3</p><p> 第三章 系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)4</p>
3、<p> 3.1 宿主機(jī)開(kāi)發(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 主要程序文件(代碼見(jiàn)附錄)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、樂(lè) 播 放 器</b></p><p><b> 摘 要:</b></p><p> 隨著用戶要求的不斷提高,越來(lái)越多的嵌入式設(shè)備使用功能強(qiáng)大、價(jià)格低廉的嵌入式Linux作為操作系統(tǒng)并開(kāi)始采用較為復(fù)雜的圖形用戶界面。Qt以其強(qiáng)大的功能、良好的可移植性逐漸成為一種被廣泛使用的GUI系統(tǒng)。正是由于嵌入式操作系統(tǒng)及其相應(yīng)圖形用戶界面的不斷發(fā)展,嵌入式軟件的開(kāi)
7、發(fā)顯得越來(lái)越重要,其中嵌入式媒體播放器由于能夠滿足人們的視聽(tīng)享受已經(jīng)逐漸成為了系統(tǒng)中不可或缺的重要組成部分,在嵌入式系統(tǒng)上開(kāi)發(fā)媒體播放器已經(jīng)成為了一個(gè)技術(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ì),以一個(gè)圖形界面為例,運(yùn)用QT creator軟件編程,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的音樂(lè)播放器。此播放器能夠播放本地的音頻文件
8、,在功能方面,它具備一些基本的音樂(lè)操作處理功能,如暫停、播放、音量調(diào)節(jié)、停止等,此外,界面還能顯示歌曲信息,比如顯示播放列表,播放的時(shí)候能夠通過(guò)按鈕來(lái)實(shí)現(xiàn)歌詞顯示的功能。</p><p> 關(guān)鍵詞: 嵌入式系統(tǒng) 音樂(lè)播放器 QT Linux</p><p> 第一章 課程設(shè)計(jì)要求和內(nèi)容</p><p> 1.1設(shè)計(jì)目標(biāo)和要求</p><
9、;p> 掌握l(shuí)inux應(yīng)用開(kāi)發(fā)的基本理論知識(shí)和基本方法技能,概念清楚明確,系統(tǒng)分析、系統(tǒng)設(shè)計(jì) 、系統(tǒng)實(shí)現(xiàn)、系統(tǒng)測(cè)試符合軟件工程的相關(guān)規(guī)范,結(jié)構(gòu)合理,程序運(yùn)行良好。</p><p> 實(shí)現(xiàn)Linux系統(tǒng)下的音樂(lè)播放器設(shè)計(jì),實(shí)現(xiàn)一個(gè)播放Mp3格式音樂(lè)的嵌入式多媒體播放系統(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ì),以一個(gè)圖形界面為例,運(yùn)用QT creator軟件編程,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的音樂(lè)播放器。此播放器能夠播放本地的音頻文件,在功能方面,它具備一些基本的音樂(lè)操作處理功能,如暫停、播放、音量調(diào)節(jié)、停止等,此外,界面還能顯示歌曲信息,比如顯示播放列表,播放的時(shí)候能夠通過(guò)按鈕來(lái)實(shí)現(xiàn)歌詞顯示的功能。</p><p> 第二章 開(kāi)發(fā)工具介紹</p&
11、gt;<p> Qt從4.4版本開(kāi)始提供的一套多媒體框架,提供多媒體回放的功能。目前在Qt 4.6中實(shí)現(xiàn)多媒體播放圖形界面主要依賴于phonon框架,其實(shí)qt中還有一個(gè)Multimedia模塊,幫助文檔中對(duì)它的描述是:實(shí)現(xiàn)底層的多媒體播放功能,在一般情況下上層的接口phonon模塊更適合實(shí)現(xiàn)這些功能。phonon最初是一個(gè)源于KDE的項(xiàng)目,為使用音頻和視頻的應(yīng)用程序開(kāi)發(fā)提供的一個(gè)框架。應(yīng)用程序不用去管多媒體播放是通過(guò)什么
12、實(shí)現(xiàn)的(如gstreamer、xine),只需調(diào)用相應(yīng)的接口就行,但這中間需要一個(gè)中轉(zhuǎn),被稱為backend。Qt也是通過(guò)phonon來(lái)實(shí)現(xiàn)夸平臺(tái)的多媒體播放。多媒體文件的播放主要過(guò)程包括:文件讀取、分流、解碼、輸出。如圖1所示</p><p> 圖1 多媒體文件的播放主要過(guò)程</p><p> 這些在不同的系統(tǒng)中實(shí)現(xiàn)方式不同,如windows下的DirectX、Linux下的 gst
13、reamer或xine及Mac下的QuickTime。而Qt中的phonon作為夸平臺(tái)的多媒體解決方案,就因該為用戶屏蔽掉這些差異。而實(shí)際上它做得還不夠好,因?yàn)橛脩暨€需要自己來(lái)安裝相應(yīng)的后端插件來(lái)完成播放任務(wù)。如圖2</p><p> 圖2 Phonon庫(kù)的調(diào)用使用過(guò)程</p><p> 應(yīng)用Phonon框架實(shí)質(zhì)上分4個(gè)部分,你的程序,Phonon庫(kù),Phonon后端插件(phonon
14、_backend),真正的后端。Phonon其實(shí)什么都不干,他只是提供了一套API接口,這套接口可以給你的程序調(diào)用,同時(shí)也是給編寫(xiě)后端插件提供一個(gè)規(guī)范。程序完全不知道最后誰(shuí)來(lái)放我的Mp3,誰(shuí)來(lái)解碼我的視頻,播放的又是哪個(gè)設(shè)備。同樣,Phonon庫(kù)也不知道,他只管搜索符合自己規(guī)范的插件。并告訴這些插件,現(xiàn)在程序發(fā)出的指令是什么,從插件返回給程序現(xiàn)在的媒體狀態(tài)和信息。而后端才是實(shí)際進(jìn)行讀入媒體、解碼并且播放的部分,他們和后端插件是一一對(duì)應(yīng)的
15、。后端可以是任何形式,只要你寫(xiě)出了相應(yīng)的后端插件。所以,使用Phonon必需要先做2件事:</p><p> 1、編譯Phonon庫(kù):通常情況下,Qt默認(rèn)沒(méi)有編譯,需要configure后加好參數(shù),然后單獨(dú)進(jìn)入phonon的文件夾進(jìn)行編譯就可以了</p><p> 2、編譯Phonon后端插件:Qt為3大平臺(tái)分別提供了一個(gè)可用的后端插件,放在src\plugins\phonon目錄下。
16、進(jìn)入目錄編譯即可,Qt會(huì)自動(dòng)選擇你當(dāng)前系統(tǒng)的后端插件的。(出現(xiàn)phonon backend plugin could not be loaded就是這步?jīng)]有做).如果是MinGW用戶,Windows下Qt只提供了DirectShow這個(gè)后端插件,而這個(gè)后端插件因?yàn)檎{(diào)用了DX的SDK,所以只能由VC編譯。當(dāng)然其實(shí)有更好的選擇,比如這個(gè)phonon-vlc-mplayer插件,通過(guò)他,可以將mplayer作為后端,徹底拋棄臃腫的VS以及讀I
17、D3v2都會(huì)出錯(cuò)的DirectShow,Phonon是KDE 4的多媒體API 。Phonon提供一個(gè)穩(wěn)定的API允許KDE 4獨(dú)立于任何一個(gè)聲音系統(tǒng)服務(wù)器如xine。</p><p> Phonon讓各種后端提供界面給開(kāi)發(fā)者所謂的"引擎";每個(gè)引擎運(yùn)作在一個(gè)具體的后端。每個(gè)后端都可讓Phonon控制基本功能,如播放、暫停和搜尋。Phonon也支持更高層次的功能,如讓音軌轉(zhuǎn)化之間變微弱。使用
18、Solid,Phonon將給予用戶更多配件的控制能力如耳機(jī)、揚(yáng)聲器、麥克風(fēng)。一個(gè)例子是,因?yàn)槟憧赡苤挥幸粋€(gè)VoIP會(huì)話使用您的耳機(jī),但所有其他的聲音通過(guò)揚(yáng)聲器出來(lái)。支援 Unix-like 系統(tǒng)下的后端xine、VLC、MPlayer。支援 Windows 下的后端 DirectShow、VLC和MPlayer.支援 Mac OS X下的后端QuickTime。</p><p> 如上所述,如果想要運(yùn)行使用Qt
19、中的phonon寫(xiě)的程序,需要滿足一下條件:Qt基本庫(kù)、Qt phonon庫(kù)、phonon_backend(后端插件)和多媒體播放后臺(tái)。</p><p> 第三章 系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)</p><p> 3.1 宿主機(jī)開(kāi)發(fā)環(huán)境配置</p><p> 安裝Linux系統(tǒng):宿主開(kāi)發(fā)環(huán)境,我們選用在windows下安裝VMware WorkStation虛擬機(jī)RedHat
20、 Linux 5的組合來(lái)組建。 </p><p> 在虛擬機(jī)中安裝Linux系統(tǒng):我們選擇標(biāo)準(zhǔn)安裝(Typical)安裝過(guò)程中先創(chuàng)建一個(gè)虛擬空白盤(pán),然后選擇Linux系統(tǒng)版本為RedHat Linux 5,整個(gè)安裝流程參照用戶手冊(cè)來(lái)完成。</p><p> 在Linux下安裝QT Creator: 從QT官網(wǎng)上可以直接下載到QT Creator,下載完畢后,直接在終端運(yùn)行安裝包,選擇默
21、認(rèn)安裝類(lèi)型,即可完成QT Creator的安裝。</p><p> 3.2功能分析與方案論證 </p><p> 3.2.1 功能分析 </p><p> 通過(guò)運(yùn)用Qt技術(shù)在嵌入式Linux操作系統(tǒng)下,進(jìn)行GUI設(shè)計(jì),以一個(gè)圖形界面為例,運(yùn)用QT creator軟件編程,來(lái)完成音樂(lè)播放器的設(shè)計(jì)和實(shí)現(xiàn)音樂(lè)播放器的各種功能,使播放器能夠顯示播放列表,播放本地的音頻
22、文件,通過(guò)點(diǎn)擊相應(yīng)的按鈕來(lái)實(shí)現(xiàn)歌曲的播放、暫停、停止等功能,此外,界面還能進(jìn)行音量調(diào)節(jié),顯示歌曲信息,比如顯示正在播放在音頻文件的時(shí)間信息,播放的時(shí)候能夠通過(guò)按鈕來(lái)實(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)在軟件方面。近年來(lái)隨著芯片技術(shù)的快速發(fā)展嵌入式系統(tǒng)的性能逐步提高,功能也越來(lái)越豐富。嵌入式系統(tǒng)在眾多領(lǐng)域的應(yīng)用給我們的生活帶來(lái)了便利并且對(duì)人們的生活方式的改變和生活質(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++語(yǔ)言實(shí)現(xiàn)一個(gè)圖形界面mp3音頻播放器。 </p><p><b> 具體目標(biāo)如下: </b></p><p> 1) 能夠方便地選擇本機(jī)上的一個(gè)m
25、p3文件進(jìn)行播放。選擇mp3文件時(shí),不需要有鍵盤(pán)輸入操作。 </p><p> 2) 播放過(guò)程中可以暫停,暫停后可以從暫停處再次播放。播放過(guò)程中可以停止,點(diǎn)擊播放按鈕后,可以再次從開(kāi)頭播放本文件。 </p><p> 3) 播放、暫停、或停止?fàn)顟B(tài)中,都可以選擇其它mp3文件代替當(dāng)前mp3文件進(jìn)行播放。</p><p> 4) 在面板上顯示mp3文件當(dāng)前播放的時(shí)
26、間和mp3文件的名字。播放時(shí)間隨時(shí)刷新,配合好前面的播放調(diào)節(jié)操作。 </p><p> 5) 本程序中要有一個(gè)滾動(dòng)條來(lái)顯示當(dāng)前的mp3文件播放位置,拖動(dòng)滾動(dòng)條,可以調(diào)節(jié)mp3文件的播放位置。</p><p> 6) 本程序中要有一個(gè)滑塊來(lái)顯示當(dāng)前的mp3音頻文件的播放音量,拖動(dòng)滑塊,可以調(diào)節(jié)音頻的播放音量。</p><p> 7)點(diǎn)擊打開(kāi)按鈕可以打開(kāi)/關(guān)閉播放
27、列表。</p><p> 8)點(diǎn)擊歌詞按鈕可以顯示/關(guān)閉桌面歌詞。</p><p> 9) 界面盡量美觀,程序運(yùn)行時(shí)不要出現(xiàn)異常。 </p><p><b> 3.4 詳細(xì)設(shè)計(jì)</b></p><p> 3.4.1 系統(tǒng)的功能模塊設(shè)計(jì)</p><p> 一個(gè)軟件系統(tǒng)設(shè)計(jì)的成敗,除了在功能
28、上要盡可能地完善以外,在界面設(shè)計(jì)上也有很大的決定性作用。如果你的軟件界面很糟糕,不能讓使用該軟件的用戶滿意,那么你開(kāi)發(fā)的產(chǎn)品將被“凍結(jié)”起來(lái),得不到用戶的響應(yīng)。所以,軟件產(chǎn)品的界面設(shè)計(jì)應(yīng)該具有友好性這一特點(diǎn)。除此之外,還應(yīng)該有簡(jiǎn)潔性。如果你的產(chǎn)品只注意了友好美觀的界面,而使得你的界面很復(fù)雜,將會(huì)給用戶帶來(lái)極大的不便,從而會(huì)適得其反。比如,一個(gè)最簡(jiǎn)單的操作用戶要點(diǎn)擊一個(gè)按鈕,而你的界面上到處都是按鈕圖片之類(lèi)的,這就會(huì)讓用戶花上很長(zhǎng)的時(shí)間去
29、尋找要點(diǎn)擊的按鈕,這樣一來(lái),當(dāng)然就不能使用戶滿意了?;诖?,本系統(tǒng)使用Qt來(lái)設(shè)計(jì)界面,并且共有2個(gè)界面窗口,分別是:播放器控制窗口、播放列表窗口、歌詞顯示窗口。為了更好地實(shí)現(xiàn)系統(tǒng)的各項(xiàng)功能及這些功能的完整性,現(xiàn)在把系統(tǒng)共分為以下2大模塊進(jìn)行設(shè)計(jì): (1) 系統(tǒng)的播放控制窗口模塊(2) MP3文件的播放列表管理模塊 (3) MP3歌詞的實(shí)時(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個(gè)主要的界面,分別是:播放器的控制界面窗口和媒體文件播放列表窗口,背景都為藍(lán)綠色調(diào),下面分別作出詳細(xì)介紹。</p><p><b> 控制界面窗口:</b></p><p> 播放器的控制界面是
31、播放器系統(tǒng)與播放器的使用者直接交互的媒介。按照控制界面上的組件的功能來(lái)分,可以將這些組件分成兩部分:信息顯示和控制組件,如下圖3所示</p><p><b> 圖 3控制界面窗口</b></p><p> 信息顯示組件信息顯示是系統(tǒng)與使用者進(jìn)行交流的通道,它可以及時(shí)地將各種有用的信息提供給用戶,以便用戶對(duì)系統(tǒng)進(jìn)行控制。本播放器系統(tǒng)的所有信息顯示在操作控件四周,很方
32、便看到</p><p> 1.播放狀態(tài)顯示的作用,是及時(shí)準(zhǔn)確地顯示當(dāng)前播放器所處的狀態(tài)。其中,狀態(tài)有“播放”、“暫?!焙汀巴V埂比N,隨播放器狀態(tài)的改變而改變。</p><p> 2.音量顯示 這部分與音量控制滑動(dòng)桿控件和菜單項(xiàng)中的“聲音”相關(guān)聯(lián),當(dāng)音量滑動(dòng)桿的滑塊位置改變以后,音量大小會(huì)隨著變化。</p><p><b> 控制組件:</b&
33、gt;</p><p> 信息顯示是播放器系統(tǒng)提供給使用者各種有用的信息,而控制組件則剛好相反,它可以看作是使用者提供給播放器系統(tǒng)的各種有用的信息,用來(lái)指示系統(tǒng)是否工作及如何工作。1) 播放/暫停按鈕</p><p> 設(shè)計(jì)這個(gè)按鈕對(duì)一個(gè)播放器來(lái)說(shuō)是最為重要的。如果一個(gè)播放器不能夠播放/暫停的話,就不能稱之為播放器了。對(duì)本播放器系統(tǒng)來(lái)說(shuō),這個(gè)按鈕集成了兩個(gè)重要的功能:“開(kāi)始播放”和“暫
34、停播放”,這樣將兩個(gè)功能集成到一個(gè)位置上的好處就是減少了界面上的按鈕的個(gè)數(shù),這使得整個(gè)界面更加簡(jiǎn)潔。這個(gè)按鈕的作用是:如果當(dāng)前播放器的狀態(tài)為正在播放,點(diǎn)擊它之后就會(huì)暫停播放;如果當(dāng)前播放器的狀態(tài)為暫停播放,點(diǎn)擊它之后就會(huì)繼續(xù)播放。如果播放器的狀態(tài)沒(méi)有播放,也不是處于暫停狀態(tài),點(diǎn)擊之后,系統(tǒng)就會(huì)從媒體播放列表中加載一個(gè)媒體文件并開(kāi)始播放。因此,基于上述功能,為實(shí)現(xiàn)播放和暫停功能,使之重疊放置,按照播放狀態(tài)的改變?cè)谕粫r(shí)間只顯示一個(gè)按鈕,這
35、樣就模擬實(shí)現(xiàn)了播放/暫停功能按鈕,如果在播放狀態(tài)時(shí)想點(diǎn)擊播放按鈕播放其他MP3可以通過(guò)菜單中實(shí)現(xiàn)。</p><p> 表 1 播放器控件的組成部分</p><p> 2) 停止按鈕的設(shè)計(jì) </p><p> 停止功能按鈕的設(shè)計(jì),是讓本播放器系統(tǒng)的使用者可以以手動(dòng)的方式來(lái)停止當(dāng)前 媒體文件的播放。如果播放器當(dāng)前沒(méi)有文件正在進(jìn)行播放時(shí),該按鈕將置為無(wú)效狀態(tài),此時(shí)該
36、按鈕不能點(diǎn)擊。 </p><p> 3) 上一首按鈕的設(shè)計(jì)</p><p> 如果沒(méi)有播放列表的話就不存在有多個(gè)媒體文件,也就不存在有上一首可以選擇了。所以,一個(gè)播放器的設(shè)計(jì)有這個(gè)功能按鈕的話,就表示它一定有一個(gè)用來(lái)保存媒體文件的播放列表。在本系統(tǒng)中,上一首按鈕設(shè)計(jì)在播放/暫停功能按鈕的前面。這樣設(shè)計(jì)的目的,是使得整個(gè)功能控制按鈕的順序與MP3文件在列表中的順序相似。 </p&g
37、t;<p> 4) 下一首按鈕的設(shè)計(jì)</p><p> 同樣,它的設(shè)計(jì)也是與播放列表的存在有關(guān),如果沒(méi)有播放列表的話就不存在有多個(gè)媒體文件,也就不存在有下一首可以選擇了。在本系統(tǒng)中,下一首按鈕設(shè)計(jì)在播放/暫停功能按鈕的后面。這樣設(shè)計(jì)的目的,是使得整個(gè)功能控制按鈕的順序與文件在列表中的順序相似。 </p><p> 5) 打開(kāi)按鈕的設(shè)計(jì)</p><p&
38、gt; 打開(kāi)功能按鈕的設(shè)計(jì),是方便用戶選擇一個(gè)媒體文件,并立即進(jìn)行播放。</p><p> 6) 列表按鈕的設(shè)計(jì) </p><p> 它主要是對(duì)播放列表窗口進(jìn)行顯示/隱藏控制,當(dāng)用戶點(diǎn)擊此按鈕后,如果當(dāng)前列表窗口的狀態(tài)為顯示狀態(tài)的話,用戶的操作將會(huì)隱藏列表窗口。相反,如果當(dāng)前列表窗口的狀態(tài)為隱藏狀態(tài),用戶的操作將會(huì)顯示列表窗口。</p><p> 7) 歌詞
39、按鈕的設(shè)計(jì)</p><p> LRC是MP3歌詞文件的格式,此按鈕可以控制歌詞顯示窗口的顯示與隱藏。當(dāng)用戶點(diǎn)擊此按鈕時(shí),將檢查歌詞顯示窗口的狀態(tài)。如果當(dāng)前狀態(tài)為顯示,則將其隱藏;反之,如果當(dāng)前狀態(tài)為隱藏,則將其顯示。</p><p><b> 8)靜音按鈕</b></p><p> 該按鈕可以控制播放器輸出聲音的開(kāi)啟和關(guān)閉。當(dāng)用戶點(diǎn)擊此按
40、鈕時(shí),系統(tǒng)將檢查播放器的聲音狀態(tài)。如果當(dāng)前聲音狀態(tài)為開(kāi)啟,則將其管理,即靜音;如果當(dāng)前聲音狀態(tài)為關(guān)閉,則將其開(kāi)啟。因?yàn)榕c音量控制有關(guān),所以在播放器中將其置于音量控制條的左方。</p><p><b> 9) 音量控制條 </b></p><p> 音量控制條的設(shè)計(jì)與音量大小和播放器的輸出音量關(guān)聯(lián),它的改變將直接影響播放器輸出音量的大小,其主要功能是用來(lái)控制系統(tǒng)播放
41、媒體文件時(shí)發(fā)出的音量大小。</p><p><b> 10)進(jìn)度控制條 </b></p><p> 進(jìn)度控制條的設(shè)計(jì),是用來(lái)方便用戶進(jìn)行控制播放媒體文件進(jìn)度的,它的移動(dòng)將直接改變媒體文件的當(dāng)前播放進(jìn)度,同時(shí)歌詞顯示實(shí)時(shí)窗口的歌詞也將按照進(jìn)度進(jìn)行調(diào)整。當(dāng)控制條滑到最左邊時(shí)表示MP3文件的初始位置,當(dāng)控制條滑到最右邊時(shí)表示當(dāng)前位置為MP3文件的最后位置。</p&
42、gt;<p><b> 播放列表界面:</b></p><p> 本播放器系統(tǒng)的播放列表窗口界面的設(shè)計(jì)主要是用來(lái)方便使用者配置管理播放 器的播放列表,以提供給播放器更完整的功能。效果如圖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) 中,播放控制主要集中在對(duì)播放器的控制界面上的操作。首先說(shuō)明的是,媒體播放器的播放控制的類(lèi)型,如表2所示</p><p> 表 2 播放控制模塊</p><p> 在本播放器中,總共有三種狀態(tài),即播放狀態(tài)、暫停狀態(tài)和停止?fàn)顟B(tài),通過(guò)表中所列的各種播放控制類(lèi)
44、型可以實(shí)現(xiàn)這三種狀態(tài)之間的轉(zhuǎn)換,其具體轉(zhuǎn)換如圖5(見(jiàn)附錄1)所示。</p><p> 下面將根據(jù)上圖的各種轉(zhuǎn)換關(guān)系,詳細(xì)介紹各種播放控制類(lèi)型的設(shè)計(jì)與實(shí)現(xiàn)</p><p><b> 播放:</b></p><p> 播放功能是媒體播放器所有控制功能中最重要的一個(gè)功能,沒(méi)有了它,播放器不能播放,也就不能稱之為播放器了。在本播放器系統(tǒng)中,當(dāng)點(diǎn)擊
45、播放會(huì)有三種狀態(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(見(jiàn)附錄1)所示。 當(dāng)播放器接收到播放命令后,會(huì)依次執(zhí)行下面的過(guò)程:</p><p> (1)檢查播放器的當(dāng)前狀態(tài)是否是暫停狀態(tài)。如果是暫停狀態(tài),那么繼續(xù)播放,如果不是暫停狀態(tài),則執(zhí)行第2步;</p><p>
46、 (2)檢查播放列表中是否有媒體文件,如果沒(méi)有則調(diào)用添加歌曲過(guò)程進(jìn)行添加,然后再次執(zhí)行本過(guò)程進(jìn)行播放;如果播放列表中有文件則執(zhí)行第3步;</p><p> (3)檢查播放列表索引,判斷是否選中了播放列表的一首MP3來(lái)進(jìn)行播放,如果沒(méi)有選擇,則選擇播放列表中的第一首后執(zhí)行第4步,如果已經(jīng)選擇了要播放的MP3 則直接執(zhí)行第4步</p><p> (4) 判斷要播放的MP3在播放列表中的位置
47、,如果是第一首則將上一首按鈕置為無(wú)效,否則置為有效;如果是最后一首,則將下一首按鈕置為無(wú)效,否則置為有效。</p><p><b> 暫停:</b></p><p> 當(dāng)用戶播放一個(gè)媒體文件到某一個(gè)特定的點(diǎn)時(shí),由于某些原因需要暫停當(dāng)前媒體文件的播放,這就要求設(shè)計(jì)的媒體播放器具有暫停播放的功能。既然是暫停播放,那么它前面的狀態(tài)就必然是播放狀態(tài),即暫停狀態(tài)只能由播放狀
48、態(tài)轉(zhuǎn)換而來(lái)。而這個(gè)狀態(tài)轉(zhuǎn)換的條件,就是在系統(tǒng)播放時(shí)用戶點(diǎn)擊暫停按鈕,暫停功能的流程如圖7(見(jiàn)附錄1)所示。</p><p><b> 停止播放:</b></p><p> 停止當(dāng)前MP3文件的播放有三種方式,第一種是當(dāng)播放器播放到當(dāng)前文件的最 后,系統(tǒng)會(huì)自動(dòng)停止播放;第二種是用戶可以點(diǎn)擊停止播放按鈕來(lái)停止當(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(wú)效功能,不能使用,直到轉(zhuǎn)換到播放狀態(tài)。停止功能的設(shè)計(jì)流程如圖8(見(jiàn)附錄1)所示。 當(dāng)播放器接收到停止命令后,會(huì)執(zhí)行以下過(guò)程: (1)設(shè)置各按鈕狀態(tài),播放為有效,暫停和停止置為無(wú)效;(2)檢查停止命令是用戶手動(dòng)停止,還是播放器播放完一首MP3后自動(dòng)轉(zhuǎn)換到停止?fàn)顟B(tài)。如果是手動(dòng)停止則使播放控件停止播放,計(jì)時(shí)器停止計(jì)時(shí),并將當(dāng)前播放進(jìn)度置0;如果是自然停止這執(zhí)行第3
50、步;(3)檢查播放模式是否是單曲播放模式,如果是則結(jié)束停止過(guò)程,否則執(zhí)行第4步; (4) 如果播放模式是循環(huán)播放且播放結(jié)束的是播放列表中的最后一首,這將播放列表的索引置0,否則直接播放下一首。</p><p><b> 上一首:</b></p><p> 上一首是針對(duì)播放列表所定義的操作。它是指用戶對(duì)播放器系統(tǒng)發(fā)送的命令(播 放上一首),然后由播放器系統(tǒng)做出播放上
51、一首的反應(yīng)。因?yàn)樵诒静シ牌飨到y(tǒng)中,如果當(dāng)前播放的MP3文件是播放列表中的第一首時(shí),上一首功能設(shè)置為無(wú)效狀態(tài),所以在系統(tǒng)發(fā)送播放上一首命令時(shí),不需要檢查當(dāng)前播放的文件是否是播放列表中的第一文件,而可以執(zhí)行播放上一首的操作。 上一首的具體流程如圖9(見(jiàn)附錄1)所示。</p><p><b> 下一首:</b></p><p> 同樣,播放下一首也是針對(duì)播放列表所定義的
52、操作。它是指用戶對(duì)播放器系統(tǒng)發(fā) 送播放下一首的命令,然后由播放器系統(tǒng)做出播放下一首的反應(yīng)。同樣,在本播放器系統(tǒng)中,如果當(dāng)前播放的文件是播放列表中最后一個(gè)文件,那么播放下一首功能會(huì)設(shè)置為無(wú)效狀態(tài),所以系統(tǒng)在響應(yīng)播放下一首命令時(shí),無(wú)需檢查當(dāng)前播放文件是否是播放列表的最后一個(gè)文件。它的具體操作過(guò)程是:當(dāng)用戶發(fā)送了播放下一首的命令后,系統(tǒng)就會(huì)停止當(dāng)前正在播放的文件,然后去播放當(dāng)前播放文件的后面一個(gè)文件。下一首功能的流程可參照?qǐng)D9。</p&
53、gt;<p><b> 打開(kāi)文件并播放:</b></p><p> 打開(kāi)文件并播放是用戶通過(guò)點(diǎn)擊打開(kāi)按鈕向系統(tǒng)發(fā)送的命令。當(dāng)系統(tǒng)接收到該命令時(shí),先會(huì)彈出一個(gè)打開(kāi)文件對(duì)話框,然后由用戶選擇所要打開(kāi)的MP3文件,把這個(gè)文件添加到播放列表,然后使用播放功能播放該文件。具體的操作流程如圖10(見(jiàn)附錄1)所示。</p><p> 向列表中添加單首 MP3 文
54、件:</p><p> 向播放列表中添加媒體文件,都是在系統(tǒng)的播放列表窗口界面上進(jìn)行操作的,以添加單首MP3文件。具體的添加過(guò)程是:當(dāng)系統(tǒng)獲取了一個(gè)添加媒體文件的命令時(shí),會(huì)彈出一個(gè)文件對(duì)話框,等待用戶選擇媒體文件,這時(shí),用戶可以選擇一個(gè)MP3文件。當(dāng)用戶點(diǎn)擊文件對(duì)話框上的打開(kāi)按鈕以后,用戶所選擇的MP3文件就會(huì)被添加到播放列表中供用戶查看和控制。</p><p> 刪除列表中的一首 M
55、P3 文件:</p><p> 對(duì)播放列表有添加功能當(dāng)然也必然存在刪除操作。在對(duì)播放列表中的MP3文件進(jìn)行刪除操作時(shí),前提是播放列表中必須有一首MP3文件被選中,否則將不會(huì)有任何事件發(fā)生。其具體操作是:當(dāng)用戶想要?jiǎng)h除一個(gè)MP3文件時(shí),首先用鼠標(biāo)選擇該文件,然后右擊音樂(lè)曲目點(diǎn)擊刪除就可以了,剩下的工作由系統(tǒng)完成。其中,系統(tǒng)所做的工作是:記錄當(dāng)前用戶所刪除的文件在列表中的索引,然后根據(jù)這個(gè)索引值刪除掉播放列表中的該
56、索引項(xiàng),然后系統(tǒng)會(huì)自動(dòng)將該項(xiàng)后面的項(xiàng)向前移動(dòng)一位。</p><p> 3.4.6 主要程序文件(代碼見(jiàn)附錄)</p><p> 1)頭文件(為類(lèi)加入相應(yīng)的標(biāo)準(zhǔn)流,庫(kù))</p><p> lrcwindow.h</p><p> musiclist.h</p><p><b> widget.h<
57、;/b></p><p> 2)源文件(完成各種類(lèi)的定義與實(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 在使用的過(guò)程中也出現(xiàn)了很多問(wèn)題,首先是版本的問(wèn)題,一開(kāi)始編寫(xiě)調(diào)試程序的時(shí)候應(yīng)當(dāng)選擇在WINDOWS下能夠直接運(yùn)行的QT SDK,下一步就是在虛擬機(jī)下QT creator的安裝這里要注意的問(wèn)題就是QT編譯環(huán)境的建立。 </p><p> 其次就是QT creator的庫(kù)依賴問(wèn)題
59、,在創(chuàng)建工程的時(shí)候可以用GUI選擇你需要依賴的Qt模塊,這樣你可以僅僅通過(guò)包含頭文件名即可正確包含頭文件,但是沒(méi)有選擇的話,你需要包含相對(duì)目錄。我此次的任務(wù)是多媒體播放器的設(shè)計(jì),而播放器需要用到QT phonon。Qt從4.4版本開(kāi)始提供的一套多媒體框架,提供多媒體回放的功能。目前在Qt 4.6中實(shí)現(xiàn)多媒體播放圖形界面主要依賴于phonon框架,它能實(shí)現(xiàn)底層的多媒體播放功能,在一般情況下上層的接口phonon模塊更適合實(shí)現(xiàn)這些功能。ph
60、onon最初是 一個(gè) 源于KDE的項(xiàng)目為使用音頻和視頻的應(yīng)用程序開(kāi)發(fā)提供的一個(gè)框架。應(yīng)用程序不用去管多媒體播放是通過(guò)什么實(shí)現(xiàn)的,如gstreamer、xine,只需調(diào)用相應(yīng)的接口就行,但這中間需要一個(gè)中轉(zhuǎn),被稱為backend。Qt也是通過(guò)phonon來(lái)實(shí)現(xiàn)夸平臺(tái)的多媒體播放。 </p><p> 最終通過(guò)編譯后可看到如附錄2的界面,可以通過(guò)按鈕實(shí)現(xiàn)播放器的簡(jiǎn)單功能。</p><p>
61、<b> 第五章 設(shè)計(jì)總結(jié)</b></p><p> 本次設(shè)計(jì)在Linux操作系統(tǒng)下,Qt作為嵌入式系統(tǒng)圖形用戶界面GUI,通過(guò)虛擬機(jī)的RedHat Enterprise Linux 5系統(tǒng)進(jìn)行模擬,基本完成了基于QT的多媒體播放器的實(shí)現(xiàn)。在嵌入式系統(tǒng)基礎(chǔ)上,主要分析了Linux操作系統(tǒng)的的特點(diǎn)和優(yōu)勢(shì),通過(guò)Linux系統(tǒng)下的QT編譯環(huán)境的學(xué)習(xí),了解了音頻解碼模塊,簡(jiǎn)單應(yīng)用的QT crea
62、tor下的phonon構(gòu)架設(shè)計(jì)了音樂(lè)播放器。 不過(guò)本次設(shè)計(jì)過(guò)程中,由于時(shí)間因素的限制,對(duì)于QT庫(kù)的研究還不夠徹底,基于QT的播放器的設(shè)計(jì)與實(shí)現(xiàn)是需要依賴phonon框架的,我從網(wǎng)上下載的所有的版本都缺乏phonon庫(kù),使得在最終結(jié)果的實(shí)現(xiàn)有了很大的阻礙。此外,在虛擬機(jī)下運(yùn)行的QT也遇到了版本的問(wèn)題,這些問(wèn)題都將在以后的學(xué)習(xí)過(guò)程中加以解決。 </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)見(jià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)用開(kāi)發(fā)完全手冊(cè),人民郵電出版社,2008年版</p><p> 6、俞建新等編,嵌入式應(yīng)用程序開(kāi)發(fā)綜合實(shí)驗(yàn)9例,清華大學(xué)出版社,2004年</p><p> 7、(英)薩默菲爾德著,白建平
65、等譯,Qt高級(jí)編程,電子工業(yè)出版社2011年</p><p> 8、鄭阿奇,《Qt 4開(kāi)發(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 打開(kāi)功能操作流程</p><p> 附錄
67、2 系統(tǒng)運(yùn)行效果</p><p> 本播放器系統(tǒng)一共有3個(gè)界面窗口,分別是播放器的主控制窗口、播放列表窗口 和歌詞顯示窗口。在此,將詳細(xì)介紹這些窗口在不同狀態(tài)下的圖示,尤其是播放器的主要播放控制窗口。播放器運(yùn)行時(shí)的整體效果如圖11所示:</p><p> 圖11播放器整體運(yùn)行時(shí)效果</p><p> 1.播放狀態(tài)時(shí)播放器主控制窗口界面 此時(shí)播放器的主控制窗口界
68、面如圖12所示。</p><p><b> 圖12 播放狀態(tài)</b></p><p> 2.暫停狀態(tài)時(shí)播放器的主控制窗口界面 此時(shí)播放器的主控制窗口界面如圖13所示</p><p><b> 圖13 暫停狀態(tài)</b></p><p> 3.停止?fàn)顟B(tài)時(shí)播放的主控制窗口界面 此時(shí)播放器的主控制窗
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、漂亮,但是會(huì)明顯增加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. 本站所有資源如無(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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 嵌入式系統(tǒng)課程設(shè)計(jì)音樂(lè)播放器
- 音樂(lè)播放器課程設(shè)計(jì)
- 音樂(lè)播放器課程設(shè)計(jì) (2)
- 音樂(lè)播放器課程設(shè)計(jì)報(bào)告
- eda課程設(shè)計(jì)—音樂(lè)播放器
- java課程設(shè)計(jì)音樂(lè)播放器
- 畢業(yè)設(shè)計(jì)(論文)+嵌入式課程設(shè)計(jì)--基于ram音樂(lè)播放器的設(shè)計(jì)與實(shí)現(xiàn)
- java課程設(shè)計(jì)---java音樂(lè)播放器
- 基于Linux的嵌入式音樂(lè)播放器設(shè)計(jì)與實(shí)現(xiàn).pdf
- 嵌入式linux電影播放器設(shè)計(jì)與實(shí)現(xiàn)
- 基于java的音樂(lè)播放器課程設(shè)計(jì)報(bào)告
- 安卓課程設(shè)計(jì)報(bào)告--個(gè)人音樂(lè)播放器
- 單片機(jī)音樂(lè)播放器課程設(shè)計(jì)報(bào)告
- 基于單片機(jī)音樂(lè)播放器課程設(shè)計(jì)
- 單片機(jī)音樂(lè)播放器課程設(shè)計(jì)報(bào)告
- 嵌入式流媒體播放器的設(shè)計(jì).pdf
- Ogg嵌入式音頻播放器的實(shí)現(xiàn).pdf
- 課程設(shè)計(jì)(論文)基于fpga的音樂(lè)播放器設(shè)計(jì)
- 基于qt的音樂(lè)播放器課程設(shè)計(jì)報(bào)告
- 基于嵌入式系統(tǒng)液晶多媒體播放器的系統(tǒng)設(shè)計(jì).pdf
評(píng)論
0/150
提交評(píng)論