1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 用Qt写一个简单的音乐播放器(四):歌曲浏览 上一曲 下一曲

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

时间:2022-01-09 14:55:29

相关推荐

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

一、前言

在用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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。