Qt5官方demo解析集35——Music Player(使用winextras模塊)


本系列所有文章可以在這里查看http://blog.csdn.net/cloud_castle/article/category/2123873

接上文Qt5官方demo解析集34——Concentric Circles Example

 

光看標題大家可能覺得我們今天會聊一聊 Qt 中 multimedia 模塊的相關內容,確實,該 demo 基於這個模塊實現了一個音樂播放器,不過呢,我們今天更側重於該 demo 中 winextras 模塊的使用。

從名字可以猜到,該模塊可以用來為我們提供一些Windows平台上額外的擴展功能,例如DWM(Desktop Window Manager) 特效,Aero Peek,Taskbar,Jump Lists,Thumbnail Toolbar等等,Qt為我們封裝了相關 API 使得它們變得更加簡單易用。如果大家對這些名詞感到陌生,可以前往Qt 官網查看更詳細的介紹:http://doc.qt.io/qt-5/qtwinextras-overview.html 。或者,我給大家舉幾個身邊的栗子:

 

不知道大家有沒有留意過,當我們在使用 Qt Creator 進行構建時,其任務欄圖標上的進度狀態?

 

或者當我們將鼠標左鍵放在QQ音樂任務欄圖標上時,出現的上一曲、暫停、下一曲這些預覽窗口按鈕:

 

亦或是,右鍵點擊QQ音樂出現的最近收聽列表:

 

等等之類,我就不一一列舉了,站在GUI的角度來說,這些東西絕不是可有可無的

細節決定成敗,用戶總是能夠在一些小的細節上收獲驚喜和感動。

 

那么,看看我們如何在 Qt 中使用這些貼心的小玩意兒。

記得在pro文件中添加

 

[cpp]  view plain  copy
 
  1. QT += winextras  

 

 

然后看看main.cpp,這里面有個實用的關聯文件格式的helper函數:

 

[cpp]  view plain  copy
 
  1. #include "musicplayer.h"  
  2.   
  3. #include <QApplication>  
  4. #include <QFileInfo>  
  5. #include <QSettings>  
  6. #include <QIcon>  
  7. #include <QDir>  
  8.   
  9. //! [0]  
  10. static void associateFileTypes(const QStringList &fileTypes) // 這是一個helper函數,用來將某文件格式與本程序關聯  
  11. {  
  12.     QString displayName = QGuiApplication::applicationDisplayName();  
  13.     QString filePath = QCoreApplication::applicationFilePath();  
  14.     QString fileName = QFileInfo(filePath).fileName();  
  15.   
  16.     QSettings settings("HKEY_CURRENT_USER\\Software\\Classes\\Applications\\" + fileName, QSettings::NativeFormat);  
  17.     settings.setValue("FriendlyAppName", displayName);  
  18.   
  19.     settings.beginGroup("SupportedTypes");  
  20.     foreach (const QString& fileType, fileTypes)  
  21.         settings.setValue(fileType, QString());  
  22.     settings.endGroup();  
  23.   
  24.     settings.beginGroup("shell");  
  25.     settings.beginGroup("open");  
  26.     settings.setValue("FriendlyAppName", displayName);  
  27.     settings.beginGroup("Command");  
  28.     settings.setValue(".", QChar('"') + QDir::toNativeSeparators(filePath) + QString("\" \"%1\""));  
  29. }  
  30. //! [0]  
  31.   
  32. int main(int argc, char *argv[])  
  33. {  
  34.     QApplication app(argc, argv);  
  35.     app.setApplicationName("MusicPlayer");  
  36.     app.setOrganizationName("QtWinExtras");  
  37.     app.setOrganizationDomain("qt-project.org");  
  38.     app.setApplicationDisplayName("QtWinExtras Music Player");  
  39.     app.setWindowIcon(QIcon(":/logo.png"));  
  40.   
  41.     associateFileTypes(QStringList(".mp3"));                // helper函數的使用方式  
  42.   
  43.     MusicPlayer player;  
  44.     const QStringList arguments = QCoreApplication::arguments();  
  45.     if (arguments.size() > 1)                              // 如果打開參數包含文件名  
  46.         player.playFile(arguments.at(1));                  // 則開始播放第一首  
  47.     player.resize(300, 60);  
  48.     player.show();  
  49.   
  50.     return app.exec();  
  51. }  

 

 

VolumeButton 類繼承自QToolButton,使用 Qt 中的標准音量圖像設置為自身圖標,

 

 

[cpp]  view plain  copy
 
  1. setIcon(style()->standardIcon(QStyle::SP_MediaVolume));  

 

並提供了一個可以調節音量的彈出菜單,並根據DWM的混合狀態決定自身的顯示狀態,代碼都很容易理解,就不貼出來了。

 

在MusicPlayer類中,首先記得

 

[cpp]  view plain  copy
 
  1. #include <QtWinExtras>  

 

 

然后我們通過下面的函數來創建Jump Lists:

 

[cpp]  view plain  copy
 
  1. void MusicPlayer::createJumpList()  
  2. {  
  3.     QWinJumpList jumplist;  
  4.     jumplist.recent()->setVisible(true);  
  5. }  

 

 

Taskbar的創建與Progress類似,我們將其與窗口上的進度條關聯起來:

 

[cpp]  view plain  copy
 
  1. void MusicPlayer::createTaskbar()  
  2. {  
  3.     taskbarButton = new QWinTaskbarButton(this);  
  4.     taskbarButton->setWindow(windowHandle());  // 使用窗口句柄作為參數  
  5.   
  6.     taskbarProgress = taskbarButton->progress();  
  7.     connect(positionSlider, SIGNAL(valueChanged(int)), taskbarProgress, SLOT(setValue(int)));  
  8.     connect(positionSlider, SIGNAL(rangeChanged(int,int)), taskbarProgress, SLOT(setRange(int,int)));  
  9.   
  10.     connect(&mediaPlayer, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(updateTaskbar()));  
  11. }  


要創建預覽窗口按鈕,首先需要創建一個QWinThumbnailToolBar,然后在上面添加按鈕:

 

 

[cpp]  view plain  copy
 
  1. void MusicPlayer::createThumbnailToolBar()  
  2. {  
  3.     thumbnailToolBar = new QWinThumbnailToolBar(this);  
  4.     thumbnailToolBar->setWindow(windowHandle());  
  5.   
  6.     playToolButton = new QWinThumbnailToolButton(thumbnailToolBar);  
  7.     playToolButton->setEnabled(false);  
  8.     playToolButton->setToolTip(tr("Play"));  
  9.     playToolButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));  
  10.     connect(playToolButton, SIGNAL(clicked()), this, SLOT(togglePlayback()));  
  11.   
  12.     forwardToolButton = new QWinThumbnailToolButton(thumbnailToolBar);  
  13.     forwardToolButton->setEnabled(false);  
  14.     forwardToolButton->setToolTip(tr("Fast forward"));  
  15.     forwardToolButton->setIcon(style()->standardIcon(QStyle::SP_MediaSeekForward));  
  16.     connect(forwardToolButton, SIGNAL(clicked()), this, SLOT(seekForward()));  
  17.   
  18.     backwardToolButton = new QWinThumbnailToolButton(thumbnailToolBar);  
  19.     backwardToolButton->setEnabled(false);  
  20.     backwardToolButton->setToolTip(tr("Rewind"));  
  21.     backwardToolButton->setIcon(style()->standardIcon(QStyle::SP_MediaSeekBackward));  
  22.     connect(backwardToolButton, SIGNAL(clicked()), this, SLOT(seekBackward()));  
  23.   
  24.     thumbnailToolBar->addButton(backwardToolButton);  
  25.     thumbnailToolBar->addButton(playToolButton);  
  26.     thumbnailToolBar->addButton(forwardToolButton);  
  27.   
  28.     connect(&mediaPlayer, SIGNAL(positionChanged(qint64)), this, SLOT(updateThumbnailToolBar()));  
  29.     connect(&mediaPlayer, SIGNAL(durationChanged(qint64)), this, SLOT(updateThumbnailToolBar()));  
  30.     connect(&mediaPlayer, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(updateThumbnailToolBar()));  
  31. }  

 

 

最后我們看看程序運行效果:


在Win7下當我們暫停播放時,任務欄會出現一個暫停樣式的圖標,而在Win8中則表現為綠色的進度條變成了黃色:

 

 

http://blog.csdn.net/cloud_castle/article/details/43672509


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM