一、前言

在用Qt写一个简单的音乐播放器(一):使用QMediaPlayer播放音乐中,我们已经知道如何去使用QMediaPlayer播放音乐。
在用Qt写一个简单的音乐播放器(二):增加界面(开始和暂停音乐)中,我们增加了播放音乐/暂停音乐的按钮。
在用Qt写一个简单的音乐播放器(三):增加界面(播放跳转与音量控制)中,我们加入了播放控制和音量控制。
但是从头到尾,我们一直都只能播放一首歌曲,连选择歌曲都不行,怎么能算是音乐播放器呢?
这一篇就来谈一谈歌曲选择播放的问题。

二、浏览文件夹

1.控件

想要选择歌曲,肯定是要浏览文件夹的,那么首先就要面临的问题就是选择什么控件显示,什么事件触发?

如上图所示,首先我们选择一个按钮,并将其重命名为btnAddMusic

如上图所示,这里我选择的是List Widget。将其拖动到设计界面上,然后为了编程方便,重命名为lwMusicList。

2.浏览文件夹


如上图所示,选择Add按钮,点击右键转到槽,选择Clicked(),点击OK,出现下图:

在这个槽函数中增加以下代码:

    QString fileName = QFileDialog::getExistingDirectory(NULL,"Select Music Dir",".",NULL);QDir dir(fileName);QStringList nameFilters;nameFilters << "*.mp3";QStringList files = dir.entryList(nameFilters, QDir::Files|QDir::Readable, QDir::Name);ui->lwMusicList->addItems(files);m_playPath = fileName;

这个时候,你如果构建,肯定是失败的,因为头文件和m_playPath还没有声明。所以 在mainwindow.h 中加入以下代码:

#include <QListWidgetItem>
#include <QString>
#include <QFileDialog>
……
QString m_playPath;

这个时候构建就可以添加歌曲文件了。

三、双击播放


如上图所示,选中控件,右键,转到槽,选择itemDoubleClicked(),点击OK,出现下图:

如上图所示,在这个槽函数中加入以下代码:

void MainWindow::on_lwMusicList_itemDoubleClicked(QListWidgetItem *item)
{m_mediaPlayer.stop();m_mediaPlayer.setMedia(QUrl::fromLocalFile(m_playPath+"/"+item->text()));m_mediaPlayer.play();ui->hSliderPlayProgress->setValue(m_mediaPlayer.position());connect(timer, SIGNAL(timeout()), this, SLOT(setSliderValue()))
}

四、Play与Pause

之前已经实现过Play与Pause了,这里做一个小小的改进,将二者合为一个按钮来实现。
删掉与Pause相关的函数以及控件,将play的槽函数修改为以下代码

void MainWindow::on_btnPlay_clicked()
{if(QMediaPlayer:: PlayingState == m_mediaPlayer.state()){m_mediaPlayer.pause();ui->btnPlay->setText("Play");}else{m_mediaPlayer.play();ui->btnPlay->setText("Pause");}
}

五、上一曲与下一曲

如图所示,首先增加pre和Next两个按钮,分别代码上一曲和下一曲,并且为了编程方便,重命名为btnPreMusic与btnNextMusic。

分别选中pre和Next按钮,点击右键转到槽,选择Clicked(),点击OK,出现下图所示两个槽函数:

分别在其中加入以下代码:

void MainWindow::on_btnPreMusic_clicked()
{if(m_PlayRow == 0){m_PlayRow = ui->lwMusicList->count() - 1;}else{m_PlayRow--;}QListWidgetItem *item = ui->lwMusicList->item(m_PlayRow);item->setSelected(true);m_mediaPlayer.stop();m_mediaPlayer.setMedia(QUrl::fromLocalFile(m_playPath+"/"+item->text()));m_mediaPlayer.play();
}void MainWindow::on_btnNextMusic_clicked()
{if(m_PlayRow + 1 == ui->lwMusicList->count()){m_PlayRow = 0;}else{m_PlayRow++;}QListWidgetItem *item = ui->lwMusicList->item(m_PlayRow);item->setSelected(true);m_mediaPlayer.stop();m_mediaPlayer.setMedia(QUrl::fromLocalFile(m_playPath+"/"+item->text()));m_mediaPlayer.play();
}

当然这样还是不行的,还差两行代码,分别是
在播放时初始化m_PlayRow,和在mainwindow.h中声明m_PlayRow。
加上这两行就可以使用了。完整代码,见最后。

 m_PlayRow = ui->lwMusicList->row(item);int m_PlayRow;

六、修改音量控制

我们可以看到很多音量控制都是隐藏的,不像我们现在这样一直显示,所以简单的修改一下,增加一个volume按钮,并重命名为btnVolume:

选择按钮,点击右键转到槽,选择Clicked(),点击OK,出现下图所示槽函数:

首先我们在初始化的时候,也就是构造函数中加入如下代码,使vSliderVolume默认不可见。

ui->vSliderVolume->setVisible(false);

然后在槽函数中加入以下代码:

void MainWindow::on_btnVolume_clicked()
{if(ui->vSliderVolume->isVisible()){ui->vSliderVolume->setVisible(false);}else{ui->vSliderVolume->setVisible(true);}
}

再加一个,鼠标离开滑块,自动隐藏的功能:

在生成的对应槽函数加入以下代码:

void MainWindow::on_vSliderVolume_sliderReleased()
{ui->vSliderVolume->setVisible(false);
}

七、效果

打开界面:

点击Add,添加歌曲:

显示歌曲播放进度,并且可以跳转播放
点击Pre/Next 选择上一首、下一首。

八、拓展

是否到这里就结束了呢?当然不!还有很多,比如歌词显示、换肤、播放时间、在线音乐等等。这些功能,敬请期待之后的文章。
夜逐渐地深了,晚安!
用Qt写一个简单的音乐播放器(五):歌曲播放时间显示

九、完整代码

1.mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);timer = new QTimer();timer->setInterval(2000);timer->start();ui->vSliderVolume->setVisible(false);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_btnPlay_clicked()
{if(QMediaPlayer:: PlayingState == m_mediaPlayer.state()){m_mediaPlayer.pause();ui->btnPlay->setText("Play");}else{m_mediaPlayer.play();ui->btnPlay->setText("Pause");}
}void MainWindow::on_hSliderPlayProgress_sliderMoved(int position)
{m_mediaPlayer.setPosition(m_mediaPlayer.duration()*position/100);
}
void MainWindow::setSliderValue()
{ui->hSliderPlayProgress->setValue(m_mediaPlayer.position()*100/m_mediaPlayer.duration());
}void MainWindow::on_vSliderVolume_sliderMoved(int position)
{m_mediaPlayer.setVolume(position);
}void MainWindow::on_lwMusicList_itemDoubleClicked(QListWidgetItem *item)
{m_PlayRow = ui->lwMusicList->row(item);m_mediaPlayer.stop();m_mediaPlayer.setMedia(QUrl::fromLocalFile(m_playPath+"/"+item->text()));m_mediaPlayer.play();ui->hSliderPlayProgress->setValue(m_mediaPlayer.position());ui->btnPlay->setText("Pause");connect(timer, SIGNAL(timeout()), this, SLOT(setSliderValue()));
}void MainWindow::on_btnAddMusic_clicked()
{QString fileName = QFileDialog::getExistingDirectory(NULL,"Select Music Dir",".",NULL);QDir dir(fileName);QStringList nameFilters;nameFilters << "*.mp3";QStringList files = dir.entryList(nameFilters, QDir::Files|QDir::Readable, QDir::Name);ui->lwMusicList->addItems(files);m_playPath = fileName;
}void MainWindow::on_btnPreMusic_clicked()
{if(m_PlayRow == 0){m_PlayRow = ui->lwMusicList->count() - 1;}else{m_PlayRow--;}QListWidgetItem *item = ui->lwMusicList->item(m_PlayRow);item->setSelected(true);m_mediaPlayer.stop();m_mediaPlayer.setMedia(QUrl::fromLocalFile(m_playPath+"/"+item->text()));m_mediaPlayer.play();
}void MainWindow::on_btnNextMusic_clicked()
{if(m_PlayRow + 1 == ui->lwMusicList->count()){m_PlayRow = 0;}else{m_PlayRow++;}QListWidgetItem *item = ui->lwMusicList->item(m_PlayRow);item->setSelected(true);m_mediaPlayer.stop();m_mediaPlayer.setMedia(QUrl::fromLocalFile(m_playPath+"/"+item->text()));m_mediaPlayer.play();
}void MainWindow::on_btnVolume_clicked()
{if(ui->vSliderVolume->isVisible()){ui->vSliderVolume->setVisible(false);}else{ui->vSliderVolume->setVisible(true);}
}void MainWindow::on_vSliderVolume_sliderReleased()
{ui->vSliderVolume->setVisible(false);
}

2.mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QtMultimedia/QMediaPlayer> // 包含头文件
#include <QTimer>
#include <QListWidgetItem>
#include <QString>
#include <QFileDialog>
namespace Ui {class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private slots:void on_btnPlay_clicked();void on_hSliderPlayProgress_sliderMoved(int position);void setSliderValue();void on_vSliderVolume_sliderMoved(int position);void on_lwMusicList_itemDoubleClicked(QListWidgetItem *item);void on_btnAddMusic_clicked();void on_btnPreMusic_clicked();void on_btnNextMusic_clicked();void on_btnVolume_clicked();void on_vSliderVolume_sliderReleased();private:Ui::MainWindow *ui;QMediaPlayer m_mediaPlayer; // 实例化对象QTimer *timer; //定时器QString m_playPath;int m_PlayRow;
};#endif // MAINWINDOW_H

用Qt写一个简单的音乐播放器(四):歌曲浏览、上一曲、下一曲相关推荐

  1. 用Qt写一个简单的音乐播放器(三):增加界面(播放跳转与音量控制)

    一.前言 在用Qt写一个简单的音乐播放器(一):使用QMediaPlayer播放音乐中,我们已经知道如何去使用QMediaPlayer播放音乐. 在用Qt写一个简单的音乐播放器(二):增加界面(开始和 ...

  2. 用Qt写一个简单的音乐播放器(六):显示歌词(正则表达式)

    一.前言 在用Qt写一个简单的音乐播放器(一):使用QMediaPlayer播放音乐中,我们已经知道如何去使用QMediaPlayer播放音乐. 在用Qt写一个简单的音乐播放器(二):增加界面(开始和 ...

  3. 用Qt写一个简单的音乐播放器(一):使用QMediaPlayer播放音乐

    一.前言 QMediaplayer可以用于解析音频文件和视频文件,继承自QMediaObject,涉及到的对象为QMediaContent.QMediaObject可以提供关于媒体内容的接入,通过UR ...

  4. 用Qt写一个简单的音乐播放器(五):歌曲播放时间显示

    一.前言 在用Qt写一个简单的音乐播放器(一):使用QMediaPlayer播放音乐中,我们已经知道如何去使用QMediaPlayer播放音乐. 在用Qt写一个简单的音乐播放器(二):增加界面(开始和 ...

  5. 用Qt写一个简单的音乐播放器(七):界面美化(QSS样式表)

    一.前言 在用Qt写一个简单的音乐播放器(一):使用QMediaPlayer播放音乐中,我们已经知道如何去使用QMediaPlayer播放音乐. 在用Qt写一个简单的音乐播放器(二):增加界面(开始和 ...

  6. 用C/C++写一个简单的音乐播放器(基于windows控制台编程)

    学习内容:1. 使用单例模式设计,让加载资源唯一化. 2. 控件管理. 3. 按键消息处理 4. 音频函数的使用 1. 资源管理与加载 1.1 公共头文件 将用到的头文件保存到一个公共头文件" ...

  7. 用java写一个简单的音乐播放器(二)

    前言 之前的版本,有位朋友说无法实现暂停播放,还有一些其他无伤大雅的bug,所以我就查了一波资料,研究了一下后,进行的一波优化. 这个版本的播放器,实现了:上一首.下一首.暂停/播放.目录浏览等功能. ...

  8. 使用python加PyQt5,利用QMediaPlayer写一个简易的音乐播放器(进度条拖动,音量改变,播放停止切换,歌曲列表))

    当你学习了python之后,总想着利用它去做些什么,无论是制作小工具还是小游戏,都是一种锻炼. 那么,利用python加上PyQt5写一个简单的音乐播放器,可能会是一个有趣的体验. 下面我会分享一下如 ...

  9. HTML+CSS+原生JS写一个简易的音乐播放器(仅播放一首歌)

    用HTML+CSS+原生JS写一个简易的音乐播放器(仅播放一首歌) 效果如下:(鼠标点击按钮可以实现播放或暂停,按钮会旋转,实现了歌词同步,功能还需改进) 代码如下: <!DOCTYPE htm ...

最新文章

  1. UVA - 10048 Audiophobia(Floyd求路径上最大值的最小)
  2. Jazz揭秘:下一代开发平台常见问题百科全说
  3. vue 数组中嵌套数组_vue+element-ui表单校验之数组多层嵌套
  4. 由浅到深理解ROS(9)- 几个基本概念的理解 坐标系 包
  5. 2029年计算机考试题目,计算机二级题集
  6. matlab 解析 mnist 数据集
  7. 1130 无法登录 mysql_无法登录phpmyadmin,报1130错误
  8. iOS12完美越狱来了!漫谈iOS12缓解机制
  9. 锤子pro2 Android8,锤子 坚果Pro2 MIUI10 Android N 快如闪电 指纹支付 完美ROOT
  10. 苹果电脑各型号支持的macOS版本列表
  11. vue中注释里@xxx是什么意思呢???
  12. 深入探索 Android 网络优化(二、网络优化基础篇)上
  13. 一周热图|王珞丹创立宠物用品品牌;超模何穗亮相雀巢冷萃自由大秀;乐高试点有声与盲文拼搭指南...
  14. 中小学线上教学平台让孩子轻松学,大屏教育软件打造居家小课堂
  15. 防止恶意刷新页面的Java实现
  16. 使用mui制作一个web2app类型的app
  17. 有哪些强大好用的音频格式转换软件?
  18. 点集拓扑学|2. 拓扑空间
  19. mysql安装bus error_如何解决mysql安装bus error问题
  20. DataX系列4-TxtFileWriter介绍

热门文章

  1. 华为云12·12直播EI专场即将开始,满足电商行业全场景搜索需求
  2. ionic3 ble蓝牙插件实现蓝牙锁开/关锁功能(ase128加解密)
  3. PostgreSQL语句大全
  4. 沁恒CH582M开发板-1-点亮LED
  5. 工业机器人喷涂实操工作站
  6. [Unity算法]平抛运动
  7. oracle创建实例
  8. php安装程序模板,1.2 安装模板
  9. kaggle验证步骤_经过验证的19个最佳步骤,如何找到工作
  10. oracle 支持64核,7nm下仅240W TDP AMD 64核霄龙处理器能效惊人