本身寫的音樂播放器,還存在不少bug,只是做爲一種嘗試而已。交流學習羣:271251545編程
播放器實現的功能:添加歌曲、上一首、暫停、下一首、切換歌曲、托盤、任務欄對歌曲進行操做less
界面偷懶,直接使用的設計師界面,歌曲列表使用的是qtablewidget作的ide
player頭文件代碼:函數
#ifndef PLAYER_H #define PLAYER_H #include <QWidget> #include <QMouseEvent> #include <QPoint> #include <QMediaPlayer> #include <QFileDialog> #include <QSystemTrayIcon> #include <QEvent> #include <QMenu> #include <QAction> #include "about.h" #include <QWinThumbnailToolButton> #include <QWinThumbnailToolBar> #include <QStandardItemModel> #include <QTableView> #include <QDirModel> #include <QDir> #include <QStringListIterator> #include <QMediaPlaylist> #include <QTimer> namespace Ui { class player; } class player : public QWidget { Q_OBJECT public: explicit player(QWidget *parent = 0); ~player(); QPoint drag;//定義一個釋放點 void mousePressEvent(QMouseEvent *);//窗口移動事件 void mouseMoveEvent(QMouseEvent *);//窗口移動事件 QMediaPlayer *myPlayer; QSystemTrayIcon *trayIcon; protected: QAction *quitAction; QAction *aboutAction; QAction *nextAction; QAction *pauseAction; QAction *backAction; QWinThumbnailToolButton *backToolBtn; QWinThumbnailToolButton *pauseToolBtn; QWinThumbnailToolButton *nextToolBtn; QWinThumbnailToolBar *taskBar; QStandardItemModel *songListModel; QStringList path; QMediaPlaylist *playList; QTimer *timer; qint64 pausePosition; int currentIndex; private slots: void on_closeBtn_clicked(); void on_miniBtn_clicked(); void on_pushButton_2_clicked(); void on_pauseBtn_clicked(); void on_volum_valueChanged(int value); void tuopan(QSystemTrayIcon::ActivationReason reason); void showAbout(); void myPlayerSlot(QModelIndex index); void on_importBtn_clicked(); void setPosition(); void on_horizontalSlider_valueChanged(int value); void on_nextBtn_clicked(); void on_backBtn_clicked(); void mediaChange(int); private: Ui::player *ui; }; #endif // PLAYER_H
player.cpp文件代碼:
#include "player.h" #include "ui_player.h" #include <QDebug> #include <QtWinExtras> #include <QList> player::player(QWidget *parent) : QWidget(parent), ui(new Ui::player) { ui->setupUi(this); this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinimizeButtonHint);//隱藏標題欄 setWindowIcon(QIcon(":/new/prefix1/image/tray.jpg")); myPlayer=new QMediaPlayer(); ui->volum->setValue(50); myPlayer->setVolume(ui->volum->value()); playList=new QMediaPlaylist; trayIcon=new QSystemTrayIcon; connect(trayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this, SLOT(tuopan(QSystemTrayIcon::ActivationReason)));//將托盤圖標和雙擊事件關聯 QPixmap pixmap(":/new/prefix1/image/background.jpg");//當前文件夾下面的圖片 QPalette palette = this->palette(); palette.setBrush(backgroundRole(), QBrush(pixmap)); connect(playList,SIGNAL(currentIndexChanged(int)),this,SLOT(mediaChange(int))); setPalette(palette); //任務欄按鈕 QMenu * menu=new QMenu(this); if (QtWin::isCompositionEnabled()) { QtWin::enableBlurBehindWindow(menu); } else{ QtWin::disableBlurBehindWindow(menu); menu->hide(); } taskBar=new QWinThumbnailToolBar(); taskBar->setWindow(windowHandle()); backToolBtn=new QWinThumbnailToolButton(taskBar); backToolBtn->setToolTip("上一首"); backToolBtn->setIcon(QIcon(":/new/prefix1/image/back.png")); connect(backToolBtn,SIGNAL(clicked()),this,SLOT(on_backBtn_clicked())); pauseToolBtn=new QWinThumbnailToolButton(taskBar); connect(pauseToolBtn,SIGNAL(clicked()),this,SLOT(on_pauseBtn_clicked())); pauseToolBtn->setToolTip("暫停"); pauseToolBtn->setIcon(QIcon(":/new/prefix1/image/pause.png")); nextToolBtn=new QWinThumbnailToolButton(taskBar); nextToolBtn->setToolTip("下一首"); nextToolBtn->setIcon(QIcon(":/new/prefix1/image/next.png")); connect(nextToolBtn,SIGNAL(clicked()),this,SLOT(on_nextBtn_clicked())); taskBar->addButton(backToolBtn); taskBar->addButton(pauseToolBtn); taskBar->addButton(nextToolBtn); //歌曲列表 songListModel=new QStandardItemModel; songListModel->setHorizontalHeaderItem(0,new QStandardItem(QObject::tr("歌曲列表"))); ui->songList->setModel(songListModel); ui->songList->setColumnWidth(0,390); ui->songList->verticalHeader()->hide(); ui->songList->setEditTriggers(QAbstractItemView::NoEditTriggers); ui->songList->setSelectionBehavior(QAbstractItemView::SelectRows); connect(ui->songList,SIGNAL(doubleClicked(QModelIndex)),this,SLOT(myPlayerSlot(QModelIndex))); //定時器 timer=new QTimer; connect(timer,SIGNAL(timeout()),this,SLOT(setPosition())); } player::~player() { delete ui; } void player::on_closeBtn_clicked()//單擊關閉按鈕,產生托盤和托盤菜單 { this->hide(); ui->nameLabel->styleSheet(); trayIcon->setIcon(QIcon(":/new/prefix1/image/tray.jpg")); QMenu *trayMenu=new QMenu(); aboutAction=new QAction(tr("關於"),this); quitAction=new QAction(tr("退出"),this); trayMenu->addAction(aboutAction); connect(aboutAction,SIGNAL(triggered(bool)),this,SLOT(showAbout())); trayMenu->addAction(quitAction); connect(quitAction,SIGNAL(triggered(bool)),this,SLOT(close())); trayIcon->setContextMenu(trayMenu); trayIcon->setToolTip("托盤圖標"); trayIcon->show(); trayIcon->showMessage("主人","我在這裏哦",QSystemTrayIcon::Information,5000);//必定要放在這裏,不然提示信息會不顯示 } void player::on_miniBtn_clicked() { this->showMinimized(); } void player::mousePressEvent(QMouseEvent *e) { if(e->button()==Qt::LeftButton)//button()是按鈕 { drag=e->globalPos()-this->geometry().topLeft();//鼠標位置減去左上角的左邊 e->accept(); } } void player::mouseMoveEvent(QMouseEvent *e) { if(e->buttons()&Qt::LeftButton)//buttons()返回的是按鈕狀態 { move(e->globalPos()-drag); e->accept(); } } //選擇歌曲 void player::on_pushButton_2_clicked() { QString path=QFileDialog::getOpenFileName(this,tr("選擇一首歌曲"),"/","*.mp3"); QFileInfo fileInfo; fileInfo=QFileInfo(path); QString fileName=fileInfo.baseName(); ui->nameLabel->setText(fileName); myPlayer->setMedia(QUrl::fromLocalFile(path)); myPlayer->play(); } //暫停按鈕 void player::on_pauseBtn_clicked() { switch (myPlayer->state()) { case QMediaPlayer::PlayingState: timer->stop(); currentIndex=playList->currentIndex(); pausePosition=myPlayer->position(); myPlayer->pause(); break; case QMediaPlayer::PausedState: myPlayer->setMedia(playList->media(currentIndex)); myPlayer->setPosition(pausePosition); timer->start(1000); myPlayer->play(); break; default: break; } } //音量調節 void player::on_volum_valueChanged(int value) { myPlayer->setVolume(value); } void player::tuopan(QSystemTrayIcon::ActivationReason reason)//雙擊托盤圖標,恢復程序正常界面 { switch (reason) { case QSystemTrayIcon::DoubleClick: this->showNormal(); break; default: break; } } //顯示關於本程序對話框 void player::showAbout() { about showabout; showabout.setModal(false); showabout.setWindowTitle("關於本程序"); showabout.exec(); } //導入多首歌曲 void player::on_importBtn_clicked() { path=QFileDialog::getOpenFileNames(this,"選擇歌曲","/","(*.mp3)"); int i=0; QString addSongs; QListIterator<QString> mylist(path); while(mylist.hasNext()) { addSongs=mylist.next(); QFileInfo fileInfo; fileInfo=QFileInfo(addSongs); QString fileName=fileInfo.fileName(); songListModel->setItem(i,0,new QStandardItem(fileName)); playList->addMedia(QUrl::fromLocalFile(addSongs)); i++; } playList->setPlaybackMode(QMediaPlaylist::Loop); myPlayer->setPlaylist(playList); } //雙擊播放 void player::myPlayerSlot(QModelIndex index) { timer->start(1000); int n=index.row(); playList->setCurrentIndex(n); // myPlayer->setMedia(playList->currentMedia());這句話不能加,加了反而錯誤 myPlayer->play(); } //設置播放進度條 void player::setPosition() { qint64 position=myPlayer->position(); ui->horizontalSlider->setMaximum(myPlayer->duration()); ui->horizontalSlider->setSliderPosition(position); } void player::on_horizontalSlider_valueChanged(int value)//快進和快退功能 { qint64 currentPosition=myPlayer->position(); if(qAbs(value-currentPosition)>2000&&(ui->horizontalSlider->value()!=0)) { myPlayer->stop(); timer->stop(); myPlayer->setPosition(value); timer->start(); myPlayer->play(); } } void player::on_nextBtn_clicked()//播放下一首 { if(playList->mediaCount()-playList->currentIndex()!=1)//這裏注意的是,和咱們正常數數同樣,mediaCount是從1開始計數的 { //myPlayer->setMedia(playList->media(playList->nextIndex())); playList->setCurrentIndex(playList->nextIndex()); myPlayer->play(); } else { playList->setCurrentIndex(0); // myPlayer->setMedia(playList->media(0)); myPlayer->play(); } } void player::on_backBtn_clicked()//播放上一首 { if(playList->currentIndex()!=0)//這裏注意的是,和咱們正常數數同樣,mediaCount是從1開始計數的 { //myPlayer->setMedia(playList->media(playList->previousIndex())); playList->setCurrentIndex(playList->previousIndex()); myPlayer->play(); } else { playList->setCurrentIndex(playList->mediaCount()-1); //myPlayer->setMedia(playList->media(playList->mediaCount()-1)); myPlayer->play(); } } void player::mediaChange(int i) { ui->nameLabel->setText(path.at(i)); }
關於對話框頭文件:
#ifndef ABOUT_H #define ABOUT_H #include <QWidget> #include <QDialog> class about : public QDialog { Q_OBJECT public: explicit about(QWidget *parent = 0); signals: public slots: }; #endif // ABOUT_H
關於對話框源碼:
#include "about.h" #include <QLabel> #include <QGridLayout> about::about(QWidget *parent) : QDialog(parent) { QLabel *aboutLabel=new QLabel; aboutLabel->setText("小黑版本QT音樂播放器"); QHBoxLayout *mainLayout=new QHBoxLayout(this); mainLayout->addWidget(aboutLabel,Qt::AlignCenter); }主函數:
#include "player.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); player w; w.show(); return a.exec(); }由於分享而快樂!QT&C++編程愛好者:271251545