1 Star 0 Fork 0

灵荼山克府/LTSKFMusicPlayer

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
playerwindow.cpp 15.46 KB
一键复制 编辑 原始数据 按行查看 历史
灵荼山克府 提交于 2025-04-03 14:10 +08:00 . 增加了ini配置文件功能
#include "playerwindow.h"
#include "ui_playerwindow.h"
#include "playerwindow.h"
PlayerWindow::PlayerWindow(QWidget *parent)
: QMainWindow(parent),
musicDir("D:/Qt/Workspace/LTSYFMusicPlayer/ltskfmusic-player/Music"),
playMod(ORDER_MODE),
isShowList(false),
isShowHistory(false),
ui(new Ui::PlayerWindow)
{
// 设置窗口标题
setWindowTitle("音乐播放器");
// 设置窗口图标
QIcon icon(":/icon/Music.png"); // 替换为你的图标路径
if (!icon.isNull()) {
setWindowIcon(icon);
} else {
qDebug() << "图标加载失败";
}
ui->setupUi(this);
// 获取随机种子
srand(time(nullptr));
// 创建媒体播放器
player = new QMediaPlayer(this);
// 设置窗口的标题
setWindowTitle("音乐播放器");
setFixedSize(1020, 576);
// 设置背景
setBackGround(":/image/" + getRandomBackGround());
// 初始化按钮
initButtons();
// 尝试加载默认音乐目录
setListWidgetMusicListItems();
}
PlayerWindow::~PlayerWindow()
{
delete ui;
}
// 初始化按钮和其他控件
void PlayerWindow::initButtons(){
setButtonStyle(ui->pushButtonPrev, ":/icon/Perv.png");
setButtonStyle(ui->pushButtonPlayer, ":/icon/Player.png");
setButtonStyle(ui->pushButtonNext, ":/icon/Next.png");
setButtonStyle(ui->pushButtonMode, ":/icon/Order.png");
setButtonStyle(ui->pushButtonOpenDir, ":/icon/OpenDir.png");
setButtonStyle(ui->pushButtonList, ":/icon/list.png");
setButtonStyle(ui->pushButtonHistory, ":/icon/History.png");
//setButtonStyle(ui->pushButtonChangeUser, ":/icon/User.png");
ui->listWidgetMusicList->setStyleSheet("QListWidget{"
"border:none;"
"border-radius:20px;"
"background-color:rgba(255, 255, 255, 0.7);}");
ui->listWidgetMusicHistoryList->setStyleSheet("QListWidget{"
"border:none;"
"border-radius:20px;"
"background-color:rgba(255, 255, 255, 0.7);}");
ui->listWidgetMusicList->hide();
ui->listWidgetMusicHistoryList->hide();
// 设置音量bar从0-100
ui->horizontalSliderVolume->setRange(0, 100);
ui->horizontalSliderVolume->setValue(70);
connect(ui->pushButtonOpenDir, &QPushButton::clicked, this, &PlayerWindow::handleOpenMusicDirSlot);
connect(ui->pushButtonPlayer, &QPushButton::clicked, this, &PlayerWindow::handlePlayerSlot);
connect(ui->pushButtonMode, &QPushButton::clicked, this, &PlayerWindow::handleModeSlot);
connect(ui->pushButtonNext, &QPushButton::clicked, this, &PlayerWindow::handleNextSlot);
connect(ui->pushButtonPrev, &QPushButton::clicked, this, &PlayerWindow::handlePrevSlot);
connect(ui->pushButtonList, &QPushButton::clicked, this, &PlayerWindow::handleMusicListSlot);
connect(ui->pushButtonHistory, &QPushButton::clicked, this, &PlayerWindow::handleMusicHistoryListSlot);
// 处理音乐总长度
connect(player, &QMediaPlayer::durationChanged, this, &PlayerWindow::handleDurationSlot);
// 从音频解码器处获取音乐时间的变化
connect(player, &QMediaPlayer::positionChanged, this, &PlayerWindow::handlePositionSlot);
// 检测音乐进度条的变化
connect(ui->horizontalSliderMusicProgressBar, &QSlider::valueChanged, this, &PlayerWindow::onProgressBarReachedEnd);
// 检测音量进度条的变化
connect(ui->horizontalSliderVolume, &QSlider::valueChanged, this, &PlayerWindow::onVolumeBarSlot);
}
// 设置按钮样式
void PlayerWindow::setButtonStyle(QPushButton *button, const QString &filename){
// 设置按钮大小和图标,图标大小,按钮透明
button->setFixedSize(50, 50);
button->setIcon(QIcon(filename));
button->setIconSize(QSize(button->width(), button->height()));
button->setStyleSheet("background-color:transparent");
}
// 获取随机背景
QString PlayerWindow::getRandomBackGround()
{
QString path = ":/image";// 配置qt目录
QDir dir(path);// 根据目录构造对象
if(!dir.exists()){
// 不存在就创建
dir.mkdir(path);
}
// 提取目录下的文件并显示在list容器中 仅提取文件并按name排序
QStringList dirList = dir.entryList(QDir::Files, QDir::Name);
return dirList[rand() % dirList.size()];
}
// 设置窗口背景及透明度
void PlayerWindow::setBackGround(const QString &filename)
{
// 创建照片
QPixmap pixmap(filename);
// 获取窗口大小
QSize windowSize = this->size();
// 将图片缩放
QPixmap scalePixmap = pixmap.scaled(windowSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
// 创建对象并设置背景
QPalette palette = this->palette();
// 传递缩放后的图片给 QBrush
palette.setBrush(QPalette::Background, QBrush(scalePixmap));
// 将调色板应用到窗口
this->setPalette(palette);
this->setAutoFillBackground(true);
// 设置窗口透明度
this->setWindowOpacity(0.9);
}
// 将目录中的文件添加到音乐
void PlayerWindow::setListWidgetMusicListItems(QString musicDir)
{
QDir dir(musicDir);// 根据目录构造对象
if(!dir.exists()){
// 不存在就退出
return ;
}
// 清楚history的内容保证不会出现bug
ui->listWidgetMusicHistoryList->clear();
// 提取目录下的文件并显示在list容器中
QStringList dirList = dir.entryList();
// 清空list内容后显示
ui->listWidgetMusicList->clear();
for (auto it = dirList.begin(); it != dirList.end(); ++it) {
// 设置过滤
if((*it).endsWith(".mp3")){
ui->listWidgetMusicList->addItem(*it);
}
}
// 检查 QListWidget 是否为空
if (ui->listWidgetMusicList->count() == 0) {
// 没有找到 MP3 文件,不执行后续操作
qDebug() << "未找到 MP3 文件";
// 将 player 的媒体内容设为空
player->stop();
ui->pushButtonPlayer->setIcon(QIcon(":/icon/Player.png"));
player->setMedia(QMediaContent());
return;
}
// 默认第一行
ui->listWidgetMusicList->setCurrentRow(0);
// 尝试加载初始音乐文件
initMusicPlayer();
player->stop();
ui->pushButtonPlayer->setIcon(QIcon(":/icon/Player.png"));
}
// 加载音乐文件
void PlayerWindow::initMusicPlayer()
{
QString musicName = ui->listWidgetMusicList->currentItem()->text();
QString musicAbsPath = musicDir + "/" + musicName;
player->setMedia(QUrl::fromLocalFile(musicAbsPath));
qDebug() << musicAbsPath;
// 检查是否有错误发生
if (player->error() != QMediaPlayer::NoError) {
qDebug() << "音乐加载错误: " << player->errorString();
// 播放下一首音乐
handleNextSlot();
}
}
// 播放下一首音乐
void PlayerWindow::handleNextSlot()
{
// 媒体配置为空就返回
if(player->media().isNull()){
return ;
}
// 获取当前行
int currentRow = ui->listWidgetMusicList->currentRow();
int nextRow = 0;
if(playMod == ORDER_MODE){
nextRow = (currentRow + 1) % ui->listWidgetMusicList->count();
}else if(playMod == RANDOM_MODE){
int cnt = 3;
do{
nextRow = rand() % ui->listWidgetMusicList->count();
}while((nextRow == currentRow) && (cnt-- >= 0));
}else if(playMod == CIRCLE_MOD){
nextRow = currentRow;
}
ui->listWidgetMusicList->setCurrentRow(nextRow);
// 向历史记录中添加音乐名称
ui->listWidgetMusicHistoryList->addItem(ui->listWidgetMusicList->currentItem()->text());
startPlayMusic();
}
// 播放上一首音乐
void PlayerWindow::handlePrevSlot()
{
// 媒体配置为空就返回
if(player->media().isNull()){
return ;
}
// 获取当前行
int currentRow = ui->listWidgetMusicList->currentRow();
int prevRow = 0;
if(playMod == ORDER_MODE){
prevRow = (currentRow - 1 + ui->listWidgetMusicList->count()) % ui->listWidgetMusicList->count();
}else if(playMod == RANDOM_MODE){
int cnt = 3;
do{
prevRow = rand() % ui->listWidgetMusicList->count();
}while((prevRow == currentRow) && (cnt-- >= 0));
}else if(playMod == CIRCLE_MOD){
prevRow = currentRow;
}
ui->listWidgetMusicList->setCurrentRow(prevRow);
// 向历史记录中添加音乐名称
ui->listWidgetMusicHistoryList->addItem(ui->listWidgetMusicList->currentItem()->text());
startPlayMusic();
}
// 播放音乐
void PlayerWindow::startPlayMusic()
{
initMusicPlayer();
handlePlayerSlot();
}
// 渐入动画
void PlayerWindow::showAnimation(QWidget *window)
{
// 改变窗口位置
QPropertyAnimation animation(window, "pos");
// 动画持续时间
animation.setDuration(500);
// 移动起始坐标
animation.setStartValue(QPoint(this->width(), 0));
// 移动终止坐标
animation.setEndValue(QPoint(this->width() - ui->listWidgetMusicList->width(), 0));
animation.start();
// 因为动画需要持续
// 所以需要加上事件循环
QEventLoop loop;
// 等待动画结束
connect(&animation, &QPropertyAnimation::finished, &loop, &QEventLoop::quit);
loop.exec();
}
// 渐出动画
void PlayerWindow::hideAnimation(QWidget *window)
{
// 改变窗口位置
QPropertyAnimation animation(window, "pos");
// 动画持续时间
animation.setDuration(500);
// 移动起始坐标
animation.setStartValue(QPoint(this->width() - ui->listWidgetMusicList->width(), 0));
// 移动终止坐标
animation.setEndValue(QPoint(this->width(), 0));
animation.start();
// 因为动画需要持续
// 所以需要加上事件循环
QEventLoop loop;
// 等待动画结束
connect(&animation, &QPropertyAnimation::finished, &loop, &QEventLoop::quit);
loop.exec();
}
// 把毫秒转换为 mm:ss 格式的字符串
QString PlayerWindow::millisecondsToMMSS(int milliseconds)
{
int totalSeconds = milliseconds / 1000;
int minutes = totalSeconds / 60;
int seconds = totalSeconds % 60;
return QString("%1:%2").arg(minutes, 2, 10, QChar('0')).arg(seconds, 2, 10, QChar('0'));
}
// 打开音乐文件夹或默认文件夹
void PlayerWindow::handleOpenMusicDirSlot()
{
QString tempMusicDir = QFileDialog::getExistingDirectory(this, "选择文件夹", "Music");
if (!tempMusicDir.isEmpty()) { // 检查路径是否为空
musicDir = tempMusicDir;
setListWidgetMusicListItems(tempMusicDir);
} else {
// 可以在这里添加一些提示信息,告知用户没有选择文件夹
qDebug() << "未选择文件夹";
}
}
// 控制音乐播放状态
void PlayerWindow::handlePlayerSlot()
{
// 媒体配置为空就返回
if(player->media().isNull()){
return ;
}
if (player->state() == QMediaPlayer::PlayingState) {
player->pause();
ui->pushButtonPlayer->setIcon(QIcon(":/icon/Player.png"));
} else if (player->state() == QMediaPlayer::PausedState || player->state() == QMediaPlayer::StoppedState) {
if (player->media().isNull()) {
qDebug() << "没有媒体被加载";
return;
}
player->play();
ui->pushButtonPlayer->setIcon(QIcon(":/icon/Stop.png"));
ui->labelMusicName->setText(ui->listWidgetMusicList->currentItem()->text());
} else {
qDebug() << "未知的状态:" << player->state();
}
}
// 选择播放模式
void PlayerWindow::handleModeSlot()
{
if(playMod == ORDER_MODE){
playMod = RANDOM_MODE;
ui->pushButtonMode->setIcon(QIcon(":/icon/Random.png"));
}else if(playMod == RANDOM_MODE){
playMod = CIRCLE_MOD;
ui->pushButtonMode->setIcon(QIcon(":/icon/One.png"));
}else if(playMod == CIRCLE_MOD){
playMod = ORDER_MODE;
ui->pushButtonMode->setIcon(QIcon(":/icon/Order.png"));
}
}
// 实现双击列表播放音乐功能
void PlayerWindow::on_listWidgetMusicList_itemDoubleClicked(QListWidgetItem *item)
{
// 获取当前点击的行
int index = ui->listWidgetMusicList->row(item);
ui->listWidgetMusicList->setCurrentRow(index);
// 向历史记录中添加音乐名称
ui->listWidgetMusicHistoryList->addItem(ui->listWidgetMusicList->currentItem()->text());
startPlayMusic();
}
// 处理音乐列表
void PlayerWindow::handleMusicListSlot()
{
if(!isShowList){
if(isShowHistory){
handleMusicHistoryListSlot();
}
ui->listWidgetMusicList->show();
// 以动画的方式出现
showAnimation(ui->listWidgetMusicList);
isShowList = true;
}else{
// 以动画的方式消失
hideAnimation(ui->listWidgetMusicList);
ui->listWidgetMusicList->hide();
isShowList = false;
}
}
// 处理音乐历史列表
void PlayerWindow::handleMusicHistoryListSlot()
{
if(!isShowHistory){
if(isShowList){
handleMusicListSlot();
}
ui->listWidgetMusicHistoryList->show();
// 以动画的方式出现
showAnimation(ui->listWidgetMusicHistoryList);
isShowHistory = true;
}else{
// 以动画的方式消失
hideAnimation(ui->listWidgetMusicHistoryList);
ui->listWidgetMusicHistoryList->hide();
isShowHistory = false;
}
}
// 处理音乐进度条的变化
void PlayerWindow::handlePositionSlot(int position)
{
// 更新进度条
ui->horizontalSliderMusicProgressBar->setValue(position);
QString musicCurrTime = millisecondsToMMSS(position);
ui->labelMusicCurrTime->setText(musicCurrTime);
}
// 处理音乐时长
void PlayerWindow::handleDurationSlot(int duration)
{
// 进度条起始是0,终止是音乐总时长
ui->horizontalSliderMusicProgressBar->setRange(0, duration);
// 毫秒转成分钟
QString musicTotalTime = millisecondsToMMSS(duration);
ui->labelMusicTotalTime->setText(musicTotalTime);
}
// 获取拖动进度条的进度调整音乐的播放位置
void PlayerWindow::on_horizontalSliderMusicProgressBar_sliderMoved(int position)
{
player->setPosition(position);
}
// 监听下一首播放的时机
void PlayerWindow::onProgressBarReachedEnd()
{
if (ui->horizontalSliderMusicProgressBar->value() == ui->horizontalSliderMusicProgressBar->maximum()) {
// 进度条达到最大值,调用播放下一首的函数
handleNextSlot();
}
}
// 处理音量
void PlayerWindow::onVolumeBarSlot()
{
player->setVolume(ui->horizontalSliderVolume->value());
}
// 处理点击历史音乐列表的事件
void PlayerWindow::on_listWidgetMusicHistoryList_itemDoubleClicked(QListWidgetItem *item)
{
// 获取当前点击的行
int index = ui->listWidgetMusicHistoryList->row(item);
ui->listWidgetMusicHistoryList->setCurrentRow(index);
// 找到音乐列表中对应位置
QString musicName = ui->listWidgetMusicHistoryList->currentItem()->text();
for (int i = 0; i < ui->listWidgetMusicList->count(); ++i) {
QListWidgetItem *item = ui->listWidgetMusicList->item(i);
if (item->text() == musicName) {
ui->listWidgetMusicList->setCurrentRow(i);
break;
}
}
startPlayMusic();
}
void PlayerWindow::setUserName(QString name)
{
if(name == ""){
name = "游客";
}
ui->labelUserName->setText(name);
}
void PlayerWindow::on_pushButtonChangeUser_clicked()
{
engine = new QQmlApplicationEngine;
engine->load(QUrl(QStringLiteral("qrc:/Login.qml")));
this->close();
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/LTSKF/ltskfmusic-player.git
git@gitee.com:LTSKF/ltskfmusic-player.git
LTSKF
ltskfmusic-player
LTSKFMusicPlayer
master

搜索帮助