简单的音乐播放器

在看qt自带的例子的时候,看到了一个音乐播放器的示例,文档中说这个示例示范了怎么去使用QtWinExtras模块提供的各种特色,然后我就把示例的代码复制出来去掉了那些QtWinExtras重写了更简单点的音乐播放器。
要在pro文件中添加QT += multimedia

musicplayer.h

#ifndef MUSICPLAYER_H
#define MUSICPLAYER_H

#include <QMainWindow>
#include <QMediaPlayer>
#include <QSlider>
#include <QLabel>
#include <QToolBar>
#include <QAbstractButton>
#include <QToolButton>
#include <QEvent>
#include <QMouseEvent>
#include <QPoint>


class MusicPlayer : public QWidget
{
    Q_OBJECT

public:
    MusicPlayer(QWidget *parent = 0);
    ~MusicPlayer();

public slots:
    //打开文件
    void openFile();
    //播放文件
    void playFile(const QString& filePath);
    //切换播放还是暂停
    void togglePlayback();
    //前进
    void seekForward();
    //后退
    void seekBackward();
    void increaseVolume();
    void decreaseVolume();

private slots:
    void updateState(QMediaPlayer::State state);
    void updatePosition(qint64 position);
    void updateDuration(qint64 duration);
    void setPosition(int position);

private:
    void createWidgets();
    void createShortcuts();

    QMediaPlayer mediaPlayer;
    QAbstractButton *playButton;
    QAbstractButton *openButton;
    QSlider *volumeAdjust;
    QSlider *positionSlider;
    QLabel *positionLabel;
    QLabel *infoLabel;
};

#endif // MUSICPLAYER_H

musicplayer.cpp

#include "musicplayer.h"
#include <QStyle>
#include <QStandardPaths>
#include <QFileDialog>
#include <QTime>
#include <QToolButton>
#include <QShortcut>
#include <QCoreApplication>
#include <QVBoxLayout>
#include <QSpacerItem>
#include <QHBoxLayout>

MusicPlayer::MusicPlayer(QWidget *parent)
    : QWidget(parent),playButton(0),
      volumeAdjust(0),positionSlider(0),positionLabel(0)
{
    createWidgets();
    createShortcuts();

    connect(&mediaPlayer, &QMediaPlayer::positionChanged, this, &MusicPlayer::updatePosition);
    connect(&mediaPlayer, &QMediaPlayer::durationChanged, this, &MusicPlayer::updateDuration);

    connect(&mediaPlayer, &QMediaPlayer::stateChanged, this, &MusicPlayer::updateState);
}

MusicPlayer::~MusicPlayer()
{
}

//开始构建主窗体的样式啦
void MusicPlayer::createWidgets()
{
    playButton = new QToolButton(this);
    playButton->setEnabled(false);
    playButton->setToolTip(tr("Play"));
    playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
    //连接播放音乐的槽函数
    connect(playButton, &QAbstractButton::clicked, this, &MusicPlayer::togglePlayback);

    openButton = new QToolButton(this);
    openButton->setText(tr("..."));
    openButton->setToolTip(tr("Open A File"));
    openButton->setFixedSize(playButton->sizeHint());
    //要打开文件了
    connect(openButton, &QAbstractButton::clicked, this, &MusicPlayer::openFile);

    volumeAdjust = new QSlider(Qt::Horizontal, this);
    volumeAdjust->setToolTip("Adjust The Volume");
    volumeAdjust->setValue(mediaPlayer.volume());
    //是时候调节声音了
    connect(volumeAdjust, &QSlider::valueChanged, &mediaPlayer, &QMediaPlayer::setVolume);

    //接下来这个是进度条了
    positionSlider = new QSlider(Qt::Horizontal, this);
    positionSlider->setEnabled(false);
    positionSlider->setToolTip(tr("Seek"));
    connect(positionSlider, &QAbstractSlider::valueChanged, this, &MusicPlayer::setPosition);


    //显示音乐信息
    infoLabel = new QLabel(this);
    //通过时间显示音乐进度
    positionLabel = new QLabel(tr("00:00"), this);
    positionLabel->setMinimumWidth(positionLabel->sizeHint().width());


    //界面的布局了
    QHBoxLayout *hlayout1 = new QHBoxLayout;
    hlayout1->setMargin(0);
    hlayout1->addWidget(openButton);
    hlayout1->addWidget(positionSlider);
    hlayout1->addWidget(playButton);

    QHBoxLayout *hlayout2 = new QHBoxLayout;
    hlayout2->setMargin(0);
    hlayout2->addItem(new QSpacerItem(volumeAdjust->height(),volumeAdjust->width()/10));
    hlayout2->addWidget(volumeAdjust);
    hlayout2->addWidget(positionLabel);

    QVBoxLayout *vlayout = new QVBoxLayout(this);
    vlayout->setMargin(0);
    vlayout->addWidget(infoLabel);
    vlayout->addLayout(hlayout1);
    vlayout->addLayout(hlayout2);

}

//设置快捷键
void MusicPlayer::createShortcuts()
{
    QShortcut *quitShortcut = new QShortcut(QKeySequence::Quit, this);
    //关闭程序
    connect(quitShortcut, &QShortcut::activated, QCoreApplication::quit);

    //打开文件
    QShortcut *openShortcut = new QShortcut(QKeySequence::Open, this);
    connect(openShortcut, &QShortcut::activated, this, &MusicPlayer::openFile);

    //开始暂停
    QShortcut *toggleShortcut = new QShortcut(Qt::Key_Space, this);
    connect(toggleShortcut, &QShortcut::activated, this, &MusicPlayer::togglePlayback);

    QShortcut *forwardShortcut = new QShortcut(Qt::Key_Right, this);
    connect(forwardShortcut, &QShortcut::activated, this, &MusicPlayer::seekForward);

    QShortcut *backwardShortcut = new QShortcut(Qt::Key_Left, this);
    connect(backwardShortcut, &QShortcut::activated, this, &MusicPlayer::seekBackward);

    QShortcut *increaseShortcut = new QShortcut(Qt::Key_Up, this);
    connect(increaseShortcut, &QShortcut::activated, this, &MusicPlayer::increaseVolume);

    QShortcut *decreaseShortcut = new QShortcut(Qt::Key_Down, this);
    connect(decreaseShortcut, &QShortcut::activated, this, &MusicPlayer::decreaseVolume);

}

//打开文件
void MusicPlayer::openFile()
{
    const QStringList musicPaths = QStandardPaths::standardLocations(QStandardPaths::MusicLocation);

    const QString filePath =
            QFileDialog::getOpenFileName(this, tr("Open File"),
                                         musicPaths.isEmpty() ? QDir::homePath() : musicPaths.first(),
                                         tr("MP3 files (*.mp3);;All files*.*"));
    if(!filePath.isEmpty())
        playFile(filePath);
}

//播放音乐
void MusicPlayer::playFile(const QString &filePath)
{
    //激活播放按钮
    playButton->setEnabled(true);
    //显示歌名
    infoLabel->setText(QFileInfo(filePath).fileName());
    //设置媒体
    mediaPlayer.setMedia(QUrl::fromLocalFile(filePath));
    //播放
    mediaPlayer.play();
}

//根据媒体状态确定播放还是暂停还是打开文件
void MusicPlayer::togglePlayback()
{
    if(mediaPlayer.mediaStatus() == QMediaPlayer::NoMedia)
        openFile();
    else if(mediaPlayer.state() == QMediaPlayer::PlayingState)
        mediaPlayer.pause();
    else
        mediaPlayer.play();
}

//快进
void MusicPlayer::seekForward()
{
    positionSlider->triggerAction(QSlider::SliderPageStepAdd);
}

//快退
void MusicPlayer::seekBackward()
{
    positionSlider->triggerAction(QSlider::SliderPageStepSub);
}
//增加音量
void MusicPlayer::increaseVolume()
{
    volumeAdjust->triggerAction(QSlider::SliderPageStepAdd);
}
//减小音量
void MusicPlayer::decreaseVolume()
{
    volumeAdjust->triggerAction(QSlider::SliderPageStepSub);
}

//负责更新按钮的图标的样式
void MusicPlayer::updateState(QMediaPlayer::State state)
{
    if(state == QMediaPlayer::PlayingState)
    {
        playButton->setToolTip(tr("Pause"));
        playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPause));
    }
    else
    {
        playButton->setToolTip(tr("Play"));
        playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
    }
}

//更新进度条的位置和标签显示的时间
void MusicPlayer::updatePosition(qint64 position)
{
    positionSlider->setValue(position);
    QTime duration(0, position/60000, qRound((position%60000)/1000.0));
    positionLabel->setText(duration.toString(tr("mm:ss")));
}

void MusicPlayer::updateDuration(qint64 duration)
{
    positionSlider->setRange(0,duration);
    positionSlider->setEnabled(duration>0);
    positionSlider->setPageStep(duration/10);
}


void MusicPlayer::setPosition(int position)
{
    if(qAbs(mediaPlayer.position() - position) > 99)
        mediaPlayer.setPosition(position);
}

main.cpp

#include "musicplayer.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MusicPlayer w;
    w.show();

    return a.exec();
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值