第一:音乐播放器基本简介
QMediaPlayer类是一个高级媒体播放类。它可以用来播放歌曲、电影和网络广播等内容。一般用于播放 mp3 和 mp4 等等媒体文件。QMediaPlayer 类常常与 QMediaPlaylist 类一起使用。可以很轻松的设计一个自己喜欢的音乐播放器与视频播放器。QMediaPlayer 提供了很多信号,我们可以使用这些信号来完成音乐播放器的一系列操作,比如媒体状态改变的信号 stateChanged(QMediaPlayer::State state),判断这个 state 的状态就可以知道什么时候媒体暂停、播放、停止了。Qt 在媒体播放类已经提供了很多功能函数给我们使用,像直接使用 play()函数就可以实现音乐文件的播放,前提我们需要知道媒体文件的路径。pause() 函数可以直接暂停媒体播放等等,这些都可以在 Qt 帮助文档里查看 QMediaPlayer 类的使用方法就可以知道。
第二:应用具体代码实现
接下来设计一个音乐播放器的界面,利用QT实现网上一个好看的音乐播放器的界面。其中有些功能没有完善。例如播放模式,没有音量控制等。
在实现音乐播放器的时候需要在.pro文件的第一行添加部分代码如下:
QT += core gui multimedia
在头文件“mainwindow.h”中的具体代码实现
1 #ifndef MAINWINDOW_H 2 #define MAINWINDOW_H 3 4 #include <QMainWindow> 5 #include <QMediaPlayer> 6 #include <QMediaPlaylist> 7 #include <QPushButton> 8 #include <QSlider> 9 #include <QVBoxLayout> 10 #include <QHBoxLayout> 11 #include <QListWidget> 12 #include <QLabel> 13 #include <QSpacerItem> 14 #include <QDebug> 15 16 /* 媒体信息结构体 */ 17 struct MediaObjectInfo { 18 /* 用于保存歌曲文件名 */ 19 QString fileName; 20 /* 用于保存歌曲文件路径 */ 21 QString filePath; 22 }; 23 24 class MainWindow : public QMainWindow 25 { 26 Q_OBJECT 27 28 public: 29 MainWindow(QWidget *parent = nullptr); 30 ~MainWindow(); 31 32 private: 33 /* 媒体播放器,用于播放音乐 */ 34 QMediaPlayer *musicPlayer; 35 36 /* 媒体列表 */ 37 QMediaPlaylist *mediaPlaylist; 38 39 /* 音乐列表 */ 40 QListWidget *listWidget; 41 42 /* 播放进度条 */ 43 QSlider *durationSlider; 45 /* 音乐播放器按钮 */ 46 QPushButton *pushButton[7]; 47 48 /* 垂直布局 */ 49 QVBoxLayout *vBoxLayout[3]; 50 51 /* 水平布局 */ 52 QHBoxLayout *hBoxLayout[4]; 53 54 /* 垂直容器 */ 55 QWidget *vWidget[3]; 56 57 /* 水平容器 */ 58 QWidget *hWidget[4]; 59 60 /* 标签文本 */ 61 QLabel *label[4]; 62 63 /* 用于遮罩 */ 64 QWidget *listMask; 65 66 /* 音乐布局函数 */ 67 void musicLayout(); 68 69 /* 主窗体大小重设大小函数重写 */ 70 void resizeEvent(QResizeEvent *event); 71 72 /* 媒体信息存储 */ 73 QVector<MediaObjectInfo> mediaObjectInfo; 74 75 /* 扫描歌曲 */ 76 void scanSongs(); 77 78 /* 媒体播放器类初始化 */ 79 void mediaPlayerInit(); 80 81 private slots: 82 /* 播放按钮点击 */ 83 void btn_play_clicked(); 84 85 /* 下一曲按钮点击*/ 86 void btn_next_clicked(); 87 88 /* 上一曲按钮点击 */ 89 void btn_previous_clicked(); 90 91 /* 媒体状态改变 */ 92 void mediaPlayerStateChanged(QMediaPlayer::State); 93 94 /* 列表单击 */ 95 void listWidgetCliked(QListWidgetItem*); 96 97 /* 媒体列表项改变 */ 98 void mediaPlaylistCurrentIndexChanged(int); 99 100 /* 媒体总长度改变 */ 101 void musicPlayerDurationChanged(qint64); 102 103 /* 媒体播放位置改变 */ 104 void mediaPlayerPositionChanged(qint64); 105 106 /* 播放进度条松开 */ 107 void durationSliderReleased(); 108 }; 109 #endif // MAINWINDOW_H
第三:在源代码mainwindow.cpp中的实现
1 #include "mainwindow.h" 2 #include <QCoreApplication> 3 #include <QFileInfoList> 4 #include <QDir> 5 6 MainWindow::MainWindow(QWidget *parent) 7 : QMainWindow(parent) 8 { 9 /* 布局初始化 */ 10 musicLayout(); 11 12 /* 媒体播放器初始化 */ 13 mediaPlayerInit(); 14 15 /* 扫描歌曲 */ 16 scanSongs(); 17 18 /* 按钮信号槽连接 */ 19 connect(pushButton[0], SIGNAL(clicked()), 20 this, SLOT(btn_previous_clicked())); 21 connect(pushButton[1], SIGNAL(clicked()), 22 this, SLOT(btn_play_clicked())); 23 connect(pushButton[2], SIGNAL(clicked()), 24 this, SLOT(btn_next_clicked())); 25 26 /* 媒体信号槽连接 */ 27 connect(musicPlayer, 28 SIGNAL(stateChanged(QMediaPlayer::State)), 29 this, 30 SLOT(mediaPlayerStateChanged(QMediaPlayer::State))); 31 connect(mediaPlaylist, 32 SIGNAL(currentIndexChanged(int)), 33 this, 34 SLOT(mediaPlaylistCurrentIndexChanged(int))); 35 connect(musicPlayer, SIGNAL(durationChanged(qint64)), 36 this, 37 SLOT(musicPlayerDurationChanged(qint64))); 38 connect(musicPlayer, 39 SIGNAL(positionChanged(qint64)), 40 this, 41 SLOT(mediaPlayerPositionChanged(qint64))); 42 43 /* 列表信号槽连接 */ 44 connect(listWidget, SIGNAL(itemClicked(QListWidgetItem*)), 45 this, SLOT(listWidgetCliked(QListWidgetItem*))); 46 47 /* slider 信号槽连接 */ 48 connect(durationSlider, SIGNAL(sliderReleased()), 49 this, SLOT(durationSliderReleased())); 50/* 失去焦点 */ 52 this->setFocus(); 53 }
由于代码较长,放置部分代码。
分析:先建立好界面,确定好布局再实现功能,一般流程都这样布局 msuicLayout()的内容比较多,也不难,但是比较复杂,看这种布局是没有难度的,这里就不多解释了。没有好看的布局也能完成本例。如果您喜欢这种布局方法,您需要多花点时间去研究如何布局才好看,这些没有固定的方法,完全是一个人的审美感。
第四:程序运行效果
先点击构建项目,项目构建完成后,再将本例的 myMusic 歌曲文件夹拷贝到可执行程序的文件夹同一级目录下,也就是 build-14_musicplayer-Desktop_Qt_5_12_9_GCC_64bit-Debug 目录 下(windows 需要进入到 debug 目录)。再点击运行,就出现歌曲在列表里,如下图,点击播放 即可播放歌曲,上一曲,下一曲也可以用。注意右下角的某些按钮功能,在本例没有继续去实 现,比如音量控制,可以直接加一个垂直方向的滑条,然后控制媒体的软件音量即可。留给读 者自由发挥,可以基于本例去开发,就当读者练习吧。本例的界面开发笔者还是比较满意的,前面的界面都比较普通,笔者个人 Qt 开发重要的是界面与稳定性,功能是次要的!