VS+QT 简易音乐播放器实现

本文介绍了使用C++开发的音乐播放器,包括音乐列表选择、播放控制、上一曲和下一曲操作,以及文件夹选择和滑动条与播放进度的联动。通过QMediaPlayer库实现音频播放,并展示了UI设计和背景设置细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、所需头文件

#include <QFileDialog>//打开音乐列表文件夹
#include <QtMultimedia/QMediaPlayer>//播放音乐

 2、UI设计

3、播放按钮代码

void Demo1::on_play()
{
	if (!path.isEmpty())
	{
		if (a_play == 0)
		{
			a_play = 1;
			ui.pushButton_3->setStyleSheet(QStringLiteral("border-image: url(:/Demo1/Resources/icon/播放切换键.png);"));
			int index = ui.listWidget->currentRow();//获取当前选中的行号
			ui.listWidget->setCurrentRow(index);

			if (player->isAudioAvailable())//检查音频是否可用
			{
				player->play();//继续播放
			}
			else
			{
				QFileInfo m_Info(path);
				QString str_name = m_Info.absoluteFilePath();//获取路径
				QDir dir(path);
				QStringList mNames = dir.entryList(QDir::Files);
				str_name = str_name + "/" + mNames[index];

				qDebug() << str_name;
				player->setMedia(QUrl::fromLocalFile(str_name));
				//player->setVolume(20); //0~100音量范围,默认是100
				player->play();
			}
		}
		else
		{
			a_play = 0;
			ui.pushButton_3->setStyleSheet(QStringLiteral("border-image:url(:/Demo1/Resources/icon/播放键.png);"));
			player->pause();//暂停
		}
	}
	else
	{  
		return;
	}
}

 4、上一首代码块

void Demo1::on_left()
{
	int index = ui.listWidget->currentRow();//获取当前选中的行号
	if (index >= 1)
	{
		index = index - 1;
	}
	ui.listWidget->setCurrentRow(index);

	if (path.isEmpty())
	{
		return;
	}
	QFileInfo m_Info(path);
	QString str_name = m_Info.absoluteFilePath();//获取路径
	QDir dir(path);
	QStringList mNames = dir.entryList(QDir::Files);
	str_name = str_name + "/" + mNames[index];

	qDebug() << str_name;

	player->setMedia(QUrl::fromLocalFile(str_name));
	//player->setVolume(20); //0~100音量范围,默认是100
	player->play();
}

5、下一首播放代码块

void Demo1::on_right()
{
	int index = ui.listWidget->currentRow();//获取当前选中的行号
	qDebug() << ui.listWidget->count();
	if (index < ui.listWidget->count()-1)
	{
		index = index + 1;
	}
	ui.listWidget->setCurrentRow(index);

	if (path.isEmpty())
	{
		return;
	}
	QFileInfo m_Info(path);
	QString str_name = m_Info.absoluteFilePath();//获取路径
	QDir dir(path);
	QStringList mNames = dir.entryList(QDir::Files);
	str_name = str_name + "/" + mNames[index];

	qDebug() << str_name;

	player->setMedia(QUrl::fromLocalFile(str_name));
	//player->setVolume(20); //0~100音量范围,默认是100
	player->play();
}

4、音乐列表获取代码

void Demo1::on_list()
{
	path = QFileDialog::getExistingDirectory(NULL, QStringLiteral("请选择文件所在目录"), "./");
	QDir dir(path);
	qDebug() << path;
	QStringList mNames = dir.entryList(QDir::Files);
	ui.listWidget->addItems(mNames);
	ui.listWidget->setCurrentRow(0);
}

5、滑动条与播放时长连接代码

void Demo1::setSound(qint64)
{
	qint64 m_duration;
	m_duration = player->duration();
	ui.slider->setMaximum(m_duration);
	int secound = m_duration / 1000;
	int min = secound / 60;
	secound = secound % 60;
	durationtime = QString("%1:%2").arg(min).arg(secound);
	ui.label->setText(durationtime);
}

void Demo1::onPositionChanged(qint64 m_position)
{
	ui.slider->setSliderPosition(m_position);//根据当前时长设置滑动条位置-实时移动
}

6、滑动条与音量连接代码

void Demo1::on_vulme()
{
	if (!m_vulme)
	{
		m_vulme = true;
		ui.pushButton_5->setStyleSheet(QStringLiteral("border-image:url(:/Demo1/Resources/icon/静音.png);"));
		player->setVolume(0);
		ui.label_2->setText(QString::number(0));
		ui.verticalSlider->setValue(0);
	}
	else
	{
		m_vulme = false;
		ui.pushButton_5->setStyleSheet(QStringLiteral("border-image:url(:/Demo1/Resources/icon/音量.png);"));
		player->setVolume(m_value);
		ui.label_2->setText(QString::number(m_value));
		ui.verticalSlider->setValue(m_value);
	}
}

void Demo1::on_vulme(int value)
{
	ui.label_2->setText(QString::number(value));
	player->setVolume(value);
	m_value = value;
}

7、效果图

 8、背景图设计代码

	//设置背景图片
	QPixmap Images(QStringLiteral(":/Demo1/Resources/icon/背景.png"));
	QPalette Palette = this->palette();
	Palette.setBrush(QPalette::Background, Images);
	this->setPalette(Palette);
	ui.listWidget->setStyleSheet("background-color:rgb(255,255,255,0)");//设置背景透明

9、窗口初始化函数

void Demo1::Init()
{
	player = new QMediaPlayer;
	player->setVolume(20);

	connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(on_list()));
	connect(ui.pushButton_3, SIGNAL(clicked()), this, SLOT(on_play()));
	connect(ui.pushButton_2, SIGNAL(clicked()), this, SLOT(on_left()));
	connect(ui.pushButton_4, SIGNAL(clicked()), this, SLOT(on_right()));
	connect(player, SIGNAL(durationChanged(qint64)), this, SLOT(setSound(qint64)));
	connect(player, SIGNAL(positionChanged(qint64)), this, SLOT(onPositionChanged(qint64)));
	connect(ui.pushButton_5, SIGNAL(clicked()), this, SLOT(on_vulme()));
	connect(ui.verticalSlider, SIGNAL(sliderMoved(int)), this, SLOT(on_vulme(int)));

	ui.pushButton_3->setStyleSheet(QStringLiteral("border-image:url(:/Demo1/Resources/icon/播放键.png);"));
	ui.label->setStyleSheet("color:white");//设置字体颜色
	ui.label_2->setStyleSheet("color:white");

	ui.label_2->setText(QString::number(20));

	//ui.horizontalSlider->setRange(0, 100);//设置滑动条范围
	//ui.horizontalSlider->setPageStep(5);//设置滑动条步长
	ui.verticalSlider->setRange(0,100);
	ui.verticalSlider->setValue(20);

	//设置背景图片
	QPixmap Images(QStringLiteral(":/Demo1/Resources/icon/背景.png"));
	QPalette Palette = this->palette();
	Palette.setBrush(QPalette::Background, Images);
	this->setPalette(Palette);
	ui.listWidget->setStyleSheet("background-color:rgb(255,255,255,0)");//设置背景透明

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值