OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2429|回复: 1

《I.MX6U 嵌入式Qt开发指南》第十二章 多媒体 (上)

[复制链接]

1070

主题

1081

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4443
金钱
4443
注册时间
2019-5-8
在线时间
1199 小时
发表于 2022-8-10 17:31:35 | 显示全部楼层 |阅读模式
本帖最后由 正点原子运营 于 2022-8-10 17:31 编辑

1)实验平台:正点原子阿尔法Linux开发板
2)  章节摘自【正点原子】《I.MX6U 嵌入式Qt开发指南》

3)购买链接:https://detail.tmall.com/item.htm?id=609033604451
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/arm-linux/zdyz-i.mx6ull.html
5)正点原子官方B站:https://space.bilibili.com/394620890
6)正点原子阿尔法Linux交流群:1027879335




第十二章 多媒体

       多媒体(Multimedia)是多种媒体的综合,一般包括文本,声音和图像等多种媒体形式。
       在计算机系统中,多媒体指组合两种或两种以上媒体的一种人机交互式信息交流和传播媒体。使用的媒体包括文字、图片、照片、声音、动画和影片,以及程式所提供的互动功能。
       Qt的多媒体模块提供了音频、视频、录音、摄像头拍照和录像等功能。本章将介绍Qt多媒体的功能和使用。

第二章12.1 Qt多媒体简介
Qt从4.4版本开始提供的一套多媒体框架,提供多媒体回放的功能。在Qt 4.6中实现多媒体播放图形界面主要依赖phonon框架。phonon最初是 一个 源于KDE的项目,为使用音频和视频的应用程序开发提供的一个框架。应用程序不用去管多媒体播放是通过什么实现的(如gstreamer、xine),只需调用相应的接口就行,但这中间需要一个中转,被称为backend。Qt也是通过phonon来实现跨平台的多媒体播放。
从Qt5开始,Qt就弃用了phonon,直接使用Qt Multimedia模块。我们可以Qt Multimedia模块来提供的类实现跨平台的多媒体播放了。使用Qt Multimedia就不需要中转了,但是底层还是需要多媒体插件实现的。Qt只是提供多媒体接口,播放多媒体实际上是通过多媒体插件实现的,我们不需要管这些插件是什么,Qt在不同平台使用的多媒体插件不同。本章将会介绍如何在Windows和Linux安装多媒体插件,Mac系统不考虑,编者条件有限!
Qt多媒体模块提供了很多类,主要有QMediaPlayer,QSound、QSoundEffect、QAudioOutput、QAudioInput、QAudioRecorder、QVideoWidget等等。类太多了不一一作解释,可以直接复制名字到Qt的帮助文档里查看该解释。可以从名称大概了解它们是什么意思,具体类的使用直接看本章的例子。
想要在Qt里使用使用Qt多媒体模块,需要在pro项目文件里添加如下语句。
  1. QT       += multimedia
复制代码
注意:Qt中的音乐播放器与视频播放器需要在Ubuntu里安装媒体解码器才能实现播放。
l  Ubuntu16 / Ubuntu18,需要安装以下插件。播放音乐需要安装Gst解码插件。需要在终端输入如下指令,注意不要复制错误了,下面指令已经在Ubuntu16/Ubuntu18测试成功,如果读者Ubuntu没有配置网络与源服务器,这些导致安装不成功与本教程无关,确实需要读者好好打下Ubuntu操作的基础了!
  1. sudo apt-get install gstreamer1.0-plugins-base gstreamer1.0-plugins-bad gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-pulseaudio gstreamer1.0-libav
复制代码
l  Windows需要安装如LAVFilters解码器,只需要百度LAVFilters,找到LAVFilters官网下载此软件即可,当然本教程的资料会提供一份LAVFilters的安装包。点击页脚下方的程序下载链接跳转到下载本教程所有资料下载地址处,在顶层目录下。

第三章12.2 音效文件播放
播放音效文件,比如简短的提示音(按键音等),可以使用Qt的QSoundEffect和QSound类来播放。
Qt的QSoundEffect和QSound类主要区别是QSound(异步方式播放)只能播放本地的WAV音效文件(WAV音效文件是PC机上最为流行的声音文件格式,但其文件尺寸较大,多用于存储简短的声音片段,具有低延时性,不失真的特点),QSoundEffect不仅可以播放网络文件,也可以播放本地音效文件,播放网络的文件一般使用到QUrl链接。

第四章12.2.1 应用实例
本例目的:了解QSound类的使用。
例13_button_sound,按钮音效测试(难度:一般)。项目路径为Qt/2/13_button_sound。本例大体流程,通过点击一个按钮,然后使用QSound来播放音效文件,模仿按键按下的声音。
项目文件13_button_sound.pro文件第一行添加的代码部分如下。
  1. 13_button_sound.pro编程后的代码

  2. 1   QT       += core gui multimedia

  3. 2

  4. 3   greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

  5. 4

  6. 5   CONFIG += c++11

  7. 6

  8. 7   # The following define makes your compiler emit warnings if you use

  9. 8   # any Qt feature that has been marked deprecated (the exact warnings

  10. 9   # depend on your compiler). Please consult the documentation of the

  11. 10  # deprecated API in order to know how to port your code away from it.

  12. 11  DEFINES += QT_DEPRECATED_WARNINGS

  13. 12

  14. 13  # You can also make your code fail to compile if it uses deprecated APIs.

  15. 14  # In order to do so, uncomment the following line.

  16. 15  # You can also select to disable deprecated APIs only up to a certain version of Qt.

  17. 16  #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

  18. 17

  19. 18  SOURCES += \

  20. 19      main.cpp \

  21. 20      mainwindow.cpp

  22. 21

  23. 22  HEADERS += \

  24. 23      mainwindow.h

  25. 24

  26. 25  # Default rules for deployment.

  27. 26  qnx: target.path = /tmp/${TARGET}/bin

  28. 27  else: unix:!android: target.path = /opt/${TARGET}/bin

  29. 28  !isEmpty(target.path): INSTALLS += target

  30. 29

  31. 30  RESOURCES += \

  32. 31      src.qrc
复制代码
在头文件“mainwindow.h”具体代码如下。
  1. mainwindow.h编程后的代码

  2.     /******************************************************************

  3.     Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.

  4.     * @projectName   13_button_sound

  5.     * @brief         mainwindow.h

  6.     * [url=home.php?mod=space&uid=90321]@Author[/url]        Deng Zhimao

  7.     * [url=home.php?mod=space&uid=55957]@EMAIL[/url]         1252699831@qq.com

  8.     * [url=home.php?mod=space&uid=28414]@net[/url]            www.openedv.com

  9.     * @date           2021-04-20

  10.     *******************************************************************/

  11. 1   #ifndef MAINWINDOW_H

  12. 2   #define MAINWINDOW_H

  13. 3

  14. 4   #include <QMainWindow>

  15. 5   #include <QSound>

  16. 6   #include <QPushButton>

  17. 7

  18. 8   class MainWindow : public QMainWindow

  19. 9   {

  20. 10      Q_OBJECT

  21. 11

  22. 12  public:

  23. 13      MainWindow(QWidget *parent = nullptr);

  24. 14      ~MainWindow();

  25. 15

  26. 16  private:

  27. 17      /* 按钮 */

  28. 18      QPushButton *pushButton;

  29. 19

  30. 20  private slots:

  31. 21      /* 按钮点击槽函数 */

  32. 22      void pushButtonClicked();

  33. 23

  34. 24  };

  35. 25  #endif // MAINWINDOW_H

  36. 26
复制代码
头文件里主要是声明界面使用的一个按钮,及按钮槽函数。
在源文件“mainwindow.cpp”具体代码如下。
  1. mainwindow.cpp编程后的代码

  2.     /******************************************************************

  3.     Copyright &#169; Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.

  4.     * @projectName   13_button_sound

  5.     * @brief         mainwindow.cpp

  6.     * @author        Deng Zhimao

  7.     * @email         1252699831@qq.com

  8.     * @net            www.openedv.com

  9.     * @date           2021-04-20

  10.     *******************************************************************/

  11. 1   #include "mainwindow.h"

  12. 2

  13. 3   MainWindow::MainWindow(QWidget *parent)

  14. 4       : QMainWindow(parent)

  15. 5   {

  16. 6       /* 设置主窗体的位置与大小 */

  17. 7       this->setGeometry(0, 0, 800, 480);

  18. 8

  19. 9       /* 实例化按钮 */

  20. 10      pushButton = new QPushButton(this);

  21. 11

  22. 12      /* 设置按钮文本 */

  23. 13      pushButton->setText("按钮音效测试");

  24. 14

  25. 15      /* 设置按钮的位置与大小 */

  26. 16      pushButton->setGeometry(340, 220, 120, 40);

  27. 17

  28. 18      /* 信号槽连接 */

  29. 19      connect(pushButton, SIGNAL(clicked()),

  30. 20              this, SLOT(pushButtonClicked()));

  31. 21  }

  32. 22

  33. 23  MainWindow::~MainWindow()

  34. 24  {

  35. 25  }

  36. 26

  37. 27  void MainWindow::pushButtonClicked()

  38. 28  {

  39. 29      /* 异步的方式播放 */

  40. 30      QSound::play(":/audio/bell.wav");

  41. 31  }
复制代码
       第30行,直接使用QSound的静态函数play()播放,这种播放方式是异步的,可以多次点击按钮连续听到点击的声音。

第五章12.2.1 程序运行效果
单击按钮后,可以听到播放1秒左右的叮咚声,用此方法来模拟单击按钮声音效果。
image002.jpg
第六章12.3 音乐播放器
QMediaPlayer类是一个高级媒体播放类。它可以用来播放歌曲、电影和网络广播等内容。一般用于播放mp3和mp4等等媒体文件。QMediaPlayer类常常与QMediaPlaylist类一起使用。可以很轻松的设计一个自己喜欢的音乐播放器与视频播放器。
QMediaPlayer提供了很多信号,我们可以使用这些信号来完成音乐播放器的一系列操作,比如媒体状态改变的信号stateChanged(QMediaPlayer::State state),判断这个state的状态就可以知道什么时候媒体暂停、播放、停止了。Qt在媒体播放类已经提供了很多功能函数给我们使用,像直接使用play()函数就可以实现音乐文件的播放,前提我们需要知道媒体文件的路径。pause()函数可以直接暂停媒体播放等等,这些都可以在Qt帮助文档里查看QMediaPlayer类的使用方法就可以知道。不再一一列出。

第七章12.3.1 应用实例
本例设计一个比较好看的音乐播放器,界面是编者模仿网上的一个音乐播放器的界面,并非编者原创界面,只是编者用Qt实现了网上的一个好看的音乐播放器界面。其中本例有些功能并没有完善,比如播放模式、没有加音量控制等。这些可以由读者自由完善,比较简单。
本例目的:音乐播放器的设计与使用。
例14_musicplayer,音乐播放器(难度:中等)。项目路径为Qt/2/14_musicplayer。注意本例有用到qss样式文件,关于如何添加资源文件与qss文件请参考7.1.3小节。音乐播放器的功能这些都为大家所熟知,不用编者介绍了。
项目文件14_musicplayer.pro文件第一行添加的代码部分如下。
  1. 14_musicplayer.pro编程后的代码
  2. 1   QT       += core gui multimedia
  3. 2
  4. 3   greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
  5. 4
  6. 5   CONFIG += c++11
  7. 6
  8. 7   # The following define makes your compiler emit warnings if you use
  9. 8   # any Qt feature that has been marked deprecated (the exact warnings
  10. 9   # depend on your compiler). Please consult the documentation of the
  11. 10  # deprecated API in order to know how to port your code away from it.
  12. 11  DEFINES += QT_DEPRECATED_WARNINGS
  13. 12
  14. 13  # You can also make your code fail to compile if it uses deprecated APIs.
  15. 14  # In order to do so, uncomment the following line.
  16. 15  # You can also select to disable deprecated APIs only up to a certain version of Qt.
  17. 16  #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
  18. 17
  19. 18  SOURCES += \
  20. 19      main.cpp \
  21. 20      mainwindow.cpp
  22. 21
  23. 22  HEADERS += \
  24. 23      mainwindow.h
  25. 24
  26. 25  # Default rules for deployment.
  27. 26  qnx: target.path = /tmp/${TARGET}/bin
  28. 27  else: unix:!android: target.path = /opt/${TARGET}/bin
  29. 28  !isEmpty(target.path): INSTALLS += target
  30. 29
  31. 30  RESOURCES += \
  32. 31      res.qrc
复制代码
在头文件“mainwindow.h”具体代码如下
  1. mainwindow.h编程后的代码
  2.     /******************************************************************
  3.     Copyright &#169; Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.
  4.     * @projectName   14_musicplayer
  5.     * @brief         mainwindow.h
  6.     * @author        Deng Zhimao
  7.     * @email         1252699831@qq.com
  8.     * @net            www.openedv.com
  9.     * @date           2021-04-20
  10.     *******************************************************************/
  11. 1   #ifndef MAINWINDOW_H
  12. 2   #define MAINWINDOW_H
  13. 3  
  14. 4   #include <QMainWindow>
  15. 5   #include <QMediaPlayer>
  16. 6   #include <QMediaPlaylist>
  17. 7   #include <QPushButton>
  18. 8   #include <QSlider>
  19. 9   #include <QVBoxLayout>
  20. 10  #include <QHBoxLayout>
  21. 11  #include <QListWidget>
  22. 12  #include <QLabel>
  23. 13  #include <QSpacerItem>
  24. 14  #include <QDebug>
  25. 15
  26. 16  /* 媒体信息结构体 */
  27. 17  struct MediaObjectInfo {
  28. 18      /* 用于保存歌曲文件名 */
  29. 19      QString fileName;
  30. 20      /* 用于保存歌曲文件路径 */
  31. 21      QString filePath;
  32. 22  };
  33. 23
  34. 24  class MainWindow : public QMainWindow
  35. 25  {
  36. 26      Q_OBJECT
  37. 27
  38. 28  public:
  39. 29      MainWindow(QWidget *parent = nullptr);
  40. 30      ~MainWindow();
  41. 31
  42. 32  private:
  43. 33      /* 媒体播放器,用于播放音乐 */
  44. 34      QMediaPlayer *musicPlayer;
  45. 35
  46. 36      /* 媒体列表 */
  47. 37      QMediaPlaylist *mediaPlaylist;
  48. 38
  49. 39      /* 音乐列表 */
  50. 40      QListWidget *listWidget;
  51. 41
  52. 42      /* 播放进度条 */
  53. 43      QSlider *durationSlider;
  54. 44
  55. 45      /* 音乐播放器按钮 */
  56. 46      QPushButton *pushButton[7];
  57. 47
  58. 48      /* 垂直布局 */
  59. 49      QVBoxLayout *vBoxLayout[3];
  60. 50
  61. 51      /* 水平布局 */
  62. 52      QHBoxLayout *hBoxLayout[4];
  63. 53
  64. 54      /* 垂直容器 */
  65. 55      QWidget *vWidget[3];
  66. 56
  67. 57      /* 水平容器 */
  68. 58      QWidget *hWidget[4];
  69. 59
  70. 60      /* 标签文本 */
  71. 61      QLabel *label[4];
  72. 62
  73. 63      /* 用于遮罩 */
  74. 64      QWidget *listMask;
  75. 65
  76. 66      /* 音乐布局函数 */
  77. 67      void musicLayout();
  78. 68
  79. 69      /* 主窗体大小重设大小函数重写 */
  80. 70      void resizeEvent(QResizeEvent *event);
  81. 71
  82. 72      /* 媒体信息存储 */
  83. 73      QVector<MediaObjectInfo> mediaObjectInfo;
  84. 74
  85. 75      /* 扫描歌曲 */
  86. 76      void scanSongs();
  87. 77
  88. 78      /* 媒体播放器类初始化 */
  89. 79      void mediaPlayerInit();
  90. 80
  91. 81  private slots:
  92. 82      /* 播放按钮点击 */
  93. 83      void btn_play_clicked();
  94. 84
  95. 85      /* 下一曲按钮点击*/
  96. 86      void btn_next_clicked();
  97. 87
  98. 88      /* 上一曲按钮点击 */
  99. 89      void btn_previous_clicked();
  100. 90
  101. 91      /* 媒体状态改变 */
  102. 92      void mediaPlayerStateChanged(QMediaPlayer::State);
  103. 93
  104. 94      /* 列表单击 */
  105. 95      void listWidgetCliked(QListWidgetItem*);
  106. 96
  107. 97      /* 媒体列表项改变 */
  108. 98      void mediaPlaylistCurrentIndexChanged(int);
  109. 99
  110. 100     /* 媒体总长度改变 */
  111. 101     void musicPlayerDurationChanged(qint64);
  112. 102
  113. 103     /* 媒体播放位置改变 */
  114. 104     void mediaPlayerPositionChanged(qint64);
  115. 105
  116. 106     /* 播放进度条松开 */
  117. 107     void durationSliderReleased();
  118. 108 };
  119. 109 #endif // MAINWINDOW_H
复制代码
头文件里主要是声明界面所使用的元素及一些槽函数。
在源文件“mainwindow.cpp”具体代码如下。
  1. mainwindow.cpp编程后的代码
  2.     /******************************************************************
  3.     Copyright &#169; Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.
  4.     * @projectName   14_musicplayer
  5.     * @brief         mainwindow.cpp
  6.     * @author        Deng Zhimao
  7.     * @email         1252699831@qq.com
  8.     * @net            www.openedv.com
  9.     * @date           2021-04-20
  10.     *******************************************************************/
  11. 1   #include "mainwindow.h"
  12. 2   #include <QCoreApplication>
  13. 3   #include <QFileInfoList>
  14. 4   #include <QDir>
  15. 5  
  16. 6   MainWindow::MainWindow(QWidget *parent)
  17. 7       : QMainWindow(parent)
  18. 8   {
  19. 9       /* 布局初始化 */
  20. 10      musicLayout();
  21. 11
  22. 12      /* 媒体播放器初始化 */
  23. 13      mediaPlayerInit();
  24. 14
  25. 15      /* 扫描歌曲 */
  26. 16      scanSongs();
  27. 17
  28. 18      /* 按钮信号槽连接 */
  29. 19      connect(pushButton[0], SIGNAL(clicked()),
  30. 20              this, SLOT(btn_previous_clicked()));
  31. 21      connect(pushButton[1], SIGNAL(clicked()),
  32. 22              this, SLOT(btn_play_clicked()));
  33. 23      connect(pushButton[2], SIGNAL(clicked()),
  34. 24              this, SLOT(btn_next_clicked()));
  35. 25
  36. 26      /* 媒体信号槽连接 */
  37. 27      connect(musicPlayer,
  38. 28              SIGNAL(stateChanged(QMediaPlayer::State)),
  39. 29              this,
  40. 30              SLOT(mediaPlayerStateChanged(QMediaPlayer::State)));
  41. 31      connect(mediaPlaylist,
  42. 32              SIGNAL(currentIndexChanged(int)),
  43. 33              this,
  44. 34              SLOT(mediaPlaylistCurrentIndexChanged(int)));
  45. 35      connect(musicPlayer, SIGNAL(durationChanged(qint64)),
  46. 36              this,
  47. 37              SLOT(musicPlayerDurationChanged(qint64)));
  48. 38      connect(musicPlayer,
  49. 39              SIGNAL(positionChanged(qint64)),
  50. 40              this,
  51. 41              SLOT(mediaPlayerPositionChanged(qint64)));
  52. 42
  53. 43      /* 列表信号槽连接 */
  54. 44      connect(listWidget, SIGNAL(itemClicked(QListWidgetItem*)),
  55. 45              this, SLOT(listWidgetCliked(QListWidgetItem*)));
  56. 46
  57. 47      /* slider信号槽连接 */
  58. 48      connect(durationSlider, SIGNAL(sliderReleased()),
  59. 49              this, SLOT(durationSliderReleased()));
  60. 50
  61. 51      /* 失去焦点 */
  62. 52      this->setFocus();
  63. 53  }
  64. 54
  65. 55  void MainWindow::musicLayout()
  66. 56  {
  67. 57      /* 设置位置与大小,这里固定为800, 480 */
  68. 58      this->setGeometry(0, 0, 800, 480);
  69. 59      QPalette pal;
  70. 60
  71. 61      /* 按钮 */
  72. 62      for (int i = 0; i < 7; i++)
  73. 63          pushButton[i] = new QPushButton();
  74. 64
  75. 65      /* 标签 */
  76. 66      for (int i = 0; i < 4; i++)
  77. 67          label[i] = new QLabel();
  78. 68
  79. 69      for (int i = 0; i < 3; i++) {
  80. 70          /* 垂直容器 */
  81. 71          vWidget[i] = new QWidget();
  82. 72          vWidget[i]->setAutoFillBackground(true);
  83. 73          /* 垂直布局 */
  84. 74          vBoxLayout[i] = new QVBoxLayout();
  85. 75      }
  86. 76
  87. 77      for (int i = 0; i < 4; i++) {
  88. 78          /* 水平容器 */
  89. 79          hWidget[i] = new QWidget();
  90. 80          hWidget[i]->setAutoFillBackground(true);
  91. 81          /* 水平布局 */
  92. 82          hBoxLayout[i] = new QHBoxLayout();
  93. 83      }
  94. 84
  95. 85      /* 播放进度条 */
  96. 86      durationSlider = new QSlider(Qt::Horizontal);
  97. 87      durationSlider->setMinimumSize(300, 15);
  98. 88      durationSlider->setMaximumHeight(15);
  99. 89      durationSlider->setObjectName("durationSlider");
  100. 90
  101. 91      /* 音乐列表 */
  102. 92      listWidget = new QListWidget();
  103. 93      listWidget->setObjectName("listWidget");
  104. 94      listWidget->resize(310, 265);
  105. 95      listWidget->setVerticalScrollBarPolicy(
  106. 96                  Qt::ScrollBarAlwaysOff);
  107. 97      listWidget->setHorizontalScrollBarPolicy(
  108. 98                  Qt::ScrollBarAlwaysOff);
  109. 99
  110. 100     /* 列表遮罩 */
  111. 101     listMask = new QWidget(listWidget);
  112. 102     listMask->setMinimumSize(310, 50);
  113. 103     listMask->setMinimumHeight(50);
  114. 104     listMask->setObjectName("listMask");
  115. 105     listMask->setGeometry(0,
  116. 106                           listWidget->height() - 50,
  117. 107                           310,
  118. 108                           50);
  119. 109
  120. 110     /* 设置对象名称 */
  121. 111     pushButton[0]->setObjectName("btn_previous");
  122. 112     pushButton[1]->setObjectName("btn_play");
  123. 113     pushButton[2]->setObjectName("btn_next");
  124. 114     pushButton[3]->setObjectName("btn_favorite");
  125. 115     pushButton[4]->setObjectName("btn_mode");
  126. 116     pushButton[5]->setObjectName("btn_menu");
  127. 117     pushButton[6]->setObjectName("btn_volume");
  128. 118
  129. 119     /* 设置按钮属性 */
  130. 120     pushButton[1]->setCheckable(true);
  131. 121     pushButton[3]->setCheckable(true);
  132. 122
  133. 123     /* H0布局 */
  134. 124     vWidget[0]->setMinimumSize(310, 480);
  135. 125     vWidget[0]->setMaximumWidth(310);
  136. 126     vWidget[1]->setMinimumSize(320, 480);
  137. 127     QSpacerItem *hSpacer0 = new
  138. 128             QSpacerItem(70, 480,
  139. 129                         QSizePolicy::Minimum,
  140. 130                         QSizePolicy::Maximum);
  141. 131
  142. 132     QSpacerItem *hSpacer1 = new
  143. 133             QSpacerItem(65, 480,
  144. 134                         QSizePolicy::Minimum,
  145. 135                         QSizePolicy::Maximum);
  146. 136
  147. 137     QSpacerItem *hSpacer2 = new
  148. 138             QSpacerItem(60, 480,
  149. 139                         QSizePolicy::Minimum,
  150. 140                         QSizePolicy::Maximum);
  151. 141
  152. 142     hBoxLayout[0]->addSpacerItem(hSpacer0);
  153. 143     hBoxLayout[0]->addWidget(vWidget[0]);
  154. 144     hBoxLayout[0]->addSpacerItem(hSpacer1);
  155. 145     hBoxLayout[0]->addWidget(vWidget[1]);
  156. 146     hBoxLayout[0]->addSpacerItem(hSpacer2);
  157. 147     hBoxLayout[0]->setContentsMargins(0, 0, 0, 0);
  158. 148
  159. 149     hWidget[0]->setLayout(hBoxLayout[0]);
  160. 150     setCentralWidget(hWidget[0]);
  161. 151
  162. 152     /* V0布局 */
  163. 153     listWidget->setMinimumSize(310, 265);
  164. 154     hWidget[1]->setMinimumSize(310, 80);
  165. 155     hWidget[1]->setMaximumHeight(80);
  166. 156     label[0]->setMinimumSize(310, 95);
  167. 157     label[0]->setMaximumHeight(95);
  168. 158     QSpacerItem *vSpacer0 = new
  169. 159             QSpacerItem(310, 10,
  170. 160                         QSizePolicy::Minimum,
  171. 161                         QSizePolicy::Maximum);
  172. 162     QSpacerItem *vSpacer1 = new
  173. 163             QSpacerItem(310, 30,
  174. 164                         QSizePolicy::Minimum,
  175. 165                         QSizePolicy::Minimum);
  176. 166     vBoxLayout[0]->addWidget(label[0]);
  177. 167     vBoxLayout[0]->addWidget(listWidget);
  178. 168     vBoxLayout[0]->addSpacerItem(vSpacer0);
  179. 169     vBoxLayout[0]->addWidget(hWidget[1]);
  180. 170     vBoxLayout[0]->addSpacerItem(vSpacer1);
  181. 171     vBoxLayout[0]->setContentsMargins(0, 0, 0, 0);
  182. 172
  183. 173     vWidget[0]->setLayout(vBoxLayout[0]);
  184. 174
  185. 175     /* H1布局 */
  186. 176     for (int i = 0; i < 3; i++) {
  187. 177         pushButton[i]->setMinimumSize(80, 80);
  188. 178     }
  189. 179     QSpacerItem *hSpacer3 = new
  190. 180             QSpacerItem(40, 80,
  191. 181                         QSizePolicy::Expanding,
  192. 182                         QSizePolicy::Expanding);
  193. 183     QSpacerItem *hSpacer4 = new
  194. 184             QSpacerItem(40, 80,
  195. 185                         QSizePolicy::Expanding,
  196. 186                         QSizePolicy::Expanding);
  197. 187     hBoxLayout[1]->addWidget(pushButton[0]);
  198. 188     hBoxLayout[1]->addSpacerItem(hSpacer3);
  199. 189     hBoxLayout[1]->addWidget(pushButton[1]);
  200. 190     hBoxLayout[1]->addSpacerItem(hSpacer4);
  201. 191     hBoxLayout[1]->addWidget(pushButton[2]);
  202. 192     hBoxLayout[1]->setContentsMargins(0, 0, 0, 0);
  203. 193
  204. 194     hWidget[1]->setLayout(hBoxLayout[1]);
  205. 195
  206. 196     /* V1布局 */
  207. 197     QSpacerItem *vSpacer2 = new
  208. 198             QSpacerItem(320, 40,
  209. 199                         QSizePolicy::Minimum,
  210. 200                         QSizePolicy::Maximum);
  211. 201     QSpacerItem *vSpacer3 = new
  212. 202             QSpacerItem(320, 20,
  213. 203                         QSizePolicy::Minimum,
  214. 204                         QSizePolicy::Maximum);
  215. 205     QSpacerItem *vSpacer4 = new
  216. 206             QSpacerItem(320, 30,
  217. 207                         QSizePolicy::Minimum,
  218. 208                         QSizePolicy::Minimum);
  219. 209     label[1]->setMinimumSize(320, 320);
  220. 210     QImage Image;
  221. 211     Image.load(":/images/cd.png");
  222. 212     QPixmap pixmap = QPixmap::fromImage(Image);
  223. 213     int with = 320;
  224. 214     int height = 320;
  225. 215     QPixmap fitpixmap =
  226. 216             pixmap.scaled(with, height,
  227. 217                           Qt::IgnoreAspectRatio,
  228. 218                           Qt::SmoothTransformation);
  229. 219     label[1]->setPixmap(fitpixmap);
  230. 220     label[1]->setAlignment(Qt::AlignCenter);
  231. 221     vWidget[2]->setMinimumSize(300, 80);
  232. 222     vWidget[2]->setMaximumHeight(80);
  233. 223     vBoxLayout[1]->addSpacerItem(vSpacer2);
  234. 224     vBoxLayout[1]->addWidget(label[1]);
  235. 225     vBoxLayout[1]->addSpacerItem(vSpacer3);
  236. 226     vBoxLayout[1]->addWidget(durationSlider);
  237. 227     vBoxLayout[1]->addWidget(vWidget[2]);
  238. 228     vBoxLayout[1]->addSpacerItem(vSpacer4);
  239. 229     vBoxLayout[1]->setContentsMargins(0, 0, 0, 0);
  240. 230
  241. 231     vWidget[1]->setLayout(vBoxLayout[1]);
  242. 232
  243. 233     /* V2布局 */
  244. 234     QSpacerItem *vSpacer5 = new
  245. 235             QSpacerItem(300, 10,
  246. 236                         QSizePolicy::Minimum,
  247. 237                         QSizePolicy::Maximum);
  248. 238     hWidget[2]->setMinimumSize(320, 20);
  249. 239     hWidget[3]->setMinimumSize(320, 60);
  250. 240     vBoxLayout[2]->addWidget(hWidget[2]);
  251. 241     vBoxLayout[2]->addSpacerItem(vSpacer5);
  252. 242     vBoxLayout[2]->addWidget(hWidget[3]);
  253. 243     vBoxLayout[2]->setContentsMargins(0, 0, 0, 0);
  254. 244
  255. 245     vWidget[2]->setLayout(vBoxLayout[2]);
  256. 246
  257. 247     /* H2布局 */
  258. 248     label[2]->setText("00:00");
  259. 249     label[3]->setText("00:00");
  260. 250     QFont font;
  261. 251
  262. 252     font.setPixelSize(10);
  263. 253
  264. 254     /* 设置标签文本 */
  265. 255     label[0]->setText("Q Music,Enjoy it!");
  266. 256     label[2]->setText("00:00");
  267. 257     label[3]->setText("00:00");
  268. 258     label[2]->setSizePolicy(QSizePolicy::Expanding,
  269. 259                             QSizePolicy::Expanding);
  270. 260     label[3]->setSizePolicy(QSizePolicy::Expanding,
  271. 261                             QSizePolicy::Expanding);
  272. 262     label[3]->setAlignment(Qt::AlignRight);
  273. 263     label[2]->setAlignment(Qt::AlignLeft);
  274. 264     label[2]->setFont(font);
  275. 265     label[3]->setFont(font);
  276. 266
  277. 267     pal.setColor(QPalette::WindowText, Qt::white);
  278. 268     label[0]->setPalette(pal);
  279. 269     label[2]->setPalette(pal);
  280. 270     label[3]->setPalette(pal);
  281. 271
  282. 272     hBoxLayout[2]->addWidget(label[2]);
  283. 273     hBoxLayout[2]->addWidget(label[3]);
  284. 274
  285. 275     hBoxLayout[2]->setContentsMargins(0, 0, 0, 0);
  286. 276     hWidget[2]->setLayout(hBoxLayout[2]);
  287. 277
  288. 278     /* H3布局 */
  289. 279     QSpacerItem *hSpacer5 = new
  290. 280             QSpacerItem(0, 60,
  291. 281                         QSizePolicy::Minimum,
  292. 282                         QSizePolicy::Maximum);
  293. 283     QSpacerItem *hSpacer6 = new
  294. 284             QSpacerItem(80, 60,
  295. 285                         QSizePolicy::Maximum,
  296. 286                         QSizePolicy::Maximum);
  297. 287     QSpacerItem *hSpacer7 = new
  298. 288             QSpacerItem(80, 60,
  299. 289                         QSizePolicy::Maximum,
  300. 290                         QSizePolicy::Maximum);
  301. 291     QSpacerItem *hSpacer8 = new
  302. 292             QSpacerItem(80, 60,
  303. 293                         QSizePolicy::Maximum,
  304. 294                         QSizePolicy::Maximum);
  305. 295     QSpacerItem *hSpacer9 = new
  306. 296             QSpacerItem(0, 60,
  307. 297                         QSizePolicy::Minimum,
  308. 298                         QSizePolicy::Maximum);
  309. 299
  310. 300     for (int i = 3; i < 7; i++) {
  311. 301         pushButton[i]->setMinimumSize(25, 25);
  312. 302         pushButton[i]->setMaximumSize(25, 25);
  313. 303     }
  314. 304
  315. 305     hBoxLayout[3]->addSpacerItem(hSpacer5);
  316. 306     hBoxLayout[3]->addWidget(pushButton[3]);
  317. 307     hBoxLayout[3]->addSpacerItem(hSpacer6);
  318. 308     hBoxLayout[3]->addWidget(pushButton[4]);
  319. 309     hBoxLayout[3]->addSpacerItem(hSpacer7);
  320. 310     hBoxLayout[3]->addWidget(pushButton[5]);
  321. 311     hBoxLayout[3]->addSpacerItem(hSpacer8);
  322. 312     hBoxLayout[3]->addWidget(pushButton[6]);
  323. 313     hBoxLayout[3]->addSpacerItem(hSpacer9);
  324. 314     hBoxLayout[3]->setContentsMargins(0, 0, 0, 0);
  325. 315     hBoxLayout[3]->setAlignment(Qt::AlignHCenter);
  326. 316
  327. 317     hWidget[3]->setLayout(hBoxLayout[3]);
  328. 318
  329. 319     //hWidget[0]->setStyleSheet("background-color:red");
  330. 320     //hWidget[1]->setStyleSheet("background-color:#ff5599");
  331. 321     //hWidget[2]->setStyleSheet("background-color:#ff55ff");
  332. 322     //hWidget[3]->setStyleSheet("background-color:black");
  333. 323     //vWidget[0]->setStyleSheet("background-color:#555555");
  334. 324     //vWidget[1]->setStyleSheet("background-color:green");
  335. 325     //vWidget[2]->setStyleSheet("background-color:gray");
  336. 326
  337. 327 }
  338. 328
  339. 329 MainWindow::~MainWindow()
  340. 330 {
  341. 331 }
  342. 332
  343. 333 void MainWindow::btn_play_clicked()
  344. 334 {
  345. 335     int state = musicPlayer->state();
  346. 336
  347. 337     switch (state) {
  348. 338     case QMediaPlayer::StoppedState:
  349. 339         /* 媒体播放 */
  350. 340         musicPlayer->play();
  351. 341         break;
  352. 342
  353. 343     case QMediaPlayer::PlayingState:
  354. 344         /* 媒体暂停 */
  355. 345         musicPlayer->pause();
  356. 346         break;
  357. 347
  358. 348     case QMediaPlayer::PausedState:
  359. 349         musicPlayer->play();
  360. 350         break;
  361. 351     }
  362. 352 }
  363. 353
  364. 354 void MainWindow::btn_next_clicked()
  365. 355 {
  366. 356     musicPlayer->stop();
  367. 357     int count = mediaPlaylist->mediaCount();
  368. 358     if (0 == count)
  369. 359         return;
  370. 360
  371. 361     /* 列表下一个 */
  372. 362     mediaPlaylist->next();
  373. 363     musicPlayer->play();
  374. 364 }
  375. 365
  376. 366 void MainWindow::btn_previous_clicked()
  377. 367 {
  378. 368     musicPlayer->stop();
  379. 369     int count = mediaPlaylist->mediaCount();
  380. 370     if (0 == count)
  381. 371         return;
  382. 372
  383. 373     /* 列表上一个 */
  384. 374     mediaPlaylist->previous();
  385. 375     musicPlayer->play();
  386. 376 }
  387. 377
  388. 378 void MainWindow::mediaPlayerStateChanged(
  389. 379         QMediaPlayer::State
  390. 380         state)
  391. 381 {
  392. 382     switch (state) {
  393. 383     case QMediaPlayer::StoppedState:
  394. 384         pushButton[1]->setChecked(false);
  395. 385         break;
  396. 386
  397. 387     case QMediaPlayer::PlayingState:
  398. 388         pushButton[1]->setChecked(true);
  399. 389         break;
  400. 390
  401. 391     case QMediaPlayer::PausedState:
  402. 392         pushButton[1]->setChecked(false);
  403. 393         break;
  404. 394     }
  405. 395 }
  406. 396
  407. 397 void MainWindow::listWidgetCliked(QListWidgetItem *item)
  408. 398 {
  409. 399     musicPlayer->stop();
  410. 400     mediaPlaylist->setCurrentIndex(listWidget->row(item));
  411. 401     musicPlayer->play();
  412. 402 }
  413. 403
  414. 404 void MainWindow::mediaPlaylistCurrentIndexChanged(
  415. 405         int index)
  416. 406 {
  417. 407     if (-1 == index)
  418. 408         return;
  419. 409
  420. 410     /* 设置列表正在播放的项 */
  421. 411     listWidget->setCurrentRow(index);
  422. 412 }
  423. 413
  424. 414 void MainWindow::musicPlayerDurationChanged(
  425. 415         qint64 duration)
  426. 416 {
  427. 417     durationSlider->setRange(0, duration / 1000);
  428. 418     int second  = duration / 1000;
  429. 419     int minute = second / 60;
  430. 420     second %= 60;
  431. 421
  432. 422     QString mediaDuration;
  433. 423     mediaDuration.clear();
  434. 424
  435. 425     if (minute >= 10)
  436. 426         mediaDuration = QString::number(minute, 10);
  437. 427     else
  438. 428         mediaDuration = "0" + QString::number(minute, 10);
  439. 429
  440. 430     if (second >= 10)
  441. 431         mediaDuration = mediaDuration
  442. 432                 + ":" + QString::number(second, 10);
  443. 433     else
  444. 434         mediaDuration = mediaDuration
  445. 435                 + ":0" + QString::number(second, 10);
  446. 436
  447. 437     /* 显示媒体总长度时间 */
  448. 438     label[3]->setText(mediaDuration);
  449. 439 }
  450. 440
  451. 441 void MainWindow::mediaPlayerPositionChanged(
  452. 442         qint64 position)
  453. 443 {
  454. 444     if (!durationSlider->isSliderDown())
  455. 445         durationSlider->setValue(position/1000);
  456. 446
  457. 447     int second  = position / 1000;
  458. 448     int minute = second / 60;
  459. 449     second %= 60;
  460. 450
  461. 451     QString mediaPosition;
  462. 452     mediaPosition.clear();
  463. 453
  464. 454     if (minute >= 10)
  465. 455         mediaPosition = QString::number(minute, 10);
  466. 456     else
  467. 457         mediaPosition = "0" + QString::number(minute, 10);
  468. 458
  469. 459     if (second >= 10)
  470. 460         mediaPosition = mediaPosition
  471. 461                 + ":" + QString::number(second, 10);
  472. 462     else
  473. 463         mediaPosition = mediaPosition
  474. 464                 + ":0" + QString::number(second, 10);
  475. 465
  476. 466     /* 显示现在播放的时间 */
  477. 467     label[2]->setText(mediaPosition);
  478. 468 }
  479. 469
  480. 470 void MainWindow::resizeEvent(QResizeEvent *event)
  481. 471 {
  482. 472     Q_UNUSED(event);
  483. 473     listMask->setGeometry(0,
  484. 474                           listWidget->height() - 50,
  485. 475                           310,
  486. 476                           50);
  487. 477 }
  488. 478
  489. 479 void MainWindow::durationSliderReleased()
  490. 480 {
  491. 481     /* 设置媒体播放的位置 */
  492. 482     musicPlayer->setPosition(durationSlider->value() * 1000);
  493. 483 }
  494. 484
  495. 485 void MainWindow::scanSongs()
  496. 486 {
  497. 487     QDir dir(QCoreApplication::applicationDirPath()
  498. 488              + "/myMusic");
  499. 489     QDir dirbsolutePath(dir.absolutePath());
  500. 490     /* 如果目录存在 */
  501. 491     if (dirbsolutePath.exists()) {
  502. 492         /* 定义过滤器 */
  503. 493         QStringList filter;
  504. 494         /* 包含所有.mp3后缀的文件 */
  505. 495         filter << "*.mp3";
  506. 496         /* 获取该目录下的所有文件 */
  507. 497         QFileInfoList files =
  508. 498                 dirbsolutePath.entryInfoList(filter, QDir::Files);
  509. 499         /* 遍历 */
  510. 500         for (int i = 0; i < files.count(); i++) {
  511. 501             MediaObjectInfo info;
  512. 502             /* 使用utf-8编码 */
  513. 503             QString fileName = QString::fromUtf8(files.at(i)
  514. 504                                                  .fileName()
  515. 505                                                  .replace(".mp3", "")
  516. 506                                                  .toUtf8()
  517. 507                                                  .data());
  518. 508             info.fileName = fileName + "\n"
  519. 509                     + fileName.split("-").at(1);
  520. 510             info.filePath = QString::fromUtf8(files.at(i)
  521. 511                                               .filePath()
  522. 512                                               .toUtf8()
  523. 513                                               .data());
  524. 514             /* 媒体列表添加歌曲 */
  525. 515             if (mediaPlaylist->addMedia(
  526. 516                         QUrl::fromLocalFile(info.filePath))) {
  527. 517                 /* 添加到容器数组里储存 */
  528. 518                 mediaObjectInfo.append(info);
  529. 519                 /* 添加歌曲名字至列表 */
  530. 520                 listWidget->addItem(info.fileName);
  531. 521             } else {
  532. 522                 qDebug()<<
  533. 523                            mediaPlaylist->errorString()
  534. 524                            .toUtf8().data()
  535. 525                         << endl;
  536. 526                 qDebug()<< "  Error number:"
  537. 527                          << mediaPlaylist->error()
  538. 528                          << endl;
  539. 529             }
  540. 530         }
  541. 531     }
  542. 532 }
  543. 533
  544. 534 void MainWindow::mediaPlayerInit()
  545. 535 {
  546. 536     musicPlayer = new QMediaPlayer(this);
  547. 537     mediaPlaylist = new QMediaPlaylist(this);
  548. 538     /* 确保列表是空的 */
  549. 539     mediaPlaylist->clear();
  550. 540     /* 设置音乐播放器的列表为mediaPlaylist */
  551. 541     musicPlayer->setPlaylist(mediaPlaylist);
  552. 542     /* 设置播放模式,Loop是列循环 */
  553. 543     mediaPlaylist->setPlaybackMode(QMediaPlaylist::Loop);
  554. 544 }
复制代码
第10行,布局初始化,第一步我们先建立好界面,确定好布局再实现功能,一般流程都这样,布局msuicLayout()的内容比较多,也不难,但是比较复杂,如果我们有第七章的基础,看这种布局是没有难度的,这里就不多解释了。没有好看的布局也能完成本例。如果您喜欢这种布局方法,您需要多花点时间去研究如何布局才好看,这些没有固定的方法,完全是一个人的审美感。
       第13行,媒体先初始化,初始化媒体播放器与媒体播放列表。
       第16行,扫描歌曲,初始化本地歌曲,从固定的文件夹里找歌曲文件,这里编者设计从固定的文件夹里找歌曲文件。也有些读者可能会说可以自由选择文件夹吗?答案是可以的!使用QFileDilog类打开选择歌曲目录或者文件即可!但是在嵌入式里,一般是初始化界里面就已经有歌曲在界面里的了,无需用户再去打开,打开歌曲这种操作是极少会使用的!
       第26至47行,信号槽连接,这里使用了各种各样的信号。这里有必要说明一下,编者设计了单击歌曲列表就能播放歌曲了。如果在电脑上可能有些播放器软件会双击才能播放歌曲,在嵌入式的触摸屏里,只有单击!没有双击,没有用户会双击歌曲的列表的。这些特殊的地方我们需要在嵌入式里考虑!
       第333~376行,点击播放按钮,上一曲,下一曲,Qt的媒体类已经提供了previous(),next(),stop(),play(),pause()这些方法直接可以使用。除了实现好看的界面之外,这部分内容也是本例实现播放器重要的部分!
       其他部分是实现播放状态的切换及扩进度条的显示进度处理,请参阅源码理解。
       main       .cpp内容如下,主要是加载qss样式文件。没有什么可讲解。
  1. 1   #include "mainwindow.h"
  2. 2
  3. 3   #include <QApplication>
  4. 4   #include <QFile>
  5. 5
  6. 6   int main(int argc, char *argv[])
  7. 7   {
  8. 8       QApplication a(argc, argv);
  9. 9       /* 指定文件 */
  10. 10      QFile file(":/style.qss");
  11. 11
  12. 12      /* 判断文件是否存在 */
  13. 13      if (file.exists() ) {
  14. 14          /* 以只读的方式打开 */
  15. 15          file.open(QFile::ReadOnly);
  16. 16          /* 以字符串的方式保存读出的结果 */
  17. 17          QString styleSheet = QLatin1String(file.readAll());
  18. 18          /* 设置全局样式 */
  19. 19          qApp->setStyleSheet(styleSheet);
  20. 20          /* 关闭文件 */
  21. 21          file.close();
  22. 22      }
  23. 23
  24. 24      MainWindow w;
  25. 25      w.show();
  26. 26      return a.exec();
  27. 27  }
复制代码
style.qss样式文件如下。素材已经在源码处提供。注意下面的style.qss不能有注释!
  1. 1   QWidget {
  2. 2   background: "#25242a"
  3. 3   }
  4. 4  
  5. 5   QWidget#listMask {
  6. 6   border-image: url(:/images/mask.png);
  7. 7   background-color: transparent;
  8. 8   }
  9. 9  
  10. 10  QListWidget#listWidget {
  11. 11  color:white;
  12. 12  font-size: 15px;
  13. 13  border:none;
  14. 14  }
  15. 15
  16. 16  QListWidget#listWidget:item:active {
  17. 17  background: transparent;
  18. 18  }
  19. 19
  20. 20  QListWidget#listWidget:item {
  21. 21  background: transparent;
  22. 22  height:60;
  23. 23  }
  24. 24
  25. 25  QListWidget#listWidget:item:selected {
  26. 26  color:#5edcf3;
  27. 27  background: transparent;
  28. 28  }
  29. 29
  30. 30  QListWidget#listWidget:item:hover {
  31. 31  background: transparent;
  32. 32  color:#5edcf3;
  33. 33  border:none;
  34. 34  }
  35. 35
  36. 36  QPushButton#btn_play {
  37. 37  border-image:url(:/images/btn_play1.png);
  38. 38  }
  39. 39
  40. 40  QPushButton#btn_play:hover {
  41. 41  border-image:url(:/images/btn_play2.png);
  42. 42  }
  43. 43
  44. 44  QPushButton#btn_play:checked {
  45. 45  border-image:url(:/images/btn_pause1.png);
  46. 46  }
  47. 47
  48. 48  QPushButton#btn_play:checked:hover {
  49. 49  border-image:url(:/images/btn_pause2.png);
  50. 50  }
  51. 51
  52. 52  QPushButton#btn_previous {
  53. 53  border-image:url(:/images/btn_previous1.png);
  54. 54  }
  55. 55
  56. 56  QPushButton#btn_previous:hover {
  57. 57  border-image:url(:/images/btn_previous2.png);
  58. 58  }
  59. 59
  60. 60  QPushButton#btn_next {
  61. 61  border-image:url(:/images/btn_next1.png);
  62. 62  }
  63. 63
  64. 64  QPushButton#btn_next:hover {
  65. 65  border-image:url(:/images/btn_next2.png);
  66. 66  }
  67. 67
  68. 68  QPushButton#btn_favorite {
  69. 69  border-image:url(:/images/btn_favorite_no.png);
  70. 70  }
  71. 71
  72. 72  QPushButton#btn_favorite:checked {
  73. 73  border-image:url(:/images/btn_favorite_yes.png);
  74. 74  }
  75. 75
  76. 76  QPushButton#btn_menu {
  77. 77  border-image:url(:/images/btn_menu1.png);
  78. 78  }
  79. 79
  80. 80  QPushButton#btn_menu:hover {
  81. 81  border-image:url(:/images/btn_menu2.png);
  82. 82  }
  83. 83
  84. 84  QPushButton#btn_mode {
  85. 85  border-image:url(:/images/btn_listcircle1.png);
  86. 86  }
  87. 87
  88. 88  QPushButton#btn_mode:hover {
  89. 89  border-image:url(:/images/btn_listcircle2.png);
  90. 90  }
  91. 91
  92. 92  QPushButton#btn_mode {
  93. 93  border-image:url(:/images/btn_listcircle1.png);
  94. 94  }
  95. 95
  96. 96  QPushButton#btn_mode:hover {
  97. 97  border-image:url(:/images/btn_listcircle2.png);
  98. 98  }
  99. 99
  100. 100 QPushButton#btn_volume {
  101. 101 border-image:url(:/images/btn_volume1.png);
  102. 102 }
  103. 103
  104. 104 QPushButton#btn_volume:hover {
  105. 105 border-image:url(:/images/btn_volume2.png);
  106. 106 }
  107. 107
  108. 108 QSlider#durationSlider:handle:horizontal {
  109. 109 border-image:url(:/images/handle.png);
  110. 110 }
  111. 111
  112. 112 QSlider#durationSlider:sub-page:horizontal {
  113. 113 border-image:url(:/images/sub-page.png);
  114. 114 }
复制代码
第八章12.3.2 程序运行效果
先点击构建项目,项目构建完成后,再将本例的myMusic歌曲文件夹拷贝到可执行程序的文件夹同一级目录下,也就是build-14_musicplayer-Desktop_Qt_5_12_9_GCC_64bit-Debug目录下(windows需要进入到debug目录)。再点击运行,就出现歌曲在列表里,如下图,点击播放即可播放歌曲,上一曲,下一曲也可以用。注意右下角的某些按钮功能,在本例没有继续去实现,比如音量控制,可以直接加一个垂直方向的滑条,然后控制媒体的软件音量即可。留给读者自由发挥,可以基于本例去开发,就当读者练习吧。本例的界面开发编者还是比较满意的,前面的界面都比较普通,编者个人Qt开发重要的是界面与稳定性,功能是次要的!因为功能都不难实现。
注意歌曲格式应严格为歌名 + “-” + 歌手名称.mp3,例如江南 - 林俊杰.mp3。中间的“-”是英文字符的短横杠,这样的目的是能够将歌曲名称和歌手分开显示到界面上。
image004.jpg


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

85

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1062
金钱
1062
注册时间
2017-10-6
在线时间
167 小时
发表于 2022-8-16 18:42:59 | 显示全部楼层
您好,关于音乐播放器QMediaPlayer,我把这个交叉编译到开发板上,而且开发板也能完成alsa播放音乐,但是使用QMediaPlayer音乐播放器没有任何反应,请问在arm上QMediaPlayer应该需要如何配置才能使用?是交叉编译qt源代码时候加上alsa选项吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-8 20:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表