Qt5官方demo解析集35——Music Player
来源:互联网 发布:python post文件 编辑:程序博客网 时间:2024/05/16 12:44
本系列所有文章可以在这里查看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文件中添加
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();}
setIcon(style()->standardIcon(QStyle::SP_MediaVolume));
并提供了一个可以调节音量的弹出菜单,并根据DWM的混合状态决定自身的显示状态,代码都很容易理解,就不贴出来了。
在MusicPlayer类中,首先记得
#include <QtWinExtras>
然后我们通过下面的函数来创建Jump Lists:
void MusicPlayer::createJumpList(){ QWinJumpList jumplist; jumplist.recent()->setVisible(true);}
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中则表现为绿色的进度条变成了黄色:
- Qt5官方demo解析集35——Music Player
- Qt5官方demo解析集6——Loopback Example
- Qt5官方demo解析集31——StocQt
- Qt5官方demo解析集36——Wiggly Example
- Qt5官方demo解析集36——Wiggly Example
- Qt5官方demo解析集36——Wiggly Example
- Qt5官方demo解析集37——Vector Deformation
- Qt5官方Demo解析集1——Fortune Server/Client
- Qt5官方Demo解析集2——Multicast Sender/Receiverz
- Qt5官方Demo解析集3——Broadcast Sender/Receiver
- Qt5官方Demo解析集4——Blocking Fortune Client
- Qt5官方Demo解析集5——Threaded Fortune Server
- Qt5官方Demo解析集5(总结)——Fortune例程的各个实现区别
- Qt5官方demo解析集7——Analog Clock Example
- Qt5官方demo解析集8——Shaped Clock Example
- Qt5官方demo解析集9——Analog Clock Window Example
- Qt5官方demo解析集10——Qt Quick Particles Examples - Emitters
- Qt5官方demo解析集11——Qt Quick Particles Examples - Affectors
- 在Linux下运行C语言程序
- J2EE 13种技术
- 手机、浏览器的分辨率、状态栏参数
- Simple iPhone Keychain Access
- cronExpression 值的介绍和复制实例
- Qt5官方demo解析集35——Music Player
- 安卓开发中Theme.AppCompat.Light的解决方法
- cgroup 管理cpu资源
- hdu 1536 dfs求取sg函数
- the weblogic8.1 the portable Bean weblogic9.2 already exists: "weblogic.j2ee.descriptor.ServletMappi
- mongodb c++ driver 1.0.0和protobuf v3.0.0-alpha-1的几个特点.
- platform设备驱动全透析
- Android实现计时与倒计时的几种方法
- 基于web的AssetBundle的研究