在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()));
}