Qt5音乐播放器

最近一直在看Qt5,但网上资源真是少得可怜,自己买了本书,《Qt5开发实战》,说实话没点用,就粗浅的讲了点,所以告诫大家不值得购买,《Qt5开发及实例》到是不错,自己看Qmediaplayer的文档,以及参照网上已有的音乐播放器,写了个自己的音乐播放器,基本实现了本地音乐的播放。下面是源码,可能有很多的BUG,大家可以指出,一起进步,
源码在Qt5.3,5.5都是可以运行的。
项目代码分享:http://pan.baidu.com/s/1hqPppWS
有疑问也可以密我
先发效果图:Qt5音乐播放器_第1张图片
下面是核心代码:
#include “musicwidget.h”
musicWidget::musicWidget(QWidget *parent)
:QWidget(parent)
{
playflag=true;
volumeflag=true;
this->setWindowFlags(Qt::FramelessWindowHint);
//this->setAttribute(Qt::WA_TranslucentBackground);//背景透明
this->setWindowIcon(QIcon(“:images/icon.png”));
this->setMaximumSize(300,600);
this->setMinimumSize(300,600);
QPixmap pix1(“:images/5.png”);
pix1=pix1.scaled(this->width(),this->height());
this->setAutoFillBackground(true);
QPalette palette;

palette.setBrush(QPalette::Background, QBrush(QPixmap(pix1)));
this->setPalette(palette);

namelabel=new QLabel;

slider=new QSlider(Qt::Horizontal);
slider->setValue(0);
slider->setMaximum(100);
slider->setFixedSize(300,20);

playBtn=new QPushButton;
playBtn->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
playBtn->setMaximumSize(50,30);
playBtn->setFlat(true);
playBtn->setStatusTip(tr("播放"));

findedit=new QLineEdit;
findedit->setMaximumSize(200,25);
findedit->setMinimumSize(200,25);

findBtn=new QPushButton;
findBtn->setIcon(QIcon(":/images/search.png"));
findBtn->setMaximumSize(50,30);
findBtn->setFlat(true);
QHBoxLayout* findlayout=new QHBoxLayout;
findlayout->addWidget(findedit);
findlayout->addWidget(findBtn);

tablewidget=new QTableWidget;
tablewidget->setColumnCount(3);
tablewidget->setFrameShape(QFrame::NoFrame);
tablewidget->setShowGrid(false);
QPalette pale;
pale.setBrush(QPalette::Base,QColor(255,255,255,0));
tablewidget->setPalette(pale);
tablewidget->setSelectionMode(QAbstractItemView::SingleSelection); //  设置选择的模式为单选择
tablewidget->setSelectionBehavior(QAbstractItemView::SelectRows); //设置每次选一行

QWidget* widget1=new QWidget;
QWidget* widget2=new QWidget;

tabwidget=new QTabWidget;
tabwidget->addTab(tablewidget,tr("默认列表"));

tabwidget->addTab(widget1,tr("电台"));
tabwidget->addTab(widget2,tr("收藏"));

QStringList stringlist;
stringlist<setHorizontalHeaderLabels(stringlist);
tablewidget->verticalHeader()->setVisible(false);
tablewidget->horizontalHeader()->resizeSection(0,100);
tablewidget->horizontalHeader()->setStretchLastSection(true);
tablewidget->horizontalHeader()->setStyleSheet("QHeaderView {background-color:255,255,255,0 } "
                                              "QHeaderView::section {background-color:255,255,255,0;"
                                              "color: 255,255,255,0;padding-left: 4px;border: 0px solid 255,255,255,0;}");

playstylecombox=new QComboBox;

playstylecombox->addItem(tr("循环播放"));
playstylecombox->addItem(tr("列表播放"));
playstylecombox->addItem(tr("随机播放"));
playstylecombox->addItem(tr("单曲循环"));
playstylecombox->setStyleSheet("QComboBox{border:1px solid 255,255,255,0;}"
 "QComboBox QAbstractItemView::item{height:20px;}"
 "QComboBox{background-color:255,255,255,0 }"
 "QComboBox::drop-down{border:0px;}");


playlist=new QMediaPlaylist;
closeBtn=new QPushButton;
closeBtn->setIcon(style()->standardIcon(QStyle::SP_TitleBarCloseButton));
closeBtn->setMaximumSize(50,30);
closeBtn->setFlat(true);

addmusicBtn=new QPushButton;
addmusicBtn->setIcon(style()->standardIcon(QStyle::SP_DirOpenIcon));
addmusicBtn->setMaximumSize(70,30);
addmusicBtn->setFlat(true);
stopBtn=new QPushButton;
stopBtn->setIcon(style()->standardIcon(QStyle::SP_MediaStop));
stopBtn->setMaximumSize(50,30);
stopBtn->setFlat(true);
nextBtn=new QPushButton;
nextBtn->setIcon(style()->standardIcon(QStyle::SP_MediaSkipForward));
nextBtn->setMaximumSize(50,30);
nextBtn->setFlat(true);
lastBtn=new QPushButton;
lastBtn->setIcon(style()->standardIcon(QStyle::SP_MediaSkipBackward));
lastBtn->setMaximumSize(50,30);
lastBtn->setFlat(true);


imageBtn=new QPushButton(QIcon(":images/image.png"),tr(" "));
imageBtn->setMaximumSize(50,30);
imageBtn->setFlat(true);

windowminBtn=new QPushButton;
windowminBtn->setIcon(style()->standardIcon(QStyle::SP_TitleBarMinButton));
windowminBtn->setMaximumSize(50,30);
windowminBtn->setFlat(true);

timerlabel=new QLabel;
volumeslider=new QSlider(Qt::Horizontal);
volumeslider->setValue(50);
volumeslider->setMaximum(100);
volumeslider->setFixedSize(50,10);


volumeBtn=new QPushButton;
volumeBtn->setIcon(style()->standardIcon(QStyle::SP_MediaVolume));
volumeBtn->setMaximumSize(50,30);
volumeBtn->setFlat(true);

QHBoxLayout* volumelayout=new QHBoxLayout;
volumelayout->addWidget(namelabel);
volumelayout->addWidget(volumeBtn);
volumelayout->addWidget(volumeslider);

QHBoxLayout* window=new QHBoxLayout;
window->addWidget(imageBtn);
window->addWidget(windowminBtn);
window->addWidget(closeBtn);
window->setAlignment(Qt::AlignRight);

QHBoxLayout* layout=new QHBoxLayout;
layout->addWidget(lastBtn);
layout->addWidget(playBtn);
layout->addWidget(stopBtn);
layout->addWidget(nextBtn);
layout->addWidget(addmusicBtn);

layout->addWidget(playstylecombox);

QHBoxLayout* sliderlayout=new QHBoxLayout;
sliderlayout->addWidget(slider);
sliderlayout->addWidget(timerlabel);

QVBoxLayout* v=new QVBoxLayout(this);

v->addLayout(window);
v->addLayout(volumelayout);
v->addLayout(sliderlayout);
v->addLayout(layout);
v->addLayout(findlayout);
v->addWidget(tabwidget);

playlist->setPlaybackMode(QMediaPlaylist::Random);
player = new QMediaPlayer;


player->setPlaylist(playlist);
player->setVolume(50);

connect(volumeslider,SIGNAL(sliderMoved(int)),this,SLOT(setvolumeslider(int)));
connect(volumeBtn,SIGNAL(clicked()),this,SLOT(setNovolume()));
connect(player,SIGNAL(positionChanged(qint64)),this,SLOT(changslider(qint64)));
connect(playstylecombox,SIGNAL(currentIndexChanged(int)),this,SLOT(changplaystyle(int)));
connect(windowminBtn,SIGNAL(clicked()),this,SLOT(showMinimized()));
connect(imageBtn,SIGNAL(clicked()),this,SLOT(changimage()));
connect(addmusicBtn,SIGNAL(clicked(bool)),this,SLOT(readfile(bool)));
connect(stopBtn,SIGNAL(clicked(bool)),this,SLOT(playstop()));
connect(playBtn,SIGNAL(clicked(bool)),this,SLOT(playstate()));
connect(nextBtn,SIGNAL(clicked(bool)),this,SLOT(nextplay()));
connect(lastBtn,SIGNAL(clicked(bool)),this,SLOT(lastplay()));
connect(closeBtn,SIGNAL(clicked(bool)),this,SLOT(close()));
connect(tablewidget,SIGNAL(cellDoubleClicked(int,int)),this,SLOT(changplay(int,int)));
connect(playlist,SIGNAL(currentIndexChanged(int)),this,SLOT(updatenamelabel(int)));
connect(slider,SIGNAL(sliderMoved(int)),this,SLOT(showslider(int)));
connect(findBtn,SIGNAL(clicked()),this,SLOT(findmusic()));

}

musicWidget::~musicWidget()
{

}

void musicWidget::mouseMoveEvent(QMouseEvent *event)
{
this->move(event->globalPos() - this->dpos);
}

void musicWidget::mousePressEvent(QMouseEvent *event)
{
this->windowPos= this->pos(); // 获得部件当前位置
this->mousePos = event->globalPos(); // 获得鼠标位置
this->dpos = mousePos - windowPos; // 移动后部件所在的位置
}
void musicWidget::showslider(int index)
{
slider->setValue(index);
player->positionChanged(slider->value());
}

void musicWidget::changslider(qint64 p)
{
slider->setMaximum(player->duration());
slider->setSliderPosition(p);

QTime time(0,p/60000,(p%600000)/1000,0);
timerlabel->setText(time.toString("mm:ss"));

}

void musicWidget::changplaystyle(int)
{
int v=playstylecombox->currentIndex();
switch (v) {
case 1:
playlist->setPlaybackMode(QMediaPlaylist::Loop);
break;
case 2:
playlist->setPlaybackMode(QMediaPlaylist::CurrentItemInLoop);
case 3:
playlist->setPlaybackMode(QMediaPlaylist::Random);
case 4:
playlist->setPlaybackMode(QMediaPlaylist::CurrentItemOnce);
default:
break;
}
}

void musicWidget::playstate()
{
if(playflag){

player->play();
playBtn->setIcon(style()->standardIcon(QStyle::SP_MediaPause));
}
if(!playflag){
    player->pause();
    playBtn->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));

}
playflag=!playflag;

}

void musicWidget::playstop()
{
player->stop();
}

void musicWidget::nextplay()
{
int v=playlist->currentIndex();
if(++v==playlist->mediaCount())
v=0;
playlist->setCurrentIndex(v);
player->play();

}

void musicWidget::lastplay()
{
int v=playlist->currentIndex();
if(–v<0)
v=0;
playlist->setCurrentIndex(v);
player->play();
}

QStringList musicWidget::readfile(bool)
{

musiclist=QFileDialog::getOpenFileNames(this,tr("选择文件"),tr("/"),tr("music file(*.mp3)"));

for(int i=0;iaddMedia(QUrl::fromLocalFile(path));
    QString filename=path.split("/").last();

    int rownum=tablewidget->rowCount();
    QString str=filename.section("-",1,2);
    QString str1=str.split("[").front();
    tablewidget->insertRow(rownum);
    tablewidget->setItem(rownum,0,new QTableWidgetItem(filename.split("-").front()));
    tablewidget->setItem(rownum,1,new QTableWidgetItem(str1));
    tablewidget->setItem(rownum,2,new QTableWidgetItem(filename.split(".").last()));
    tablewidget->setFocusPolicy(Qt::NoFocus);
    tablewidget->setEditTriggers(QAbstractItemView::NoEditTriggers);

}
}
return musiclist;

}

void musicWidget::changplay(int index, int )
{
playlist->setCurrentIndex(index);
player->play();
}

void musicWidget::changimage()
{
QString imagepath=QFileDialog::getOpenFileName(this,tr(“选择图片”),tr(“/”),tr(“image file(*.png)”));
QPixmap pix2(imagepath);
pix2=pix2.scaled(this->width(),this->height());
this->setAutoFillBackground(true);
QPalette palette;
palette.setBrush(QPalette::Background, QBrush(QPixmap(pix2)));
this->setPalette(palette);

}

void musicWidget::updatenamelabel(int index)
{
namelabel->setText(tablewidget->item(index,1)->text());

}

void musicWidget::setNovolume()
{
if(volumeflag){
volumeBtn->setIcon(style()->standardIcon(QStyle::SP_MediaVolumeMuted));
player->setVolume(0);
}
if(!volumeflag){
volumeBtn->setIcon(style()->standardIcon(QStyle::SP_MediaVolume));
player->setVolume(50);
}
volumeflag=!volumeflag;
}

void musicWidget::setvolumeslider(int index)
{
player->setVolume(index);
volumeslider->setValue(index);

}

void musicWidget::findmusic() const
{
QString findname=findedit->text();
QStringList musicgeshi;
QStringList musicer;
QStringList tablename;
QStringList musicname;
for(int i=0;irowCount();i++){
tablenametext();

    if(tablename.at(i).indexOf(findname)!=-1){

        musicer<item(i,0)->text();
        musicname<item(i,1)->text();
        musicgeshi<item(i,2)->text();


       }
}
tablewidget->setRowCount(tablewidget->rowCount());

// tablewidget->clearFocus();

for(int i=0;isetItem(i,0,new QTableWidgetItem(musicer.at(i)));
    tablewidget->setItem(i,1,new QTableWidgetItem(musicname.at(i)));
    tablewidget->setItem(i,2,new QTableWidgetItem(musicgeshi.at(i)));

   }

}
后期会加入在线播放功能,网易云音乐的API正在学习,不知道用QML好,还是直接写,我要好好规划一下。就这样

你可能感兴趣的:(QT,音乐,源码,qt5,播放器)