在用Qt写一个简单的音乐播放器(一):使用QMediaPlayer播放音乐中,我们已经知道如何去使用QMediaPlayer播放音乐。
在用Qt写一个简单的音乐播放器(二):增加界面(开始和暂停音乐)中,我们增加了播放音乐/暂停音乐的按钮。
在用Qt写一个简单的音乐播放器(三):增加界面(播放跳转与音量控制)中,我们加入了播放控制和音量控制。
但是从头到尾,我们一直都只能播放一首歌曲,连选择歌曲都不行,怎么能算是音乐播放器呢?
这一篇就来谈一谈歌曲选择播放的问题。
想要选择歌曲,肯定是要浏览文件夹的,那么首先就要面临的问题就是选择什么控件显示,什么事件触发?
如上图所示,首先我们选择一个按钮,并将其重命名为btnAddMusic
如上图所示,这里我选择的是List Widget。将其拖动到设计界面上,然后为了编程方便,重命名为lwMusicList。
如上图所示,选择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
#include
#include
……
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了,这里做一个小小的改进,将二者合为一个按钮来实现。
删掉与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 选择上一首、下一首。
是否到这里就结束了呢?当然不!还有很多,比如歌词显示、换肤、播放时间、在线音乐等等。这些功能,敬请期待之后的文章。
夜逐渐地深了,晚安!
#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);
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include // 包含头文件
#include
#include
#include
#include
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
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