用Qt写一个简单的音乐播放器(四):歌曲浏览、上一曲、下一曲 您所在的位置:网站首页 播放一首农历是什么歌 用Qt写一个简单的音乐播放器(四):歌曲浏览、上一曲、下一曲

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

2024-06-22 15:13| 来源: 网络整理| 查看: 265

一、前言

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

之前已经实现过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 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 #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


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有