• 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文件中添加

    [cpp] view plain copy
     
    1. QT += winextras  

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

    [cpp] view plain copy
     
    1. #include "musicplayer.h"  
    2.   
    3. #include <QApplication>  
    4. #include <QFileInfo>  
    5. #include <QSettings>  
    6. #include <QIcon>  
    7. #include <QDir>  
    8.   
    9. //! [0]  
    10. static void associateFileTypes(const QStringList &fileTypes) // 这是一个helper函数,用来将某文件格式与本程序关联  
    11. {  
    12.     QString displayName = QGuiApplication::applicationDisplayName();  
    13.     QString filePath = QCoreApplication::applicationFilePath();  
    14.     QString fileName = QFileInfo(filePath).fileName();  
    15.   
    16.     QSettings settings("HKEY_CURRENT_USER\Software\Classes\Applications\" + fileName, QSettings::NativeFormat);  
    17.     settings.setValue("FriendlyAppName", displayName);  
    18.   
    19.     settings.beginGroup("SupportedTypes");  
    20.     foreach (const QString& fileType, fileTypes)  
    21.         settings.setValue(fileType, QString());  
    22.     settings.endGroup();  
    23.   
    24.     settings.beginGroup("shell");  
    25.     settings.beginGroup("open");  
    26.     settings.setValue("FriendlyAppName", displayName);  
    27.     settings.beginGroup("Command");  
    28.     settings.setValue(".", QChar('"') + QDir::toNativeSeparators(filePath) + QString("" "%1""));  
    29. }  
    30. //! [0]  
    31.   
    32. int main(int argc, char *argv[])  
    33. {  
    34.     QApplication app(argc, argv);  
    35.     app.setApplicationName("MusicPlayer");  
    36.     app.setOrganizationName("QtWinExtras");  
    37.     app.setOrganizationDomain("qt-project.org");  
    38.     app.setApplicationDisplayName("QtWinExtras Music Player");  
    39.     app.setWindowIcon(QIcon(":/logo.png"));  
    40.   
    41.     associateFileTypes(QStringList(".mp3"));                // helper函数的使用方式  
    42.   
    43.     MusicPlayer player;  
    44.     const QStringList arguments = QCoreApplication::arguments();  
    45.     if (arguments.size() > 1)                              // 如果打开参数包含文件名  
    46.         player.playFile(arguments.at(1));                  // 则开始播放第一首  
    47.     player.resize(300, 60);  
    48.     player.show();  
    49.   
    50.     return app.exec();  
    51. }  

    VolumeButton 类继承自QToolButton,使用 Qt 中的标准音量图像设置为自身图标,

    [cpp] view plain copy
     
    1. setIcon(style()->standardIcon(QStyle::SP_MediaVolume));  

    并提供了一个可以调节音量的弹出菜单,并根据DWM的混合状态决定自身的显示状态,代码都很容易理解,就不贴出来了。

    在MusicPlayer类中,首先记得

    [cpp] view plain copy
     
    1. #include <QtWinExtras>  

    然后我们通过下面的函数来创建Jump Lists:

    [cpp] view plain copy
     
    1. void MusicPlayer::createJumpList()  
    2. {  
    3.     QWinJumpList jumplist;  
    4.     jumplist.recent()->setVisible(true);  
    5. }  

    Taskbar的创建与Progress类似,我们将其与窗口上的进度条关联起来:

    [cpp] view plain copy
     
    1. void MusicPlayer::createTaskbar()  
    2. {  
    3.     taskbarButton = new QWinTaskbarButton(this);  
    4.     taskbarButton->setWindow(windowHandle());  // 使用窗口句柄作为参数  
    5.   
    6.     taskbarProgress = taskbarButton->progress();  
    7.     connect(positionSlider, SIGNAL(valueChanged(int)), taskbarProgress, SLOT(setValue(int)));  
    8.     connect(positionSlider, SIGNAL(rangeChanged(int,int)), taskbarProgress, SLOT(setRange(int,int)));  
    9.   
    10.     connect(&mediaPlayer, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(updateTaskbar()));  
    11. }  


    要创建预览窗口按钮,首先需要创建一个QWinThumbnailToolBar,然后在上面添加按钮:

    [cpp] view plain copy
     
    1. void MusicPlayer::createThumbnailToolBar()  
    2. {  
    3.     thumbnailToolBar = new QWinThumbnailToolBar(this);  
    4.     thumbnailToolBar->setWindow(windowHandle());  
    5.   
    6.     playToolButton = new QWinThumbnailToolButton(thumbnailToolBar);  
    7.     playToolButton->setEnabled(false);  
    8.     playToolButton->setToolTip(tr("Play"));  
    9.     playToolButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));  
    10.     connect(playToolButton, SIGNAL(clicked()), this, SLOT(togglePlayback()));  
    11.   
    12.     forwardToolButton = new QWinThumbnailToolButton(thumbnailToolBar);  
    13.     forwardToolButton->setEnabled(false);  
    14.     forwardToolButton->setToolTip(tr("Fast forward"));  
    15.     forwardToolButton->setIcon(style()->standardIcon(QStyle::SP_MediaSeekForward));  
    16.     connect(forwardToolButton, SIGNAL(clicked()), this, SLOT(seekForward()));  
    17.   
    18.     backwardToolButton = new QWinThumbnailToolButton(thumbnailToolBar);  
    19.     backwardToolButton->setEnabled(false);  
    20.     backwardToolButton->setToolTip(tr("Rewind"));  
    21.     backwardToolButton->setIcon(style()->standardIcon(QStyle::SP_MediaSeekBackward));  
    22.     connect(backwardToolButton, SIGNAL(clicked()), this, SLOT(seekBackward()));  
    23.   
    24.     thumbnailToolBar->addButton(backwardToolButton);  
    25.     thumbnailToolBar->addButton(playToolButton);  
    26.     thumbnailToolBar->addButton(forwardToolButton);  
    27.   
    28.     connect(&mediaPlayer, SIGNAL(positionChanged(qint64)), this, SLOT(updateThumbnailToolBar()));  
    29.     connect(&mediaPlayer, SIGNAL(durationChanged(qint64)), this, SLOT(updateThumbnailToolBar()));  
    30.     connect(&mediaPlayer, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(updateThumbnailToolBar()));  
    31. }  

    最后我们看看程序运行效果:


    在Win7下当我们暂停播放时,任务栏会出现一个暂停样式的图标,而在Win8中则表现为绿色的进度条变成了黄色:

    http://blog.csdn.net/cloud_castle/article/details/43672509

  • 相关阅读:
    洛谷P1175 表达式的转换
    洛谷P1725 琪露诺
    bzoj1047 [HAOI2007]理想的正方形
    洛谷P1886 滑动窗口
    最大数的和
    bzoj1087 [SCOI2005]互不侵犯King
    bzoj1051 [HAOI2006]受欢迎的牛
    Android(java)学习笔记41:Map集合功能概述
    Android(java)学习笔记40:WindowManager 中LayoutParams的各种属性
    Android(java)学习笔记39:Android 修改字体
  • 原文地址:https://www.cnblogs.com/findumars/p/7841293.html
Copyright © 2020-2023  润新知