Qt5+VS 2013 Mediaplayer 音乐播放器 代码

这篇博客介绍了如何使用Qt5和VS2013开发一个音乐播放器,主要涉及代码包括:myLyric、myPlayList、myLyric和mySettings四个部分。myLyric类用于显示歌词并实现滚动效果,myPlayList类则包含了音乐播放列表的管理。博客还展示了具体的C++代码实现,包括添加、删除歌曲、排序等功能。
摘要由CSDN通过智能技术生成

代码主要包含5块:main、musicplayer、myPlayList、myLyric、mySettings

可能可读性不高,实在不想弄了。 不过稍微看下,还是能看懂的。嘿嘿大笑

1、myLyric.h

#ifndef MYLYRIC_H
#define MYLYRIC_H


#include <QtWidgets/QLabel>
class QTimer;


class MyLyric : public QLabel
{
Q_OBJECT
public:
explicit MyLyric(QWidget * parent = 0);
void startLrcMask(qint64 intervalTime);
void stopLrcMask();
protected:
void paintEvent(QPaintEvent *);
void mousePressEvent(QMouseEvent *ev);
void mouseMoveEvent(QMouseEvent *ev);
void contextMenuEvent(QContextMenuEvent * event);


private slots:
void timeout();
private:
QLinearGradient linearGradient;
QLinearGradient maskLinearGradient;
QFont font;
QTimer * timer;
qreal lrcMaskWidth;
qreal lrcMaskWidthInterval;
QPoint offset;
};

#endif // !MYLYRIC_H

2、myLyric.cpp

#include "myLyric.h"
#include <QtGui/QPainter>
#include <QtCore/QTimer>
#include <QtGui/QMouseEvent>
#include <QtGui/QContextMenuEvent>
#include <QtWidgets/QMenu>
#include <QtWidgets/QDesktopWidget>
#include <QtWidgets/QApplication>


MyLyric::MyLyric(QWidget *parent) :
QLabel(parent)
{
setWindowFlags(Qt::Window | Qt::FramelessWindowHint);
// 设置背景透明
setAttribute(Qt::WA_TranslucentBackground);
setText(QStringLiteral("听 ---  Jin Xin 作品"));
setAlignment(Qt::AlignCenter);
// 固定部件大小
setMaximumSize(1000, 60);
setMinimumSize(1000, 60);
resize(1000, 60);
QDesktopWidget* desktop = QApplication::desktop();
move((desktop->width() - this->width()) / 2, desktop->height() * 3 / 4);

// 歌词的线性渐变填充
linearGradient.setStart(0, 10);
linearGradient.setFinalStop(0, 40);
linearGradient.setColorAt(0.1, QColor(14, 179, 255));
linearGradient.setColorAt(0.5, QColor(114, 232, 255));
linearGradient.setColorAt(0.9, QColor(14, 179, 255));
// 遮罩的线性渐变填充
maskLinearGradient.setStart(0, 10);
maskLinearGradient.setFinalStop(0, 40);
maskLinearGradient.setColorAt(0.1, QColor(222, 54, 4));
maskLinearGradient.setColorAt(0.5, QColor(255, 72, 16));
maskLinearGradient.setColorAt(0.9, QColor(222, 54, 4));
// 设置字体
font.setFamily("Times New Roman");
font.setBold(true);
font.setPointSize(30);
// 设置定时器
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(timeout()));
lrcMaskWidth = 0;
lrcMaskWidthInterval = 0;
}


void MyLyric::paintEvent(QPaintEvent *)
{
QPainter painter(this);


painter.setFont(font);
// 先绘制底层文字,作为阴影,这样会使显示效果更加清晰,且更有质感
painter.setPen(QColor(0, 0, 0, 200));
painter.drawText(1, 1, 800, 60, Qt::AlignLeft, text());
// 再在上面绘制渐变文字
painter.setPen(QPen(linearGradient, 0));
painter.drawText(0, 0, 800, 60, Qt::AlignLeft, text());


// 设置歌词遮罩
painter.setPen(QPen(maskLinearGradient, 0));
painter.drawText(0, 0, lrcMaskWidth, 60, Qt::AlignLeft, text());
}


// 开启遮罩,需要指定当前歌词开始与结束之间的时间间隔
void MyLyric::startLrcMask(qint64 intervalTime)
{
// 这里设置每隔30毫秒更新一次遮罩的宽度,因为如果更新太频繁
// 会增加CPU占用率,而如果时间间隔太大,则动画效果就不流畅了
qreal count = intervalTime / 30;
// 获取遮罩每次需要增加的宽度,这里的800是部件的固定宽度
lrcMaskWidthInterval = 800 / count;
lrcMaskWidth = 0;
timer->start(30);
}


// 停止遮罩
void MyLyric::stopLrcMask()
{
timer->stop();
lrcMaskWidth = 0;
update();
}


// 两个鼠标事件处理函数实现了部件的拖动
void MyLyric::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
offset = event->globalPos() - frameGeometry().topLeft();
}
void MyLyric::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() & Qt::LeftButton) {
setCursor(Qt::PointingHandCursor);
move(event->globalPos() - offset);
}
}


// 实现右键菜单来隐藏部件
void MyLyric::contextMenuEvent(QContextMenuEvent *event)
{
QMenu menu;
menu.addAction(QStringLiteral("隐藏"), this, SLOT(hide()));
menu.exec(event->globalPos());
}


// 定时器溢出时增加遮罩的宽度,并更新显示
void MyLyric::timeout()
{
lrcMaskWidth += lrcMaskWidthInterval;
update();
}

3、myPlayList.h

#ifndef MUSICPLAYLIST_H
#define MUSICPLAYLIST_H


#include <QtWidgets/QTableWidget>
#include <QtWidgets/QPushButton>
#include<QtMultimedia/QMediaPlayer>
#include<QtMultimedia/QMediaPlaylist>


class MyPlaylist : public QWidget
{
Q_OBJECT
public:
explicit MyPlaylist(QWidget *parent = 0);
~MyPlaylist();
QMediaPlaylist *musicPlayList;
QTableWidget * songTableWidget;
private:
QPoint offset;
QString initialName;
QPushButton * openMusicFileButton;
QPushButton * sortMusicFileButton;
QPushButton * closeMusicListWindowButton;
QPushButton * deleteSelectedMusicButton;
QPushButton * openPlayListButton;
QPushButton * saveAsPlayListButton;
QPushButton * ascendingOrderButton;
QPushButton * descendingOrderButton;
QString curFile;                        // 保存当前文件路径
void setCurrentFile(const QString &fileName);
protected:
void contextMenuEvent(QContextMenuEvent *event);
void closeEvent(QCloseEvent *event);
void mousePressEvent(QMouseEvent *ev);
void mouseMoveEvent(QMouseEvent *ev);


signals:
void playlistReduced();
void playlistAdded();
void musicFilesChanged();
void playlistReady(int );
void isModified();
private slots:
void clearPlaylist();
void deleteSelectedMusic();
void savePlayList();
void importSongs();
void importPlayList();
void playListWindowHideOrShow();
void changeMusicPlayList(int);
void sortButtonHideOrShow();
void ascendingSortMusicFiles();
void descendingSortMusicFiles();
void setMusicPlaylist();
void setSaveButtonEnabledOrNot();


};


#endif // MYPLAYLIST_H

4、myPlayList.cpp

#include "myPlayList.h"
#include <QtGui\QContextMenuEvent>
#include <QtWidgets/QMenu>
#include <QtCore/QDir>
#include <QtWidgets/QFileDialog>
#include <QtMultimedia/QMediaMetaData>
#include <QtCore/QTime>
#include<QtCore\QFile>
#include<QtCore\QTextStream>
#include<QtWidgets\QMessageBox>
#include<QtCore\QFileInfo>
#include<QtWidgets\QApplication>


MyPlaylist::MyPlaylist(QWidget *parent) :
QWidget(parent)
{
setWindowTitle(QStringLiteral("播放列表"));
setWindowFlags(Qt::Window | Qt::FramelessWindowHint);
setMaximumSize(300, 500);
setMinimumSize(300, 300);
resize(300, 300);
setWindowIcon(QIcon(":/images/myPlayer.png"));
setAutoFillBackground(true);
setPalette(QPalette(QColor(120, 214, 255, 255)));
// 打开文件
openMusicFileButton = new QPushButton(this);
openMusicFileButton->setFixedSize(100, 20);
openMusicFileButton->move(2, 2);
openMusicFileButton->setFlat(true);
openMusicFileButton->setText(QStringLiteral("+添加本地歌曲"));
initialName = QDir::homePath();
// 播放列表窗口(添加音乐列表排序按钮)
sortMusicFileButton = new QPushButton(this);
sortMusicFileButton->setFixedSize(40, 20);
sortMusicFileButton->move(104, 2);
sortMusicFileButton->setFlat(true);
sortMusicFileButton->setText(QStringLiteral("排序"));
排序窗口 (Ascending)
ascendingOrderButton = new QPushButton(this);
ascendingOrderButton->setFixedSize(20, 20);
ascendingOrderButton->move(150, 2);
ascendingOrderButton->hide();
QPixmap im = QPixmap(":/images/Ascending.png");
ascendingOrderButton->setIconSize(QSize(20, 20));
ascendingOrderButton->setIcon(im.scaled(20, 20));
// 排序窗口 (Descending)
descendingOrderButton = new QPushButton(this);
descendingOrderButton->setFixedSize(20, 20);
descendingOrderButton->move(176, 2);
im = QPixmap(":/images/Descending.png");
descendingOrderButton->setIconSize(QSize(20, 20));
descendingOrderButton->setIcon(im.scaled(20, 20));
descendingOrderButton->hide();


// 播放列表窗口(关闭播放列表窗口)
closeMusicListWindowButton = new QPushButton(this);
closeMusicListWindowButton->setFixedSize(20, 20);
closeMusicListWindowButton->move(271, 2);
closeMusicListWindowButton->setFlat(true);
closeMusicListWindowButton->setToolTip(QStringLiteral("关闭窗口"));
im = QPixmap(":/images/quit.png");
closeMusicListWindowButton->setIconSize(QSize(20, 20));
closeMusicListWindowButton->setIcon(im.scaled(20, 20));
// 删除选中音乐
deleteSelectedMusicButton = new QPushButton(this);
deleteSelectedMusicButton->setFixedSize(20, 20);
deleteSelectedMusicButton->move(246, 2);
deleteSelectedMusicButton->setFlat(true);
deleteSelectedMusicButton->setToolTip((QStringLiteral("删除")));
im = QPixmap(":/images/Delete.png");
deleteSelectedMusicButton->setIconSize(QSize(20, 20));
deleteSelectedMusicButton->setIcon(im.scaled(20, 20));
// 保存播放列表
openPlayListButton = new QPushButton(this);
openPlayListButton->setFixedSize(20, 20);
openPlayListButton->move(196, 2);
openPlayListButton->setFlat(true);
openPlayListButton->setToolTip((QStringLiteral("打开播放列表")));
im = QPixmap(":/images/OpenPlayList.png");
openPlayListButton->setIconSize(QSize(20, 20));
openPlayListButton->setIcon(im.scaled(20, 20));
// 另存为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值