<!-- [if !mso]> <mce:style><!-- v/:* {behavior:url(#default#VML);} o/:* {behavior:url(#default#VML);} w/:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} --> <!-- [endif]--><!-- [if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:PunctuationKerning/> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:Compatibility> <w:SpaceForUL/> <w:BalanceSingleByteDoubleByteWidth/> <w:DoNotLeaveBackslashAlone/> <w:ULTrailSpace/> <w:DoNotExpandShiftReturn/> <w:AdjustLineHeightInTable/> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:UseFELayout/> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!-- [if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--><!-- [if !mso]> <object classid="clsid:38481807-CA0E-42D2-BF39-B33AF135CC4D" id=ieooui> </object> <mce:style><!-- st1/:*{behavior:url(#ieooui) } --> <!-- [endif]--> <!-- /* Font Definitions */ @font-face {font-family:宋體; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@宋體"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋體; mso-font-kerning:1.0pt;} a:link, span.MsoHyperlink {color:blue; text-decoration:underline; text-underline:single;} a:visited, span.MsoHyperlinkFollowed {color:purple; text-decoration:underline; text-underline:single;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} /* List Definitions */ @list l0 {mso-list-id:1266185948; mso-list-type:hybrid; mso-list-template-ids:1862710722 981369336 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l0:level1 {mso-level-text:%1、; mso-level-tab-stop:39.0pt; mso-level-number-position:left; margin-left:39.0pt; text-indent:-18.0pt;} ol {margin-bottom:0cm;} ul {margin-bottom:0cm;} --> <!-- [if gte mso 10]> <mce:style><!-- /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} --> <!-- [endif]-->
2010-2-13
使用
Qt
做一個簡易音樂播放器【
Phonon
淺談
--
續】
在第一篇
Phonon
淺談
中提及到了
Phonon
這個多媒體框架的一些基本知識,于是想著結合這些基本知識來實踐一番,做一個簡單的音樂播放器。
【步驟一】
新建一個
Qt Gui
工程,在建立過程中需要包含
Phonon
模塊,之后生成文件如下圖:
<!-- [if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter"/> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0"/> <v:f eqn="sum @0 1 0"/> <v:f eqn="sum 0 0 @1"/> <v:f eqn="prod @2 1 2"/> <v:f eqn="prod @3 21600 pixelWidth"/> <v:f eqn="prod @3 21600 pixelHeight"/> <v:f eqn="sum @0 0 1"/> <v:f eqn="prod @6 1 2"/> <v:f eqn="prod @7 21600 pixelWidth"/> <v:f eqn="sum @8 21600 0"/> <v:f eqn="prod @7 21600 pixelHeight"/> <v:f eqn="sum @10 21600 0"/> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/> <o:lock v:ext="edit" aspectratio="t"/> </v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style='width:148.5pt; height:115.5pt'> <v:imagedata src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.jpg" mce_src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.jpg" o:title="0"/> </v:shape><![endif]--><!-- [if !vml]-->
<!-- [endif]-->
Qt Gui
工程會生成一個
ui
文件,在這里是
mainwindow.ui
。雙擊
mainwindow.ui
進行一番簡單的布局,如下圖:
<!-- [if gte vml 1]><v:shape id="_x0000_i1026" type="#_x0000_t75" style='width:219pt;height:252.75pt'> <v:imagedata src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image002.jpg" mce_src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image002.jpg" o:title="2"/> </v:shape><![endif]--><!-- [if !vml]-->
<!-- [endif]-->
關于這個
ui
界面,中央位置是一個
QListWidget
,用來顯示音樂文件列表;下面一欄紅色矩形是一個
QVBoxLayout
垂直布局部件,用來確定等會要建立的播放進度條的位置;而下面則是四個相關控制按鈕。
大概地說,
Phonon
的工作機制是使用
MediaObject
來管理
MediaSource
即源文件,通過
Path
連接到
AudioOutput
,最后是由
AudioOutput
將數據發送到相關物理設備。
于是有了步驟二。
【步驟二】
步驟一是用來實現基本的界面,而步驟二是用代碼實現具體的功能。
基于對
Phonon
的認識,有了以下四點:
<!-- [if supportFields]><span lang=EN-US><span style='mso-element:field-begin'></span><span style="mso-spacerun:yes" mce_style="mso-spacerun:yes"> </span>= 1 /* GB3 <span style="mso-element:field-separator" mce_style="mso-element:field-separator"></span></span><![endif]-->
①
<!-- [if supportFields]><span lang=EN-US><span style="mso-element:field-end" mce_style="mso-element:field-end"></span></span><![endif]-->
使用
MediaObject
管理媒體源
<!-- [if supportFields]><span lang=EN-US><span style='mso-element:field-begin'></span><span style="mso-spacerun:yes" mce_style="mso-spacerun:yes"> </span>= 2 /* GB3 <span style="mso-element:field-separator" mce_style="mso-element:field-separator"></span></span><![endif]-->
②
<!-- [if supportFields]><span lang=EN-US><span style="mso-element:field-end" mce_style="mso-element:field-end"></span></span><![endif]-->
使用
AudioOutput
連接物理設備
<!-- [if supportFields]><span lang=EN-US><span style='mso-element:field-begin'></span><span style="mso-spacerun:yes" mce_style="mso-spacerun:yes"> </span>= 3 /* GB3 <span style="mso-element:field-separator" mce_style="mso-element:field-separator"></span></span><![endif]-->
③
<!-- [if supportFields]><span lang=EN-US><span style="mso-element:field-end" mce_style="mso-element:field-end"></span></span><![endif]-->
使用
SeekSlider
實現進度條
<!-- [if supportFields]><span lang=EN-US><span style='mso-element:field-begin'></span><span style="mso-spacerun:yes" mce_style="mso-spacerun:yes"> </span>= 4 /* GB3 <span style="mso-element:field-separator" mce_style="mso-element:field-separator"></span></span><![endif]-->
④
<!-- [if supportFields]><span lang=EN-US><span style="mso-element:field-end" mce_style="mso-element:field-end"></span></span><![endif]-->
使用
QList
實現播放列表
于是產生了相應的代碼:
并且需要在構造函數里面將
mediaObject
和
audioOutput
連接起來:
從而使得數據能從
mediaObject
到達
audioOutput
,再通過物理設備播放。
<!-- [if !supportLists]-->
1、
<!-- [endif]-->
要播放音樂首先需要有源文件,所以先實現添加文件的功能。
首先,將添加按鈕和添加功能連接起來:
從而實現點擊按鈕激活相應操作的功能,而添加音樂文件的槽的代碼如下:
上述代碼是使用
QFileDialog
的
getOpenFileNames
方法獲取若干個音樂文件,然后再使用
Qt
中的
foreach
遍歷每個選中的文件,將其添加到播放列表中。
<!-- [if !supportLists]-->
2、
<!-- [endif]-->
播放、暫停和停止的基本實現
同樣的先將信號和槽連接起來:
之后再具體實現相應的簡單功能,這里列出
playFile
的代碼:
首先判斷列表是否為空,接著設置播放隊列,然后播放當前文件,最后使得播放按鈕不可用,而激活暫停按鈕。其它的功能類似,都是使用
mediaObject
的方法。
【步驟三】
這里只簡單地實現播放功能,當然還是可以再繼續擴展功能,不過這是后話了。
運行的效果圖如下:
<!-- [if gte vml 1]><v:shape id="_x0000_i1027" type="#_x0000_t75" style='width:222pt;height:266.25pt'> <v:imagedata src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.jpg" mce_src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.jpg" o:title="3"/> </v:shape><![endif]--><!-- [if !vml]-->
此時就能聽見蠻好聽的《左邊》了^_^
以下是全部代碼:
mainwindow.h:
mainwindow.cpp:
main.cpp:
使用Qt做一個簡易音樂播放器【Phonon淺談--續】