這次使用Qt實現的是一個本地音樂播放器,可以播放下載在計算機本地的音樂,提供了添加歌曲,歌曲列表,清空列表的功能。默認歌曲列表循環播放。音樂播放的實現主要依賴的是Qt 的多媒體框架phonon。該音樂播放器的開發環境是Qt4.8.5+Qtcreator2.8.0。
音樂播放器界面如下:
主界面
歌曲列表
一、使用Qt Phonon框架播放音樂
想要寫一個音樂播放器,最基本的當然就是要知道使用這個框架來播放音樂以及一些基本的播放控制比如暫停、停止、下一首等。只有知道了這些基本的東西,后面才可以將界面的按鈕映射到實際的音樂播放代碼中,實現播放器的功能。
在Qt4版本中,可以通過Phonon模塊播放音樂。Phonon是一個跨平台的多媒體框架。但是,Phonon嚴格來說並不是Qt的庫。Phonon原本就是KDE 4的開放原始碼多媒體API,后來與Qt合並與開發。所以在Qt4.8.5中,我們可以使用該模塊播放媒體音樂。(Qt5中似乎將該模塊移除了,並用新的模塊代替)。
使用Phonon模塊來播放音樂的基本實現代碼如下,當播放音頻時,需要創建一個媒體對象,然后將它連接到一個音頻輸出節點,該節點由AudioOutput類提供,用來將音頻輸出到聲卡。
Phonon::MediaObject *music;//聲明媒體對象 Phonon::AudioOutput *audioout; Phonon::Path path; music=new Phonon::MediaObject; music->setCurrentSource(Phonon::MediaSource(songAddr));//songAddr是QString類型變量 audioout=new Phonon::AudioOutput(Phonon::MusicCategory,this); path=Phonon::createPath(music,audioout); music->play();//播放 music->pause();//暫停,再次調用play()時將接着暫停點接着播放 music->stop();//停止,再次調用play()函數時將從頭播放 Phonon::SeekSlider *slider;//聲明進度條 slider=new Phonon::SeekSlider;//將進度條與媒體對象連接 slider->setMediaObject(music);//將進度條與媒體對象連接 Phonon::VolumeSlider *voiceSlider=new Phonon::VolumeSlider; voiceSlider->setAudioOutput(audioout);//將音量控件與音頻設備連接
二、界面設計——布局管理器和無邊框窗口
為了界面的美化、將Qt窗口默認的邊框去掉了,這樣可以自由的對窗口進行美化(外面不會再有一個難看的框框影響美觀^_^)。但是,去掉邊框帶來的后果是,沒法拖動窗口。當然,這個最后可以通過重寫相關的函數解決。
界面的布局主要如下圖所示。實現這樣的布局,當然是通過布局管理器。Qt提供了水平布局管理器和垂直布局管理器,整個播放器就是使用這兩個布局管理器來布局的。靈活的使用這兩個布局管理器可以很快的構建出一個排放整齊的界面。當然,要注意,一個窗口只能有一個主要的布局管理器。但是,我們可以通過布局管理器的“嵌套”來實現自定義的布局管理器。在Qt中,一個布局管理器中可以放入多個控件或者放入布局管理器或者混合放入(既有布局管理器又有控件)。下圖便是通過這樣的方法實現的。
三、無邊框窗口的拖動
前面說過,去掉邊框將導致沒法拖動窗口,因為這時我們沒法點擊標題欄。所以,我們需要重寫QWidget的mousePressEvent函數和mouseMoveEvent函數來實現無邊框窗口的拖動。
void PlayerUI::mousePressEvent(QMouseEvent *event) {
/*在這里還可以添加鼠標點擊的范圍,在鼠標點擊頂部某一部分的區域時可以拖動窗口,點擊其他地方沒法拖動*/ if(event->button()==Qt::LeftButton){ dragPosition=event->globalPos()-frameGeometry().topLeft(); event->accept(); } if(event->button()==Qt::RightButton){ return ; } } void PlayerUI::mouseMoveEvent(QMouseEvent *event) { if(event->buttons()==Qt::LeftButton){ move(event->globalPos()-dragPosition); event->accept(); } }
四、控件美化
Qt是一款基於C++的圖形界面框架,它提供了基本的界面類,我們可以用這個界面類來編寫自己的GUI程序。但是,Qt提供的都是一些最基本的框架,美觀上自然達不到我們的要求。我們自然要對控件進行美化。
對於最下面的播放/暫停按鈕,上一首、下一首按鈕,通過設置按鈕透明,再插入圖片來實現美化,可以達到挺好的美化效果,但是在設置進度條時使用setstylesheet()來設置會比較好。進度條的效果如下圖。【QSlider的樣式設置可以參考這篇博客,里面有完整的代碼。[傳送門]】
Phonon::SeekSlider *slider; slider=new Phonon::SeekSlider; slider->setStyleSheet("QSlider::groove:horizontal{border: 1px solid #165708;background: #8f8f8f;height: 3px;border-radius: 2px;padding-left:-1px;padding-right:-1px;}QSlider::handle:horizontal{border:2px solid #454343;background:#2af5b9;width:9px;margin-top: -4px;margin-bottom: -4px;border-radius: 4px;} QSlider::sub-page:horizontal {background:#2af5b9;border: 1px solid #4A708B;height: 10px;border-radius: 2px;}QSlider::add-page:horizontal {background: #615f5f;border: 0px solid #2af5b9;height: 10px;border-radius: 2px;}");
需要注意的是,在進行樣式設置時,要在一個setStylesheet()函數中寫完,而不要分開寫,不然可能會看不到效果。另外,如果設置的參數中出現矛盾的,也可能會使樣式不起作用。
音量控制條的樣式也是參考上面的代碼的。他們的實現方法一樣:
voiceSlider=new Phonon::VolumeSlider; voiceSlider->setStyleSheet("QSlider::groove:vertical{border: 1px solid #454343;background:qlineargradient(x1:0, y1:0, x2:0, y2:1,stop:0 #3c3a3a,stop:1 #d6d3d3);;height:130px;width:3px;border-radius: 2px;padding-top:-1px;padding-bottom:-1px;}QSlider::handle:vertical{border:1px solid #454343;background:#2af5b9;height:11px;margin-left: -4px;margin-right: -4px;border-radius: 4px;}");
五、使用QTabelWidget實現歌曲播放列表
在歌曲列表的實現上,主要是使用QTableWidget類。QTableWidget的使用可參考網上教程【傳送門】。
我在歌曲列表的實現上,只保留了一列,用來顯示歌名,然后再使用樣式表設置來實現一定的美化,去掉了邊框、表頭邊框等。
六、小收獲、小總結
最初,在Qt吧中看到有個大神完成了音樂播放器的程序並且發帖送出了源碼。當時就佩服得五體投地。后來,就萌生了自己寫個音樂播放器的想法。
這個播放器可以說是我第一個具有完整功能的程序。在整個程序的實現過程中,也遇到了很多困難,因為Qt中的很多控件我還是沒有用過的,所以在寫的過程中,不斷的百度、谷歌以及查看內置的開發文檔。不斷的寫代碼測試,測試這樣寫實現的效果是什么、是否可以實現預期的功能、如何處理播放邏輯等等。就是在這樣的過程中,代碼從0開始,一行行積累起來,最終實現了這個播放器。
在整個過程中,不得不說還是收獲了很多。最基本的,我對Qt的了解又多了一些,對Qt的使用更加的熟悉。也許Qt不能給我帶來什么,但是,我很享受這個學習的過程,很享受自己從零開始實現某件事情的過程,它給我帶來巨大的成就感。另外,在寫代碼的過程中,也發現了自己代碼不規范的問題,包括命名到程序結構,不得不說,好爛。我自己都有這樣的感覺。所以啊,還要繼續努力呀。在以后的編程過程中,要從命名、結構等考慮自己寫的東西,逐漸養成良好的編程好習慣。