Qt項(xiàng)目實(shí)戰(zhàn)之實(shí)現(xiàn)MP3音樂(lè)播放器
音樂(lè)播放器邏輯
首先通過(guò)打開(kāi)文件,獲取文件夾下mp3文件的名字,將其存入QTableWidget控件下,通過(guò)雙擊QTableWidget空間中的內(nèi)容,播放相應(yīng)的mp3音樂(lè)文件,同時(shí)通過(guò)使用QMediaPlaylist來(lái)實(shí)現(xiàn)上一首,下一首的功能。
效果圖

具體實(shí)現(xiàn)
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
class QMediaPlayer;
class QMediaPlaylist;
class QLabel;
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
void InitWidget();
~Widget();
private slots:
void on_pushButton_clicked();
void on_pushButton_5_clicked();
void musicplayer(int,int);
void on_pushButton_7_clicked();
void on_pushButton_8_clicked();
void on_pushButton_6_clicked(bool checked);
void valueChanged(qint64 value);
void setPositon(int);
void updateDuration(qint64 duration);
protected:
private:
void findFile(const QString&path,std::vector<QString>& fileNames);
Ui::Widget *ui;
QString path;
QMediaPlayer *player;
QMediaPlaylist *playlist;
int num_music;
int status = 1;
qint64 position;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include<QFileDialog>
#include<QDebug>
#include<QMediaPlayer>
#include<QTableWidgetItem>
#include<QMouseEvent>
#include<QMediaPlaylist>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
player = new QMediaPlayer(this);
playlist = new QMediaPlaylist;
ui->setupUi(this);
InitWidget();
connect(ui->tableWidget,&QTableWidget::cellDoubleClicked,this,&Widget::musicplayer);
connect(ui->horizontalSlider,&QSlider::sliderMoved,this,&Widget::setPositon);
connect(player, &QMediaPlayer::durationChanged, this, &Widget::updateDuration);
connect(player,&QMediaPlayer::positionChanged,this,&Widget::valueChanged);
}
void Widget::InitWidget()
{
ui->label_2->hide();
ui->label_3->hide();
ui->tableWidget->hide();
ui->pushButton_5->hide();
ui->pushButton_6->hide();
ui->pushButton_7->hide();
ui->pushButton_8->hide();
ui->horizontalSlider->hide();
ui->label_4->hide();
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
ui->label_2->show();
ui->tableWidget->show();
ui->pushButton_5->show();
}
void Widget::on_pushButton_5_clicked()
{
path = QFileDialog::getExistingDirectory(this,"請(qǐng)選擇本地音樂(lè)文件夾");
std::vector<QString> fileNames;
findFile(path,fileNames);
//設(shè)置行數(shù),列數(shù)
ui->tableWidget->setColumnCount(1);
ui->tableWidget->setRowCount(fileNames.size());
num_music = fileNames.size();
for(int i=0;i<fileNames.size();i++)
{
ui->tableWidget->setItem(i,0,new QTableWidgetItem(fileNames[i]));
//設(shè)置cell不可編輯
QTableWidgetItem* pItem = ui->tableWidget->item(i, 0);
int editflag = Qt::ItemIsEditable;
pItem->setFlags((Qt::ItemFlag)(~editflag & pItem->flags()));
}
}
static QString formatTime(qint64 timeMilliSeconds)
{
qint64 seconds = timeMilliSeconds / 1000;
const qint64 minutes = seconds / 60;
seconds -= minutes * 60;
return QStringLiteral("%1:%2")
.arg(minutes, 2, 10, QLatin1Char('0'))
.arg(seconds, 2, 10, QLatin1Char('0'));
}
void Widget::musicplayer(int row, int column)
{
QTableWidgetItem *item = new QTableWidgetItem;
playlist->clear();
player->pause();
item = ui->tableWidget->item(row,0);
// player->setMedia(QUrl::fromLocalFile(item->text()));
for(int i=row;i<num_music;i++)
{
item = ui->tableWidget->item(i,0);
playlist->addMedia(QUrl::fromLocalFile(item->text()));
}
playlist->setCurrentIndex(0);
playlist->setPlaybackMode(QMediaPlaylist::Loop);
player->setPlaylist(playlist);
player->play();
ui->label_3->show();
ui->pushButton_6->show();
ui->pushButton_7->show();
ui->pushButton_8->show();
ui->horizontalSlider->show();
ui->label_4->setText(formatTime(0));
ui->label_4->show();
}
void Widget::findFile(const QString &path, std::vector<QString> &fileNames)
{
QDir dir(path);
//獲取path下所有文件夾和文件
dir.setFilter(QDir::Dirs|QDir::Files|QDir::NoDotAndDotDot); //文件夾/文件/不包含./和../
//排序文件夾優(yōu)先
dir.setSorting(QDir::DirsFirst);
//獲取文件夾下所有文件(文件夾+文件)
QFileInfoList list = dir.entryInfoList();
if(list.size()==0)
{
return;
}
//遍歷
for(int i=0;i<list.size();i++)
{
QFileInfo fileInfo = list.at(i);
if(fileInfo.isDir())
{
findFile(fileInfo.filePath(),fileNames);
}
else {
if(fileInfo.suffix()=="mp3")
{
fileNames.emplace_back(list.at(i).filePath());
}
}
}
}
void Widget::on_pushButton_7_clicked()
{
playlist->next();
}
void Widget::on_pushButton_8_clicked()
{
playlist->previous();
}
void Widget::on_pushButton_6_clicked(bool checked)
{
int status1 = status%2;
//qDebug()<<checked;
if(status1==0)
{
player->setPosition(position);
player->play();
ui->pushButton_6->setIcon(QPixmap("C:/Users/11830/Downloads/4.jpg"));
}
else {
player->pause();
position = player->position();
ui->pushButton_6->setIcon(QPixmap("C:/Users/11830/Downloads/1.jpg"));
}
status+=1;
}
void Widget::valueChanged(qint64 value)
{
ui->horizontalSlider->setValue(value);
ui->label_4->setText(formatTime(value));
ui->label_3->setText(player->metaData("Title").toString());
}
void Widget::setPositon(int value)
{
if (qAbs(player->position() - value) > 99)
player->setPosition(value);
//qDebug()<<(value*player->duration()/100);
}
void Widget::updateDuration(qint64 duration)
{
ui->horizontalSlider->setRange(0, duration);
ui->horizontalSlider->setEnabled(duration > 0);
ui->horizontalSlider->setPageStep(duration / 10);
}
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
到此這篇關(guān)于Qt項(xiàng)目實(shí)戰(zhàn)之實(shí)現(xiàn)MP3音樂(lè)播放器的文章就介紹到這了,更多相關(guān)Qt MP3音樂(lè)播放器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c語(yǔ)言實(shí)現(xiàn)http下載器的方法
這篇文章主要介紹了c語(yǔ)言實(shí)現(xiàn)http下載器的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07
關(guān)于"引用"的幾點(diǎn)說(shuō)明介紹
引用聲明完畢后,相當(dāng)于目標(biāo)變量名有兩個(gè)名稱,即該目標(biāo)原名稱和引用名,且不能再把該引用名作為其他變量名的別名2013-09-09
VScode編譯C++ 頭文件顯示not found的問(wèn)題
這篇文章主要介紹了VScode編譯C++ 頭文件顯示not found的問(wèn)題,本文給大家分享問(wèn)題解決方法,通過(guò)截圖的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下2020-03-03
Linux中使用C語(yǔ)言實(shí)現(xiàn)基于UDP協(xié)議的Socket通信示例
這篇文章主要介紹了Linux中使用C語(yǔ)言實(shí)現(xiàn)基于UDP協(xié)議的socket通信示例,服務(wù)器端與客戶端的功能都非?;A(chǔ),需要的朋友可以參考下2016-03-03
C語(yǔ)言實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用集合(HashSet)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用集合,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
C++實(shí)現(xiàn)簡(jiǎn)單FTP客戶端軟件開(kāi)發(fā)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單FTP客戶端軟件開(kāi)發(fā),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08

