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文件中添加
- 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中则表现为绿色的进度条变成了黄色:
http://blog.csdn.net/cloud_castle/article/details/43672509
Qt5官方demo解析集35——Music Player(使用winextras模块)的更多相关文章
- Qt5官方demo解析集30——Extending QML - Binding Example
本系列全部文章能够在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文Qt5官方demo解析集29--Extendin ...
- Qt5官方demo解析集13——Qt Quick Particles Examples - Image Particles
本系列全部文章能够在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文 Qt5官方demo解析集12--Qt Quic ...
- Qt5官方demo解析集28——Extending QML - Signal Support Example
本系列全部文章能够在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文Qt5官方demo解析集27--Extendin ...
- Qt5官方demo解析集(36个)
http://blog.csdn.net/cloud_castle/article/category/2123873 http://blog.csdn.net/cloud_castle/article ...
- Qt5官方demo解析集21——Extending QML - Adding Types Example
本系列全部文章能够在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 又是一个新的系列了,只是这个系列和我们之前的Chapt ...
- Qt5官方demo分析集11——Qt Quick Particles Examples - Affectors
在这个系列中的所有文章都可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文Qt5官方demo解析集10--Qt ...
- Qt5官方demo分析集29——Extending QML - Property Value Source Example
此系列的所有文章都可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文Qt5官方demo解析集28--Extend ...
- Qt5官方demo分析集10——Qt Quick Particles Examples - Emitters
此系列的所有文章都可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 前段时间去听了Qt在北京的开发人员大会,感觉QML ...
- 订餐系统之微信支付,踩了官方demo的坑
最近一个项目要增加微信支付的功能,想来这个东西出来这么久了,按微信提供的应该可以很快搞定的,结果提供的demo( JS API网页支付)中各种坑,咨询他们的客服,态度倒是非常好,就是解决不了问 ...
随机推荐
- 怎么不让控制台system.out.println()打印
1.System类有一个public static void setOut(PrintStream out)方法,你可以调用这个方法将out重定向到任何一个全局PrintStream对象上: 2.如果 ...
- PWA之Web 应用清单
原文 简书原文:https://www.jianshu.com/p/5c96242188e8 大纲 1.什么是Web 应用清单 2.“清单文件”:Web App Manifest 规范的应用 3.we ...
- Android 报错 Error:(303, 27) 错误: 找不到符号 符号: 方法 sin(float) 位置: 类 FloatMath
今天更新了sdk,升级到Android SDK 23.发现Android studio用23编译 SlidingMenu时出错,错误如下: 报错的地方这这里: float distanceInflue ...
- Android 使用Canvas在图片上绘制文字
一个小应用,在图片上绘制文字,以下是绘制文字的方法,并且能够实现自动换行,字体自动适配屏幕大小 private void drawNewBitmap(ImageView imageView, Stri ...
- .Net Core身份认证:IdentityServer4实现OAuth 2.0 客户端模式 - 简书
原文:.Net Core身份认证:IdentityServer4实现OAuth 2.0 客户端模式 - 简书 一.客户端模式介绍 客户端模式(Client Credentials Grant)是指客户 ...
- Android 自动弹出软键盘(输入键盘)
很多应用中对于一个界面比如进入搜索界面或者修改信息等等情况,为了用户体验应该自动弹出软键盘而不是让用户主动点击输入框才弹出(因为用户进入该界面必然是为了更改信息).具体实现这种效果如下: EditTe ...
- css 弹性盒模型Flex 布局
参考文章:http://www.runoob.com/w3cnote/flex-grammar.html Flex 布局是什么:采用Flex布局的元素,称为Flex容器(flex container) ...
- Redis Service
https://raw.githubusercontent.com/MSOpenTech/redis/3.0/Windows%20Service%20Documentation.md
- js进阶 10-10 可见伪类选择器和内容伪类选择器的作用
js进阶 10-10 可见伪类选择器和内容伪类选择器的作用 一.总结 一句话总结:分组来描述.内容伪类选择器就是 四个 包含.可见的伪类选择器就是可见和不可见.查找功能,也就是内容伪类选择器非常 ...
- ITFriend创业败局(四):菜鸟CEO的自我修养
自创业自封CEO以来,短短3个月,又经历了无数的磨练,快速成长中. 创业不同于打工,他要求你必须有全局观和综合能力,技术.市场.商务,啥都得会,还要处理各种各样的问题和矛盾. 根据个人经历,我总结了以 ...