一、前言
在用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