Qt--音乐播放器
文章目錄
- 一、功能介紹
- 二、代碼
- 三、運(yùn)行
一、功能介紹
能實(shí)現(xiàn)上一曲,下一曲
能實(shí)現(xiàn)列表點(diǎn)擊播放
能實(shí)現(xiàn)暫停開(kāi)始
能實(shí)現(xiàn)歌詞顯示(有問(wèn)題,先不改,后面再重寫)
原子的例程,功能沒(méi)有實(shí)現(xiàn)完(我后面再弄)
二、代碼
mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QMediaPlayer> #include <QMediaPlaylist> #include <QPushButton> #include <QSlider> #include <QVBoxLayout> #include <QHBoxLayout> #include <QListWidget> #include <QLabel> #include <QSpacerItem> #include <QDebug> #include <QList> #include <QTextEdit>/* 媒體信息結(jié)構(gòu)體 */ struct MediaObjectInfo{QString fileName; // 用于保存歌曲文件名QString filePath; // 用于保存歌曲文件路徑 };class MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow(); /* 屬性 */ private:QMediaPlayer *musicPlayer; // 媒體播放器,用于播放音樂(lè)QMediaPlaylist *mediaPlaylist; // 媒體列表QListWidget *musicListWidget; // 音樂(lè)列表QSlider *playProgressBar; // 播放進(jìn)度條QPushButton *pushButton[7]; // 音樂(lè)播放按鍵QVBoxLayout *vBoxLayout[3]; // 垂直布局QHBoxLayout *hBoxLayout[4]; // 水平布局QWidget *vWidget[3]; // 垂直容器QWidget *hWidget[4]; // 水平容器QLabel *label[4]; // 標(biāo)簽文本QWidget *listMask; // 用于遮罩QList<QString> lyricsTextList; // 歌詞文本列表QList<qint64> lyricsTimeList; // 歌詞時(shí)間列表QTextEdit *lyricsShowEdit; // 歌詞顯示文本框int lyricsShowEditScrollBarValue; // 歌詞顯示區(qū)域滾動(dòng)條的值/* 函數(shù) */ public:void initWidget(); // 初始化窗口void mediaPlayerInit(); // 媒體播放器初始化QVector<MediaObjectInfo> mediaObjectInfo; // 媒體信息存儲(chǔ)void scanSongs(); // 掃描歌曲bool readLyricFile(QString lyricPath); // 讀取歌詞文件bool analysisLyricsFile(QString line); // 解析歌詞文件void lyricsShow(); // 歌詞顯示// void resizeEvent(QResizeEvent *event); // 主窗體大小重設(shè)大小函數(shù)重寫/* 槽函數(shù) */ private slots:void SltBtnPreviousClicked(); // 上一曲按鍵點(diǎn)擊void SltBtnPlayClicked(); // 播放按鍵點(diǎn)擊void SltBtnNextClicked(); // 下一曲按鍵點(diǎn)擊void SltListWidgetClicked(QListWidgetItem*); // 列表點(diǎn)擊void SltPlayProgressBarReleased(); // 播放進(jìn)度條松開(kāi)void SltMediaPlaylistCurrentIndexChanged(int); // 媒體列表項(xiàng)改變void SltMediaPlayerStateChanged(QMediaPlayer::State); // 媒體狀態(tài)改變void SltMusicPlayerDurationChanged(qint64); // 媒體總時(shí)間改變void SltMediaPlayerPositionChanged(qint64); // 媒體播放位置改變 }; #endif // MAINWINDOW_Hmainwindow.cpp
#include "mainwindow.h" #include <QCoreApplication> #include <QFileInfoList> #include <QDir> #include <QTextCodec> #include <QScrollBar>QString musicPath = "/home/luatao/qt/05_musicplayer/myMusic";MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {/* 初始化窗口 */initWidget();/* 媒體播放器初始化 */mediaPlayerInit();/* 掃描歌曲 */scanSongs();/* 按鍵信號(hào)槽連接 */connect(pushButton[0], SIGNAL(clicked()), this, SLOT(SltBtnPreviousClicked())); // 上一曲connect(pushButton[1], SIGNAL(clicked()), this, SLOT(SltBtnPlayClicked())); // 播放connect(pushButton[2], SIGNAL(clicked()), this, SLOT(SltBtnNextClicked())); // 下一曲/* 列表信號(hào)槽連接 */connect(musicListWidget, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(SltListWidgetClicked(QListWidgetItem*)));/* 進(jìn)度條信號(hào)槽連接 */connect(playProgressBar,SIGNAL(sliderReleased()), this, SLOT(SltPlayProgressBarReleased()));/* 媒體信號(hào)槽連接 */connect(mediaPlaylist,SIGNAL(currentIndexChanged(int)), this, SLOT(SltMediaPlaylistCurrentIndexChanged(int)));connect(musicPlayer,SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(SltMediaPlayerStateChanged(QMediaPlayer::State)));connect(musicPlayer,SIGNAL(durationChanged(qint64)), this, SLOT(SltMusicPlayerDurationChanged(qint64)));connect(musicPlayer,SIGNAL(positionChanged(qint64)), this, SLOT(SltMediaPlayerPositionChanged(qint64)));/* 失去焦點(diǎn) */this->setFocus();}MainWindow::~MainWindow() { }/*** @brief MainWindow::initWidget* 初始化窗口*/ void MainWindow::initWidget() {this->setGeometry(0,0,800,480);QPalette pal; /* QPalette 對(duì)話框或控件的調(diào)色板 *//* 按鍵 初始化 */for(int i = 0; i< 7;i++)pushButton[i] = new QPushButton();/* 設(shè)置對(duì)象名稱 */pushButton[0]->setObjectName("btn_previous"); // 上一曲pushButton[1]->setObjectName("btn_play"); // 播放pushButton[2]->setObjectName("btn_next"); // 下一曲pushButton[3]->setObjectName("btn_favorite"); // 喜歡pushButton[4]->setObjectName("btn_mode"); // 模式pushButton[5]->setObjectName("btn_menu"); // 菜單pushButton[6]->setObjectName("btn_volume"); // 音量/* 設(shè)置按鍵屬性 該btn有可選擇的屬性 點(diǎn)擊一下置為選擇狀態(tài) */pushButton[1]->setCheckable(true);pushButton[3]->setCheckable(true);/* 標(biāo)簽初始化 */for(int i = 0; i< 4; i++)label[i] = new QLabel();/* 容器初始化 */for(int i = 0; i< 3; i++){/* 垂直容器 */vWidget[i] = new QWidget();vWidget[i]->setAutoFillBackground(true); // 設(shè)置自動(dòng)填充背景/* 垂直布局 */vBoxLayout[i] = new QVBoxLayout();}for(int i = 0; i< 4; i++){/* 水平容器 */hWidget[i] = new QWidget();hWidget[i]->setAutoFillBackground(true);/* 水平布局 */hBoxLayout[i] = new QHBoxLayout();}/* 播放進(jìn)度條 */playProgressBar = new QSlider(Qt::Horizontal); // 水平方向進(jìn)度條playProgressBar->setMinimumSize(300,15); // 最小窗口值 也就是尺寸大小 寬300 高15playProgressBar->setMaximumHeight(15);playProgressBar->setObjectName("playProgressBar");/* 音樂(lè)列表 */musicListWidget = new QListWidget();musicListWidget->setObjectName("musicListWidget");musicListWidget->resize(310,265); /* 設(shè)置大小 */musicListWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 一直屏蔽垂直滾動(dòng)條musicListWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 屏蔽水平滾動(dòng)條/* 列表遮罩 */listMask = new QWidget(musicListWidget); // 在窗口界面添加音樂(lè)列表listMask->setMinimumSize(310,50);listMask->setMinimumHeight(50);listMask->setObjectName("listMask");listMask->setGeometry(0,musicListWidget->height() - 50, 310, 50); // 設(shè)置串口的位置和大小/* 總體布局 分成左右兩個(gè)垂直布局 */vWidget[0]->setMinimumSize(310, 480); // 窗口vWidget[0]->setMaximumWidth(310);vWidget[1]->setMinimumSize(320, 480);/* 創(chuàng)建空白區(qū)域 大小為70,480 空白區(qū)不能小于Minimum 不能大于Maximum*/QSpacerItem *hSpacer0 = new QSpacerItem(70, 480, QSizePolicy::Minimum, QSizePolicy::Maximum);QSpacerItem *hSpacer1 = new QSpacerItem(65, 480, QSizePolicy::Minimum, QSizePolicy::Maximum);QSpacerItem *hSpacer2 = new QSpacerItem(60, 480, QSizePolicy::Minimum, QSizePolicy::Maximum);// vWidget[0]->setStyleSheet("background-color:black;"); // 設(shè)置窗口的背景 調(diào)試使用 // vWidget[1]->setStyleSheet("background-color:red;");hBoxLayout[0]->addSpacerItem(hSpacer0);hBoxLayout[0]->addWidget(vWidget[0]);hBoxLayout[0]->addSpacerItem(hSpacer1);hBoxLayout[0]->addWidget(vWidget[1]);hBoxLayout[0]->addSpacerItem(hSpacer2);/* setContentsMargins 設(shè)置左側(cè)、頂部、右側(cè)、底部邊距*/hBoxLayout[0]->setContentsMargins(0,0,0,0);hWidget[0]->setLayout(hBoxLayout[0]); // hWidget[0]是主窗口setCentralWidget(hWidget[0]); // 設(shè)置中間顯示/*左邊的布局 添加了音樂(lè)列表 和一個(gè)水平布局 */musicListWidget->setMinimumSize(310, 265);hWidget[1]->setMinimumSize(310, 80);hWidget[1]->setMaximumHeight(80);label[0]->setMinimumSize(310, 95);label[0]->setMaximumHeight(95);QSpacerItem *vSpacer0 = new QSpacerItem(310, 10, QSizePolicy::Minimum, QSizePolicy::Maximum);QSpacerItem *vSpacer1 = new QSpacerItem(310, 30, QSizePolicy::Minimum, QSizePolicy::Maximum);//label[0]->setText("你好");vBoxLayout[0]->addWidget(label[0]);vBoxLayout[0]->addWidget(musicListWidget);vBoxLayout[0]->addSpacerItem(vSpacer0);vBoxLayout[0]->addWidget(hWidget[1]);vBoxLayout[0]->addSpacerItem(vSpacer1);vBoxLayout[0]->setContentsMargins(0,0,0,0);vWidget[0]->setLayout(vBoxLayout[0]);/* 左邊的水平布局 添加了3個(gè)按鍵 */for(int i = 0; i< 3; i++)pushButton[i]->setMinimumSize(80,80);/* Expanding 可自由伸縮 */QSpacerItem *hSpacer3 = new QSpacerItem(40, 80, QSizePolicy::Expanding, QSizePolicy::Expanding);QSpacerItem *hSpacer4 = new QSpacerItem(40, 80, QSizePolicy::Expanding, QSizePolicy::Expanding);hBoxLayout[1]->addWidget(pushButton[0]);hBoxLayout[1]->addSpacerItem(hSpacer3);hBoxLayout[1]->addWidget(pushButton[1]);hBoxLayout[1]->addSpacerItem(hSpacer4);hBoxLayout[1]->addWidget(pushButton[2]);hBoxLayout[1]->setContentsMargins(0,0,0,0);hWidget[1]->setLayout(hBoxLayout[1]);/* 右邊的垂直布局 添加了label 滾動(dòng)條 和一個(gè)垂直布局 */QSpacerItem *vSpacer2 = new QSpacerItem(320, 40, QSizePolicy::Minimum, QSizePolicy::Maximum);QSpacerItem *vSpacer3 = new QSpacerItem(320, 20, QSizePolicy::Minimum, QSizePolicy::Maximum);QSpacerItem *vSpacer4 = new QSpacerItem(320, 30, QSizePolicy::Minimum, QSizePolicy::Maximum);// label[1]->setMinimumSize(320, 320); // QImage Image; // Image.load(":/images/cd.png"); // QPixmap pixmap = QPixmap::fromImage(Image);// int width = 320, height = 320; // QPixmap fitpixmap = pixmap.scaled(width,height,Qt::IgnoreAspectRatio,Qt::SmoothTransformation); // label[1]->setPixmap(fitpixmap); // label[1]->setAlignment(Qt::AlignCenter); // 居中對(duì)齊lyricsShowEdit = new QTextEdit(this); // 文本區(qū)域lyricsShowEdit->setMinimumSize(320,320);lyricsShowEdit->setStyleSheet("background-color:transparent;color:red"); // 設(shè)置背景為黑色lyricsShowEdit->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);// 隱藏垂直滾動(dòng)條lyricsShowEdit->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);// 隱藏水平滾動(dòng)條lyricsShowEdit->setFontPointSize(16); // 設(shè)置字體大小vWidget[2]->setMinimumSize(300, 80);vWidget[2]->setMaximumHeight(80);vBoxLayout[1]->addSpacerItem(vSpacer2);// vBoxLayout[1]->addWidget(label[1]);vBoxLayout[1]->addWidget(lyricsShowEdit);vBoxLayout[1]->addSpacerItem(vSpacer3);vBoxLayout[1]->addWidget(playProgressBar);vBoxLayout[1]->addWidget(vWidget[2]);vBoxLayout[1]->addSpacerItem(vSpacer4);vBoxLayout[1]->setContentsMargins(0,0,0,0);vWidget[1]->setLayout(vBoxLayout[1]);/* 右邊的垂直布局 添加了兩個(gè)水平布局 */QSpacerItem *vSpacer5 = new QSpacerItem(310, 10, QSizePolicy::Minimum, QSizePolicy::Maximum);hWidget[2]->setMinimumSize(320, 20);hWidget[3]->setMinimumSize(320, 60);vBoxLayout[2]->addWidget(hWidget[2]);vBoxLayout[2]->addSpacerItem(vSpacer5);vBoxLayout[2]->addWidget(hWidget[3]);vBoxLayout[2]->setContentsMargins(0,0,0,0);vWidget[2]->setLayout(vBoxLayout[2]);/* 右邊的一個(gè)水平布局 添加了兩個(gè)label 表示歌曲播放的時(shí)間 */QFont font;font.setPixelSize(10);/* 設(shè)置文本標(biāo)簽 */label[0]->setText("luatao Music!");label[2]->setText("00:00");label[3]->setText("00:00");label[2]->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);label[3]->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);label[2]->setAlignment(Qt::AlignRight); // 右對(duì)齊label[3]->setAlignment(Qt::AlignLeft); //label[2]->setFont(font);label[3]->setFont(font);pal.setColor(QPalette::WindowText, Qt::white); // 設(shè)置文字的顏色白色label[0]->setPalette(pal);label[2]->setPalette(pal);label[3]->setPalette(pal);hBoxLayout[2]->addWidget(label[2]);hBoxLayout[2]->addWidget(label[3]);hBoxLayout[2]->setContentsMargins(0,0,0,0);hWidget[2]->setLayout(hBoxLayout[2]);/* 右邊的一個(gè)水平布局 添加4個(gè)按鍵 */QSpacerItem *hSpacer5 = new QSpacerItem(0, 60, QSizePolicy::Minimum, QSizePolicy::Maximum);QSpacerItem *hSpacer6 = new QSpacerItem(80, 60, QSizePolicy::Minimum, QSizePolicy::Maximum);QSpacerItem *hSpacer7 = new QSpacerItem(80, 60, QSizePolicy::Minimum, QSizePolicy::Maximum);QSpacerItem *hSpacer8 = new QSpacerItem(80, 60, QSizePolicy::Minimum, QSizePolicy::Maximum);for(int i = 3; i < 7; i++){pushButton[i]->setMinimumSize(25, 25);pushButton[i]->setMaximumSize(25, 25);}hBoxLayout[3]->addSpacerItem(hSpacer5);hBoxLayout[3]->addWidget(pushButton[3]);hBoxLayout[3]->addSpacerItem(hSpacer6);hBoxLayout[3]->addWidget(pushButton[4]);hBoxLayout[3]->addSpacerItem(hSpacer7);hBoxLayout[3]->addWidget(pushButton[5]);hBoxLayout[3]->addSpacerItem(hSpacer8);hBoxLayout[3]->addWidget(pushButton[6]);hBoxLayout[3]->setContentsMargins(0,0,0,0);hBoxLayout[3]->setAlignment(Qt::AlignCenter);hWidget[3]->setLayout(hBoxLayout[3]); }/*** @brief MainWindow::mediaPlayerInit* 媒體播放器初始化*/ void MainWindow::mediaPlayerInit() {musicPlayer = new QMediaPlayer(this); // 媒體播放器mediaPlaylist = new QMediaPlaylist(this); // 媒體列表/* 清空播放器列表 */mediaPlaylist->clear();/* 設(shè)置音樂(lè)播放器的列表為mediaplaylist */musicPlayer->setPlaylist(mediaPlaylist);/* 設(shè)置播放模式,loop是列循環(huán) */mediaPlaylist->setPlaybackMode(QMediaPlaylist::Loop); }/*** @brief MainWindow::scanSongs* 掃描歌曲*/ void MainWindow::scanSongs() {// QDir dir(QCoreApplication::applicationDirPath() + "/myMusic"); // 文件目錄QDir dir(musicPath); // 文件目錄//qDebug() << QCoreApplication::applicationDirPath() + "/myMusic" << endl;QDir dirbsolutePath(dir.absolutePath()); // 絕對(duì)路徑/* 如果目錄存在 */if(dirbsolutePath.exists()){/* 定義過(guò)濾器 */QStringList filter;/* 篩選所有包含.mp3后綴的文件 */filter << "*.mp3";/* 獲取該目錄下所有的文件 */QFileInfoList files = dirbsolutePath.entryInfoList(filter, QDir::Files);//qDebug()<<files.count()<<endl;/* 遍歷 */for(int i = 0; i< files.count(); i++){MediaObjectInfo info;/* 使用utf-8編碼 */QString fileName = QString::fromUtf8(files.at(i).fileName().replace(".mp3","").toUtf8().data()); // 獲取文件名 并且去掉后綴// info.fileName = fileName + "\n" + fileName.split("-").at(1); // 這里格式化顯示的歌曲名+ 作者info.fileName = fileName; // 這里格式化顯示的歌曲名info.filePath = QString::fromUtf8(files.at(i).filePath().toUtf8().data()); // 獲取文件名//qDebug() << fileName << endl;/* 媒體列表添加歌曲 */if(mediaPlaylist->addMedia(QUrl::fromLocalFile(info.filePath))){/* 添加到容器數(shù)組里儲(chǔ)存 */mediaObjectInfo.append(info);/* 添加歌曲名至列表 */musicListWidget->addItem(info.fileName);// qDebug() << info.fileName << endl;}else{qDebug() << "Error number:" << mediaPlaylist->error() << endl;}}}elseqDebug() << "path not exist!" << endl; // 路徑不存在 }/*** @brief MainWindow::btn_previous_clicked* 上一曲點(diǎn)擊槽函數(shù)*/ void MainWindow::SltBtnPreviousClicked() {musicPlayer->stop(); // 停止當(dāng)前音樂(lè)int count = mediaPlaylist->mediaCount(); // 判斷音樂(lè)的個(gè)數(shù)if(count == 0)return ;/* 跳轉(zhuǎn)到列表的上一個(gè) */mediaPlaylist->previous();musicPlayer->play(); // 播放音樂(lè) }/* 播放音樂(lè)點(diǎn)擊槽函數(shù) */ void MainWindow::SltBtnPlayClicked() {int state = musicPlayer->state(); // 獲取播放器的狀態(tài)switch(state){case QMediaPlayer::StoppedState:/* 播放 */musicPlayer->play();// qDebug() << "StoppedState" << endl;break;case QMediaPlayer::PlayingState:/* 暫停 */musicPlayer->pause();// qDebug() << "PlayingState" << endl;break;case QMediaPlayer::PausedState:/* 播放 */musicPlayer->play();// qDebug() << "PausedState" << endl;break;} }/* 下一曲點(diǎn)擊槽函數(shù) */ void MainWindow::SltBtnNextClicked() {musicPlayer->stop(); // 停止播放int count = mediaPlaylist->mediaCount(); // 判斷音樂(lè)的個(gè)數(shù)if(count == 0)return ;/* 跳轉(zhuǎn)到列表的下一個(gè) */mediaPlaylist->next();musicPlayer->play(); }/*** @brief MainWindow::SltListWidgetClicked* 歌曲列表點(diǎn)擊 播放此項(xiàng)* @param item*/ void MainWindow::SltListWidgetClicked(QListWidgetItem *item) {musicPlayer->stop();mediaPlaylist->setCurrentIndex(musicListWidget->row(item)); // 播放點(diǎn)擊的音樂(lè)musicPlayer->play(); }/*** @brief MainWindow::durationSliderReleased* 根據(jù)滑條設(shè)置媒體播放的位置 ,也就是通過(guò)進(jìn)度條控制播放的位置*/ void MainWindow::SltPlayProgressBarReleased() {/* 設(shè)置媒體播放的位置 */musicPlayer->setPosition(playProgressBar->value() * 1000); // ms為單位 }/*** @brief MainWindow::SltMediaPlaylistCurrentIndexChanged* 媒體列表當(dāng)前下標(biāo)改變* @param index*/ void MainWindow::SltMediaPlaylistCurrentIndexChanged(int index) {if(index == -1)return ;/* 設(shè)置列表正在播放的項(xiàng) */musicListWidget->setCurrentRow(index); // 當(dāng)上一曲或者下一曲的時(shí)候歌曲列表顯示出來(lái) }/*** @brief MainWindow::SltMediaPlayerStateChanged* 媒體播放的狀態(tài)改變* @param state*/ void MainWindow::SltMediaPlayerStateChanged(QMediaPlayer::State state) {switch (state) {case QMediaPlayer::StoppedState:pushButton[1]->setChecked(false); // 播放按鍵的狀態(tài)為不可選// qDebug() << "StoppedState1" << endl;break;case QMediaPlayer::PlayingState: // 正在播放pushButton[1]->setChecked(true);// qDebug() << "PlayingState1" << endl;break;case QMediaPlayer::PausedState:pushButton[1]->setChecked(false);// qDebug() << "PausedState1" << endl;break;} }/*** @brief MainWindow::SltMusicPlayerDurationChanged* 媒體播放長(zhǎng)度發(fā)生變化 顯示時(shí)間標(biāo)簽改變* @param duration*/ void MainWindow::SltMusicPlayerDurationChanged(qint64 duration) {playProgressBar->setRange(0, duration / 1000); // duration為ms 進(jìn)度條設(shè)置顯示int second = duration / 1000; // 秒int minute = second / 60; // 分second %= 60; // 剩下的秒QString mediaDuration; // 媒體的時(shí)間mediaDuration.clear();if(minute >= 10)mediaDuration = QString::number(minute, 10);elsemediaDuration = "0" + QString::number(minute, 10);if(second >= 10)mediaDuration = mediaDuration + ":" + QString::number(second, 10);elsemediaDuration = mediaDuration + "0" + QString::number(second, 10);/* 顯示媒體總長(zhǎng)度時(shí)間 */label[3]->setText(mediaDuration);/* 加載歌詞 *//* 獲取此歌曲的歌詞文件 */int index = mediaPlaylist->currentIndex(); // 獲取當(dāng)前媒體列表的位置QListWidgetItem *item = musicListWidget->item(index); // 從歌曲列表中找到此歌曲項(xiàng)QString musicName = item->text().left(item->text().lastIndexOf(".")); // 獲取.左邊的數(shù)據(jù)if(!readLyricFile(musicPath + "/" + musicName + ".lrc")){ // 打開(kāi)這個(gè)歌詞文件qDebug() << "未檢測(cè)到歌詞文件" <<endl;}lyricsShow(); // 顯示歌詞 }/*** @brief MainWindow::SltMediaPlayerPositionChanged* 媒體播放位置顯示 一直更新 顯示當(dāng)前播放位置* @param position*/ void MainWindow::SltMediaPlayerPositionChanged(qint64 position) {if(!playProgressBar->isSliderDown()) // 如果滑塊沒(méi)有按下playProgressBar->setValue(position / 1000); // 設(shè)置滑塊的位置int second = position / 1000; // 秒int minute = second / 60;second %= 60;QString mediaPosition;mediaPosition.clear();if(minute >= 10)mediaPosition = QString::number(minute, 10);elsemediaPosition = "0" + QString::number(minute, 10);if(second >= 10)mediaPosition = mediaPosition + ":" + QString::number(second, 10);elsemediaPosition = mediaPosition + ":0" + QString::number(second, 10);/* 顯示當(dāng)前播放的時(shí)間 */label[2]->setText(mediaPosition);/* 下面不對(duì) ,應(yīng)該按時(shí)間來(lái)計(jì)算 如果改變滾動(dòng)條的值, 下面將不再有意義 *//* 顯示歌詞 *//* position:是當(dāng)前播放的時(shí)間 單位為ms 判斷這個(gè)時(shí)間和lyricsTimeList的時(shí)間的大小如果position == lyricsTimeList 那么就顯示這一句歌詞 */int index = 0;for(qint64 mstime:lyricsTimeList){/*"[00:00.00]聽(tīng)雪戀歌 - CH2""[00:13.30]詞:呂泓瑾""[00:26.61]曲:呂泓瑾"*/index ++; // 記錄當(dāng)前項(xiàng)的下標(biāo)// qDebug() << "mstime" << mstime << endl; // 輸出時(shí)間// qDebug() << "position / 10 * 10" << position / 1000 * 1000 << endl; // 輸出時(shí)間if(mstime / 1000 * 1000 == (position / 1000 * 1000)){// qDebug() << "pipei"<< endl; // 輸出時(shí)間/* 播放當(dāng)前歌詞 歌詞往上移動(dòng)一行 */int value = lyricsShowEdit->verticalScrollBar()->value(); // 獲取滾動(dòng)條的值int count = lyricsTextList.count(); // 獲取歌詞總共的行數(shù)int accumulationValue = lyricsShowEditScrollBarValue / count + 1; // 每一行歌曲占的滾動(dòng)條的值// qDebug() << "lyricsShowEditScrollBarValue" << lyricsShowEditScrollBarValue <<endl;// qDebug() << "count" << count <<endl;// qDebug() << "accumulationValue" << accumulationValue <<endl;lyricsShowEdit->verticalScrollBar()->setValue(value + accumulationValue * index); // 移動(dòng)break;}} }/*** @brief MainWindow::readLyricFile* 讀取歌詞文件* @param lyricPath 歌詞文件路徑*/ bool MainWindow::readLyricFile(QString lyricPath) {lyricsTextList.clear();lyricsTimeList.clear(); // 清空列表QFile file(lyricPath);if(!file.exists()){ // 文件路徑不存在lyricsTextList.push_back("未檢測(cè)到歌詞文件"); // 添加到歌詞文本列表return false;}file.open(QIODevice::ReadOnly | QIODevice::Text); // 只讀方式打開(kāi)文件// QTextCodec *utf8 = QTextCodec::codecForName("UTF-8"); // QTextCodec::setCodecForLocale(utf8); // QTextCodec* gbk = QTextCodec::codecForName("gbk");QTextStream in(&file);in.setCodec(QTextCodec::codecForName("GBK"));//讓文件以UTF-8的方式譯碼。QString line = "";while((line = in.readLine()) > 0){ // 讀取一行數(shù)據(jù)/* gbk轉(zhuǎn)utf-8 */ // //1. gbk to unicode // QString strUnicode = gbk->toUnicode(line.toLocal8Bit().data()); // //2. unicode -> utf-8 // QByteArray utf8_bytes = utf8->fromUnicode(strUnicode);qDebug() << line << endl;analysisLyricsFile(line);//解析歌詞文件}file.close(); // 關(guān)閉文件return true; }/*** @brief analysisLyricsFile* 解析歌詞文件 如果時(shí)間精確到s的話會(huì)有重復(fù) 這里精確到s后面1位* @param line* @return*/ bool MainWindow::analysisLyricsFile(QString line) {if(line == NULL || line.isEmpty()){ // 一行數(shù)據(jù)為空qDebug() << "this line is empty!";return false;}/* \[(\d+)?:(\d+)?\.(\d+)?\](.*)?* [(數(shù)字)?:(數(shù)字)?.(數(shù)字)](.*)?*/QRegularExpression regularExpression("\\[(\\d+)?:(\\d+)?\\.(\\d+)?\\](.*)?"); // \[(\d+)?:(\d+)?(\.\d+)?\](.*)?QRegularExpressionMatch match;match = regularExpression.match(line, 0); // 從第0個(gè)字符開(kāi)始匹配if(match.hasMatch()) { // 數(shù)據(jù)匹配成功 // qDebug() << match.captured(3).toInt() * 10 << ' ';qint64 totalTime = match.captured(1).toInt() * 60000 + match.captured(2).toInt() * 1000 + match.captured(3).toInt() * 10; // 轉(zhuǎn)化為ms /* 計(jì)算該時(shí)間點(diǎn)毫秒數(shù) */QString currentText =QString::fromStdString(match.captured(4).toStdString()); // 獲取歌詞文本lyricsTextList.push_back(currentText); // 將當(dāng)前文本添加到文本列表lyricsTimeList.push_back(totalTime); // 將當(dāng)前時(shí)間添加到時(shí)間列表return true;}return false; }/*** @brief MainWindow::lyricsShow* 歌詞顯示*/ void MainWindow::lyricsShow() {lyricsShowEdit->clear(); // 加載之前需要先清除文本區(qū)域的內(nèi)容for(QString str:lyricsTextList){ // 遍歷lyricsShowEdit->append(str); // 顯示//qDebug() << str << endl;}/* 獲取滾動(dòng)條的最大值 */lyricsShowEditScrollBarValue = lyricsShowEdit->verticalScrollBar()->value();qDebug() << "lyricsShowEditScrollBarValue" << lyricsShowEditScrollBarValue << endl;/* 返回到最上面 */lyricsShowEdit->verticalScrollBar()->setValue(0); // 移動(dòng) }///* 重新繪制窗口大小 */ //void MainWindow::resizeEvent(QResizeEvent *event) //{ // Q_UNUSED(event); // listMask->setGeometry(0,listWidget->height() - 50, 310, 50); //}main.cpp
#include "mainwindow.h"#include <QApplication> #include <QFile>int main(int argc, char *argv[]) {QApplication a(argc, argv);/* 指定文件 */QFile file(":/style.qss");/* 判斷文件是否存在 */if(file.exists()){/* 以只讀的方式打開(kāi)文件 */file.open(QFile::ReadOnly);/* 以字符串的方式保存讀出的結(jié)果 */QString styleSheet = QLatin1String(file.readAll());/* 設(shè)置全局樣式 */qApp->setStyleSheet(styleSheet);/* 關(guān)閉文件 */file.close();}MainWindow w;w.show();return a.exec(); }style.qss
QWidget{background: "#25242a" /* 設(shè)置窗體背景顏色 */ }QWidget#listMask {border-image: url(:/images/mask.png);background-color: transparent; }QListWidget#musicListWidget {color:white;font-size: 15px;border:none; }QListWidget#musicListWidget:item:active {background: transparent; }QListWidget#musicListWidget:item {background: transparent;height:60; }QListWidget#musicListWidget:item:selected {color:#5edcf3;background: transparent; }QListWidget#musicListWidget:item:hover {background: transparent;color:#5edcf3;border:none; }/* 設(shè)置按鍵的圖片 */QPushButton#btn_play {border-image:url(:/images/btn_play1.png); }QPushButton#btn_play:hover {border-image:url(:/images/btn_play2.png); }QPushButton#btn_play:checked {border-image:url(:/images/btn_pause1.png); }QPushButton#btn_play:checked:hover {border-image:url(:/images/btn_pause2.png); }QPushButton#btn_previous {border-image:url(:/images/btn_previous1.png); }QPushButton#btn_previous:hover {border-image:url(:/images/btn_previous2.png); }QPushButton#btn_next {border-image:url(:/images/btn_next1.png); }QPushButton#btn_next:hover {border-image:url(:/images/btn_next2.png); }QPushButton#btn_favorite {border-image:url(:/images/btn_favorite_no.png); }QPushButton#btn_favorite:checked {border-image:url(:/images/btn_favorite_yes.png); }QPushButton#btn_menu {border-image:url(:/images/btn_menu1.png); }QPushButton#btn_menu:hover {border-image:url(:/images/btn_menu2.png); }QPushButton#btn_mode { border-image:url(:/images/btn_listcircle1.png); }QPushButton#btn_mode:hover {border-image:url(:/images/btn_listcircle2.png); }QPushButton#btn_mode {border-image:url(:/images/btn_listcircle1.png); }QPushButton#btn_mode:hover { border-image:url(:/images/btn_listcircle2.png); }QPushButton#btn_volume {border-image:url(:/images/btn_volume1.png); }QPushButton#btn_volume:hover {border-image:url(:/images/btn_volume2.png); }QSlider#playProgressBar:handle:horizontal {border-image:url(:/images/handle.png); }QSlider#playProgressBar:sub-page:horizontal {border-image:url(:/images/sub-page.png); }三、運(yùn)行
總結(jié)
- 上一篇: “睡服”面试官系列第七篇之map数据结构
- 下一篇: SourceInsight查看java源