麦克雷 Mavom.cn
标题:
QT新手,不会做音乐播放器
[打印本页]
作者:
utsu
时间:
昨天 14:51
标题:
QT新手,不会做音乐播放器
#include "mainwidget.h"
#include "ui_mainwidget.h"
#include "myQss.h"
#include <QFileDialog>
#include <QDebug>
#include <QDir>
#include <QMediaPlayer>
#include <QAudioOutput>
#include <QUrl>
//#include <random>
#include <QListWidget>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
audioOutput = new QAudioOutput(this);
mediaPlayer = new QMediaPlayer(this);
QListWidget *likeMusicList = new QListWidget(this);
mediaPlayer->setAudioOutput(audioOutput);
ui->likeMusicList = likeMusicList;
ui->likeMusicList->hide();
connect(mediaPlayer,&QMediaPlayer::durationChanged,this,[this](qint64 duration)
{
ui->totalLabel->setText(QString("%1:%2").arg(duration/1000/60,2,10,QChar('0')).arg(duration/1000%60));
ui->playCourseSlider->setRange(0,duration);
});
connect(mediaPlayer,&QMediaPlayer::positionChanged,this,[=](qint64 pos)
{
ui->curLabel->setText(QString("%1:%2").arg(pos/1000/60,2,10,QChar('0')).arg(pos/1000%60));
ui->playCourseSlider->setValue(pos);
});
connect(ui->playCourseSlider,&QSlider::sliderMoved,mediaPlayer,&QMediaPlayer::setPosition);
audioOutput->setVolume(0.5);
connect(audioOutput, &QAudioOutput::volumeChanged, this, [this](int volume)
{
ui->volumeLabel->setText(QString::number(volume) + "%");
ui->VolumeSlider->setValue(volume);
});
connect(ui->VolumeSlider, &QSlider::valueChanged, this, [this](int value)
{
audioOutput->setVolume(value);
});
connect(mediaPlayer, &QMediaPlayer::mediaStatusChanged, this, [this](QMediaPlayer::MediaStatus status) {
if (status == QMediaPlayer::EndOfMedia) {
curPlayIndex = (curPlayIndex + 1) % playList.size();
ui->listWidget->setCurrentRow(curPlayIndex);
mediaPlayer->setSource(playList[curPlayIndex]);
mediaPlayer->play();
}
});
connect(ui->addItem, &QPushButton::clicked, this, &Widget::on_addItem_clicked);
connect(ui->deleteItem, &QPushButton::clicked, this, &Widget::on_deleteItem_clicked);
ui->volumeLabel->hide();
ui->VolumeSlider->setRange(0,100);
ui->VolumeSlider->setValue(50);
ui->LovelistWidget->hide();
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_2_clicked()
{
auto path = QFileDialog::getExistingDirectory(this,"请选择音乐所在目录","F:\\musicplayer\\MusicPlayer\\music");
QDir dir(path);
auto musicList = dir.entryList(QStringList()<<"*.mp3"<<"*wav");
ui->listWidget->addItems(musicList);
ui->listWidget->setCurrentRow(0);
for(auto file : musicList)
playList.append(QUrl::fromLocalFile(path+"/"+file));
}
void Widget::on_pushButton_3_clicked()
{
curPlayIndex = (curPlayIndex == 0? playList.size() - 1 : (curPlayIndex - 1) % playList.size());
ui->listWidget->setCurrentRow(curPlayIndex);
mediaPlayer->setSource(playList[curPlayIndex]);
mediaPlayer->play();
}
void Widget::on_player_clicked()
{
if(playList.empty())
{
return;
}
switch(mediaPlayer->playbackState())
{
case QMediaPlayer::PlaybackState::StoppedState:
{
curPlayIndex = ui->listWidget->currentRow();
mediaPlayer->setSource(playList[curPlayIndex]);
mediaPlayer->play();
}
break;
case QMediaPlayer::PlaybackState::PlayingState:
mediaPlayer->pause();
break;
case QMediaPlayer::PlaybackState::PausedState:
mediaPlayer->play();
break;
}
}
void Widget::on_pushButton_4_clicked()
{
curPlayIndex = (curPlayIndex+1)%playList.size();
ui->listWidget->setCurrentRow(curPlayIndex);
mediaPlayer->setSource(playList[curPlayIndex]);
mediaPlayer->play();
}
void Widget::on_listWidget_doubleClicked(const QModelIndex &index)
{
curPlayIndex = index.row();
mediaPlayer->setSource(playList[curPlayIndex]);
mediaPlayer->play();
}
void Widget::on_pushButton_5_clicked()
{
static bool isMuted = false;
static qreal previouslyStoredVolume = 0;
if (isMuted)
{
audioOutput->setVolume(previouslyStoredVolume);
isMuted = false;
} else {
previouslyStoredVolume = audioOutput->volume();
audioOutput->setVolume(0.0);
isMuted = true;
}
}
void Widget::on_VolumeSlider_sliderMoved(int position)
{
audioOutput->setVolume(position);
}
/*void Widget::on_playMode_clicked()
{
QAction *random = new QAction(QIcon(":F:/musicplayer/MusicPlayer/asserts/image-hover/play-random-hover.png"), "随机播放");
QAction *itemloop = new QAction(QIcon(":F:/musicplayer/MusicPlayer/asserts/image-hover/loop-one-hover.png"), "单曲循环");
QAction *loop = new QAction(QIcon(":F:/musicplayer/MusicPlayer/asserts/image-hover/loop-hover.png"), "循环播放");
connect(random, &QAction::triggered, this, [=]()
{
ui->playMode->setStyleSheet(RandomStyle());
ui->playMode->setIcon(QIcon(":F:/musicplayer/MusicPlayer/asserts/image-hover/play-random-hover.png"));
ui->playMode->setToolTip(u8"随机播放");
std::random_device rd;
std::mt19937 gen(rd());
std::shuffle(playList.begin(), playList.end(), gen);
curPlayIndex = 0;
mediaPlayer->setSource(playList[curPlayIndex]);
});
connect(itemloop, &QAction::triggered, this, [=]()
{
qDebug() << "ok1";
ui->playMode->setStyleSheet(LoopOneStyle());
ui->playMode->setIcon(QIcon(":F:/musicplayer/MusicPlayer/asserts/image-hover/loop-one-hover.png"));
ui->playMode->setToolTip(u8"单曲循环");
mediaPlayer->setSource(playList[curPlayIndex]);
});
connect(loop, &QAction::triggered, this, [=]()
{
ui->playMode->setStyleSheet(LoopStyle());
ui->playMode->setIcon(QIcon(":F:/musicplayer/MusicPlayer/asserts/image-hover/loop-hover.png"));
ui->playMode->setToolTip(u8"循环播放");
curPlayIndex = (curPlayIndex + 1) % playList.size();
mediaPlayer->setSource(playList[curPlayIndex]);
});
QMenu *mode = new QMenu(this);
mode->addAction(random);
mode->addAction(itemloop);
mode->addAction(loop);
mode->exec(QCursor::pos());
}*/
void Widget::onMediaStatusChanged(QMediaPlayer::MediaStatus status)
{
if (status == QMediaPlayer::EndOfMedia)
{
qreal palybackRate = mediaPlayer->playbackRate();
mediaPlayer->setPlaybackRate(palybackRate);
}
else
mediaPlayer->play();
}
void Widget::on_pushButton_clicked()
{
if(ui->LovelistWidget->isHidden())
ui->LovelistWidget->show();
else
ui->LovelistWidget->hide();
}
void Widget::on_addItem_clicked()
{
if (mediaPlayer->source().isValid())
{
QString currentMusic = mediaPlayer->source().toString();
bool found = false;
for (int i = 0; i < ui->likeMusicList->count(); i++)
{
if (ui->likeMusicList->item(i)->text() == currentMusic)
{
found = true;
break;
}
}
if (!found)
{
QListWidgetItem *item = new QListWidgetItem(currentMusic);
ui->likeMusicList->addItem(item);
}
}
}
void Widget::on_deleteItem_clicked()
{
QListWidgetItem *item = ui->likeMusicList->currentItem();
if (item)
{
delete item;
ui->likeMusicList->takeItem(ui->likeMusicList->currentRow());
}
}
上述代码无法做到在likeMusicList上添加或删除音乐,如何改进
欢迎光临 麦克雷 Mavom.cn (http://mavom.cn/)
Powered by Discuz! X3.5