本系列所有文章可以在這里查看[http://blog.csdn.net/cloud_castle/article/category/2123873](http://blog.csdn.net/cloud_castle/article/category/2123873)
接上文[](http://blog.csdn.net/cloud_castle/article/details/39251931)[](http://blog.csdn.net/cloud_castle/article/details/39291069)[Qt5官方demo解析集34——Concentric Circles Example](http://blog.csdn.net/cloud_castle/article/details/43490767)
光看標題大家可能覺得我們今天會聊一聊 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文件中添加
~~~
QT?+=?winextras
~~~
然后看看main.cpp,這里面有個實用的關聯文件格式的helper函數:
**[cpp]**?[view plain](http://blog.csdn.net/cloud_castle/article/details/43672509# "view plain")[copy](http://blog.csdn.net/cloud_castle/article/details/43672509# "copy")[](https://code.csdn.net/snippets/605094 "在CODE上查看代碼片")[](https://code.csdn.net/snippets/605094/fork "派生到我的代碼片")
~~~
#include "musicplayer.h"
#include <QApplication>
#include <QFileInfo>
#include <QSettings>
#include <QIcon>
#include <QDir>
//! [0]
static void associateFileTypes(const QStringList &fileTypes) // 這是一個helper函數,用來將某文件格式與本程序關聯
{
QString displayName = QGuiApplication::applicationDisplayName();
QString filePath = QCoreApplication::applicationFilePath();
QString fileName = QFileInfo(filePath).fileName();
QSettings settings("HKEY_CURRENT_USER\\Software\\Classes\\Applications\\" + fileName, QSettings::NativeFormat);
settings.setValue("FriendlyAppName", displayName);
settings.beginGroup("SupportedTypes");
foreach (const QString& fileType, fileTypes)
settings.setValue(fileType, QString());
settings.endGroup();
settings.beginGroup("shell");
settings.beginGroup("open");
settings.setValue("FriendlyAppName", displayName);
settings.beginGroup("Command");
settings.setValue(".", QChar('"') + QDir::toNativeSeparators(filePath) + QString("\" \"%1\""));
}
//! [0]
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
app.setApplicationName("MusicPlayer");
app.setOrganizationName("QtWinExtras");
app.setOrganizationDomain("qt-project.org");
app.setApplicationDisplayName("QtWinExtras Music Player");
app.setWindowIcon(QIcon(":/logo.png"));
associateFileTypes(QStringList(".mp3")); // helper函數的使用方式
MusicPlayer player;
const QStringList arguments = QCoreApplication::arguments();
if (arguments.size() > 1) // 如果打開參數包含文件名
player.playFile(arguments.at(1)); // 則開始播放第一首
player.resize(300, 60);
player.show();
return app.exec();
}
~~~
VolumeButton 類繼承自QToolButton,使用 Qt 中的標準音量圖像設置為自身圖標,
~~~
setIcon(style()->standardIcon(QStyle::SP_MediaVolume));
~~~
并提供了一個可以調節音量的彈出菜單,并根據DWM的混合狀態決定自身的顯示狀態,代碼都很容易理解,就不貼出來了。
在MusicPlayer類中,首先記得
~~~
#include <QtWinExtras>
~~~
然后我們通過下面的函數來創建Jump Lists:
~~~
void MusicPlayer::createJumpList()
{
QWinJumpList jumplist;
jumplist.recent()->setVisible(true);
}
~~~
Taskbar的創建與Progress類似,我們將其與窗口上的進度條關聯起來:
~~~
void MusicPlayer::createTaskbar()
{
taskbarButton = new QWinTaskbarButton(this);
taskbarButton->setWindow(windowHandle()); // 使用窗口句柄作為參數
taskbarProgress = taskbarButton->progress();
connect(positionSlider, SIGNAL(valueChanged(int)), taskbarProgress, SLOT(setValue(int)));
connect(positionSlider, SIGNAL(rangeChanged(int,int)), taskbarProgress, SLOT(setRange(int,int)));
connect(&mediaPlayer, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(updateTaskbar()));
}
~~~
要創建預覽窗口按鈕,首先需要創建一個QWinThumbnailToolBar,然后在上面添加按鈕:
~~~
void MusicPlayer::createThumbnailToolBar()
{
thumbnailToolBar = new QWinThumbnailToolBar(this);
thumbnailToolBar->setWindow(windowHandle());
playToolButton = new QWinThumbnailToolButton(thumbnailToolBar);
playToolButton->setEnabled(false);
playToolButton->setToolTip(tr("Play"));
playToolButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
connect(playToolButton, SIGNAL(clicked()), this, SLOT(togglePlayback()));
forwardToolButton = new QWinThumbnailToolButton(thumbnailToolBar);
forwardToolButton->setEnabled(false);
forwardToolButton->setToolTip(tr("Fast forward"));
forwardToolButton->setIcon(style()->standardIcon(QStyle::SP_MediaSeekForward));
connect(forwardToolButton, SIGNAL(clicked()), this, SLOT(seekForward()));
backwardToolButton = new QWinThumbnailToolButton(thumbnailToolBar);
backwardToolButton->setEnabled(false);
backwardToolButton->setToolTip(tr("Rewind"));
backwardToolButton->setIcon(style()->standardIcon(QStyle::SP_MediaSeekBackward));
connect(backwardToolButton, SIGNAL(clicked()), this, SLOT(seekBackward()));
thumbnailToolBar->addButton(backwardToolButton);
thumbnailToolBar->addButton(playToolButton);
thumbnailToolBar->addButton(forwardToolButton);
connect(&mediaPlayer, SIGNAL(positionChanged(qint64)), this, SLOT(updateThumbnailToolBar()));
connect(&mediaPlayer, SIGNAL(durationChanged(qint64)), this, SLOT(updateThumbnailToolBar()));
connect(&mediaPlayer, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(updateThumbnailToolBar()));
}
~~~
最后我們看看程序運行效果:

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

- 前言
- 1——Fortune Server/Client
- 2——Multicast Sender/Receiverz
- 3——Broadcast Sender/Receiver
- 4——Blocking Fortune Client
- 5——Threaded Fortune Server
- 5(總結)——Fortune例程的各個實現區別
- 6——Loopback Example
- 7——Analog Clock Example
- 8——Shaped Clock Example
- 9——Analog Clock Window Example
- 10——Qt Quick Particles Examples - Emitters
- 11——Qt Quick Particles Examples - Affectors
- 12——Qt Quick Particles Examples - CustomParticles
- 13——Qt Quick Particles Examples - Image Particles
- 14——Qt Quick Particles Examples - System
- 15——Chapter 1: Creating a New Type
- 16——Chapter 2: Connecting to C++ Methods and Signals
- 17——Chapter 3: Adding Property Bindings
- 18——Chapter 4: Using Custom Property Types
- 19——Chapter 5: Using List Property Types
- 20——Chapter 6: Writing an Extension Plugin
- 21——Extending QML - Adding Types Example
- 22——Extending QML - Object and List Property Types Example
- 23——Extending QML - Inheritance and Coercion Example
- 24——Extending QML - Default Property Example
- 25——Extending QML - Methods Example
- 26——Extending QML - Grouped Properties Example
- 27——Extending QML - Attached Properties Example
- 28——Extending QML - Signal Support Example
- 29——Extending QML - Property Value Source Example
- 30——Extending QML - Binding Example
- 31——StocQt
- 32——Qt Quick Examples - Threading
- 33——Qt Quick Examples - Window and Screen
- 34——Concentric Circles Example
- 35——Music Player
- 36——Wiggly Example
- 37——Vector Deformation