Castle的博客

本系列所有文章可以在这里查看

光看标题大家可能觉得我们今天会聊一聊 Qt 中 multimedia 模块的相关内容,确实,该 demo 基于这个模块实现了一个音乐播放器,不过呢,我们今天更侧重于该 demo 中 winextras 模块的使用。

从名字可以猜到,该模块可以用来为我们提供一些Windows平台上额外的扩展功能,例如DWM(Desktop Window Manager) 特效,Aero Peek,Taskbar,Jump Lists,Thumbnail Toolbar等等,Qt为我们封装了相关API 使得它们变得更加简单易用。如果大家对这些名词感到陌生,可以前往Qt 官网查看更详细的介绍: 。或者,我给大家举几个身边的栗子:

不知道大家有没有留意过,当我们在使用Qt Creator 进行构建时,其任务栏图标上的进度状态?

或者当我们将鼠标左键放在QQ音乐任务栏图标上时,出现的上一曲、暂停、下一曲这些预览窗口按钮:

亦或是,右键点击QQ音乐出现的最近收听列表:

等等之类,我就不一一列举了,站在GUI的角度来说,这些东西绝不是可有可无的

细节决定成败,用户总是能够在一些小的细节上收获惊喜和感动。

那么,看看我们如何在 Qt 中使用这些贴心的小玩意儿。

记得在pro文件中添加

QT += winextras

然后看看main.cpp,这里面有个实用的关联文件格式的helper函数:

#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中则表现为绿色的进度条变成了黄色:

没有什么可凭仗,只有他的好身体,没有地方可去,只想到处流浪。

Castle的博客

相关文章:

你感兴趣的文章:

标签云: