QT實(shí)現(xiàn)簡(jiǎn)單音樂(lè)播放器
基于QT實(shí)現(xiàn)一個(gè)多功能媒體播放器,它能播放音頻(如mp3),視頻
媒體播放器界面,有進(jìn)度條,可展示總播放時(shí)間、當(dāng)前播放時(shí)間,進(jìn)度條可拖動(dòng),有播放、暫停鍵,有快進(jìn)、快退鍵,上一曲下一曲,靜音,調(diào)節(jié)音量,雙擊播放歌曲,以及簡(jiǎn)單的歌詞同步。
主界面如下:

創(chuàng)建三個(gè)本地文件夾分別存放MV,歌詞和音樂(lè)文件




工程結(jié)構(gòu)目錄如下(整個(gè)結(jié)構(gòu)沒(méi)有設(shè)計(jì)好,所以每個(gè)視頻都要單獨(dú)創(chuàng)建文件):

mainwindow.h代碼如下:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <QMediaPlayer>
#include <QStringList>
#include <QDir>
#include <QTime>
#include <QTimer>
#include<videoplayer.h>
#include<videoplayer_qr.h>
#include<videoplayer_cq.h>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
VideoPlayer *v1;
videoplayer_qr *v_qr;
videoplayer_cq *v_cq;
bool isPlay=false;
bool ismute=false;
QString MusicPath="C:\\Users\\44637\\Music\\QTMusic";
QString LrcPath="C:\\Users\\44637\\Music\\QTLrc";
QStringList fileList; //文件名稱
QStringList lrcList;
QMediaPlaylist *PlayerList;
QMediaPlayer *Player;
int moved;
int iCount=0;
QTimer *timer2;
QMap<int, QString> map;
QMap<QString, QString> *map2;
void getHeader(const char *str, QString &des);
void getTime(QString line);//改動(dòng)二
private slots:
void init();//初始化
void addItem(QString name); //把歌名添加到musicname上
QStringList getFileNames(const QString &path); //獲取路徑下所有文件名
QStringList getLrcNames(const QString &path); //獲取路徑下所有文件名
void slotButtonStart();//播放
void slotButtonLast();//上一首
void slotButtonNext();//下一首
void slotShowCurrentMusic();//顯示當(dāng)前播放的歌曲
void volumChange(int);//控制音量
void positionChange(qint64 position);//進(jìn)度條隨著音樂(lè)播放變化
void seekChange(int position); //滑動(dòng)滑動(dòng)條快進(jìn)、倒退音樂(lè),且音樂(lè)已播放時(shí)長(zhǎng)也跟著變化
void musicTime();//歌曲總時(shí)間
void slotShowCurrentLrc();
void showWord(int time);//顯示歌詞
void initlrc(const QString& fileName);//初始化歌詞
void button_style();//按鈕樣式
void changestartbutton();
void cleanmap();
void playto(int i,int );//雙擊播放
void video_click_wm();//播放相應(yīng)視頻
void video_click_qr();
void video_click_cq();
void mute();//靜音
void fastForward();//快進(jìn)
void fastBack();//快退
};
#endif // MAINWINDOW_H
mainwindow.cpp代碼如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QFile>
#include <QTextStream>
#include <QTextCodec>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->Buttonstart,&QPushButton::clicked,this,&MainWindow::slotButtonStart);
connect(ui->Buttonlast,&QPushButton::clicked,this,&MainWindow::slotButtonLast);
connect(ui->Buttonnext,&QPushButton::clicked,this,&MainWindow::slotButtonNext);
connect(ui->Buttonstart,&QPushButton::clicked,this,&MainWindow::changestartbutton);
connect(ui->Buttonvideo_wm,&QPushButton::clicked,this,&MainWindow::video_click_wm);
connect(ui->Buttonvideo_qr,&QPushButton::clicked,this,&MainWindow::video_click_qr);
connect(ui->Buttonvideo_cq,&QPushButton::clicked,this,&MainWindow::video_click_cq);
connect(ui->Buttonmute,&QPushButton::clicked,this,&MainWindow::mute);
connect(ui->fastButton,&QPushButton::clicked,this,&MainWindow::fastForward);
connect(ui->fastbackButton,&QPushButton::clicked,this,&MainWindow::fastBack);
init();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::init(){
button_style();
PlayerList = new QMediaPlaylist; //實(shí)例化播放器和播放列表
Player = new QMediaPlayer;
fileList = getFileNames(this->MusicPath); //獲取文件夾下所有音樂(lè)文件
lrcList = getLrcNames(this->LrcPath);
moved = 0;
qDebug()<<"ALL Music File \n"<<fileList;
qDebug()<<"ALL Lrc File \n"<<lrcList;
for(int i=0;i<fileList.size();i++){
QString fileName=fileList.at(i);
addItem(fileName);
PlayerList->addMedia(QUrl::fromLocalFile(MusicPath+"\\"+fileName));
}
PlayerList->setCurrentIndex(0);
Player->setPlaylist(PlayerList); //將播放列表加載到播放器
connect(Player,&QMediaPlayer::currentMediaChanged,this,&MainWindow::slotShowCurrentMusic);
connect(Player,&QMediaPlayer::currentMediaChanged,this,&MainWindow::slotShowCurrentLrc);
connect(Player,&QMediaPlayer::currentMediaChanged,this,&MainWindow::cleanmap);
connect(ui->Buttonstart,&QPushButton::clicked,this,&MainWindow::slotShowCurrentLrc);
connect(ui->Buttonnext,&QPushButton::clicked,this,&MainWindow::slotShowCurrentLrc);
connect(ui->Buttonlast,&QPushButton::clicked,this,&MainWindow::slotShowCurrentLrc);
connect(ui->Buttonstart,&QPushButton::clicked,this,&MainWindow::slotShowCurrentMusic);
connect(ui->Volumebar, SIGNAL(sliderMoved(int)), this, SLOT(volumChange(int)));
connect(Player,SIGNAL(positionChanged(qint64)),this,SLOT(positionChange(qint64)));
connect(Player,SIGNAL(durationChanged(qint64)),this,SLOT(musicTime()));
connect(ui->Progressbar,SIGNAL(sliderMoved(int)),this,SLOT(seekChange(int)));
connect(ui->musicname,SIGNAL(cellDoubleClicked(int,int)),this,SLOT(playto(int,int)));
}
QStringList MainWindow::getFileNames(const QString &path)
{
QDir dir(path);
QStringList nameFilters;
nameFilters << "*.mp3";
QStringList files = dir.entryList(nameFilters, QDir::Files|QDir::Readable, QDir::Name);
return files;
}
QStringList MainWindow::getLrcNames(const QString &path)
{
QDir dir(path);
QStringList nameFilters;
nameFilters <<"*.txt";
QStringList files = dir.entryList(nameFilters, QDir::Files|QDir::Readable, QDir::Name);
return files;
}
void MainWindow::addItem(QString name){
int count = ui ->musicname->rowCount();
ui->musicname->setRowCount(count+1);
QTableWidgetItem *itemName = new QTableWidgetItem(name);
itemName->setFlags(itemName->flags() & ~Qt::ItemIsEditable);
ui->musicname->setItem(count,0,itemName);
}
void MainWindow::slotShowCurrentMusic(){
int index=PlayerList->currentIndex();
QString songName=fileList.at(index);
ui->CurrentMusic->setText(songName);
}
void MainWindow::slotShowCurrentLrc(){
int index=PlayerList->currentIndex();
qDebug()<<index;
QString musicLrc=lrcList.at(index);
qDebug()<<musicLrc;
initlrc(musicLrc);
}
void MainWindow::slotButtonStart(){
if(!isPlay){
isPlay=true;
Player->setVolume(100);
Player->play();
musicTime();
}
else{
isPlay=false;
Player->pause();
musicTime();
}
}
void MainWindow::slotButtonLast(){
int currentIndex = PlayerList->currentIndex();
if(currentIndex == 0){
currentIndex=PlayerList->mediaCount();
}
else{
PlayerList->previous();
PlayerList->previousIndex();
musicTime();
}
}
void MainWindow::slotButtonNext(){
int currentIndex = PlayerList->currentIndex();
if(++currentIndex == PlayerList->mediaCount()){
currentIndex=0;}
PlayerList->setCurrentIndex(currentIndex);
musicTime();
}
void MainWindow::volumChange(int vol)
{
Player -> setVolume(vol);
}
void MainWindow::positionChange(qint64 position)
{
ui->Progressbar->setMaximum(Player->duration() / 1000);//設(shè)置滑塊的長(zhǎng)度范圍為音樂(lè)長(zhǎng).00度
ui->Progressbar->setValue(position / 1000);//如果音樂(lè)進(jìn)度改變,則改變滑塊顯示位置
moved = position;//讓播放時(shí)間等于音樂(lè)進(jìn)度(毫秒)
QTime moveTime(0,(moved/60000) % 60,(moved / 1000) % 60);//設(shè)置時(shí)間
ui->showPro ->setText(moveTime.toString("mm:ss"));//顯示時(shí)間
QString t=moveTime.toString("mm:ss");
QString mm = t.mid(0,2);
QString ss = t.mid(3, 2);
int m = mm.toInt();
int s = ss.toInt();
int time = m*60*1000 + s*1000;
showWord(time);
}
void MainWindow::seekChange(int position)
{
Player -> setPosition(position * 1000);//如果滑塊改變位置,則改變音樂(lè)進(jìn)度
moved = position * 1000;//讓播放時(shí)間等于音樂(lè)進(jìn)度(毫秒)
QTime moveTime(0,(moved/60000) % 60,(moved / 1000) % 60);//設(shè)置時(shí)間
ui->showPro ->setText(moveTime.toString("mm:ss"));//顯示時(shí)間
}
void MainWindow::musicTime(){
qint64 time = Player->duration();
QTime Time(0,(time % (1000 * 60 * 60)) / (1000 * 60),(time % (1000 * 60)) / 1000);
ui->MusicTime->setText(Time.toString("mm:ss"));
qDebug()<<"time:"<<Time;
}
void MainWindow::showWord(int time)
{
if(map.contains(time))
{
ui->label1->setText(map.value(time));
}
else{
qDebug()<<"繼續(xù)上一句歌詞";
}
}
void MainWindow::getHeader(const char *str, QString &des)
{
des = des.remove(str);
des = des.remove("]");
}
void MainWindow::getTime(QString line)//獲取lrc文件的每句的時(shí)間
{
if(line.startsWith("["))
{
int index = line.indexOf("]");
QString t = line.mid(1, index - 1);
QString mm = t.mid(0,2);
QString ss = t.mid(3, 2);
int m = mm.toInt();
int s = ss.toInt();
int time = m*60*1000 + s*1000;
t = line.mid(index + 1);
index = t.lastIndexOf("]");
if(index < 0)
{
map.insert(time, t);
}
else
{
t = t.mid(index + 1);
map.insert(time, t);
getTime(t);
qDebug()<<"time123:"<<time;
}
}
}
void MainWindow::initlrc(const QString& fileName)
{
QMap<int, QString> map;
QString l;
QFile file("C:\\Users\\44637\\Music\\QTLrc\\"+fileName);
if(file.exists()){
qDebug()<<"文件存在";
}
else{
qDebug()<<"文件不存在";
}
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){
return;
}
QTextCodec *codec = QTextCodec::codecForName("GBK");
while(!file.atEnd())
{
QString line = codec->toUnicode(file.readLine());
QString s(line);
if(s.length()<4)
continue;
if(s.startsWith("[ti:"))
{
getHeader("[ti:", s);
map.insert(0, s);
ui->topmusicname->setText(s);
continue;
}
else if(s.startsWith("[ar:"))
{
getHeader("[ar:", s);
map.insert(1000, s);
ui->singer->setText("歌手:"+s);
continue;
}
else if(s.startsWith("[al:"))
{
getHeader("[al:", s);
map.insert(2000, s);
ui->album->setText("專輯:"+s);
continue;
}
else if(s.startsWith("[by:"))
{
getHeader("[by:", s);
map.insert(3000, s);
continue;
}
else
{
getTime(s);
}
}
file.close();
}
void MainWindow::button_style(){
ui->Buttonstart->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\start.jpg"));
ui->Buttonlast->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\last.jpg"));
ui->Buttonnext->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\next.png"));
ui->Buttonmute->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\volume.jpg"));
ui->Buttonvideo_qr->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\MV.png"));
ui->Buttonvideo_wm->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\MV.png"));
ui->Buttonvideo_cq->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\MV.png"));
}
void MainWindow::changestartbutton(){
if(isPlay)
ui->Buttonstart->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\pause.jpg"));
else
ui->Buttonstart->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\start.jpg"));
}
void MainWindow::cleanmap(){
map.clear();
}
void MainWindow::playto(int i,int )
{
PlayerList->setCurrentIndex(i);
isPlay=true;
changestartbutton();
QString musicLrc=lrcList.at(i);
initlrc(musicLrc);
Player->play();
}
void MainWindow::video_click_wm(){
v1= new VideoPlayer(this);
v1->setModal(false);
v1->show();
}
void MainWindow::video_click_qr(){
v_qr= new videoplayer_qr(this);
v_qr->setModal(false);
v_qr->show();
}
void MainWindow::video_click_cq(){
v_cq= new videoplayer_cq(this);
v_cq->setModal(false);
v_cq->show();
}
void MainWindow::mute(){
if(!ismute){
Player -> setVolume(0);
//ui->voiceslider->value();
ui->Buttonmute->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\mute.png"));
ismute=true;
}
else{
Player -> setVolume(100);
ui->Buttonmute->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\volume.jpg"));
ismute=false;
}
}
void MainWindow::fastForward(){
qint64 position=Player->position();
qDebug()<<"position"<<position;
position=position+5000;
ui->Progressbar->setValue(position/1000);
Player -> setPosition(position);//如果滑塊改變位置,則改變音樂(lè)進(jìn)度
}
void MainWindow::fastBack(){
qint64 position=Player->position();
qDebug()<<"position"<<position;
position=position-5000;
ui->Progressbar->setValue(position/1000);
Player -> setPosition(position);//如果滑塊改變位置,則改變音樂(lè)進(jìn)度
}
videoplayer.h代碼如下(視頻播放和音樂(lè)播放差不多):
#ifndef VIDEOPLAYER_H
#define VIDEOPLAYER_H
#include <QDialog>
#include <QMediaPlayer>
#include <QVideoWidget>
#include <QMediaPlaylist>
#include <QTime>
#include <QTimer>
namespace Ui {
class VideoPlayer;
}
class VideoPlayer : public QDialog
{
Q_OBJECT
public:
explicit VideoPlayer(QWidget *parent = nullptr);
~VideoPlayer();
public slots:
void init();
void slotButtonStart();
void slotstop();
void closeEvent(QCloseEvent *);
void volumChange(int);
void positionChange(qint64 position);
void seekChange(int position); //滑動(dòng)滑動(dòng)條快進(jìn)、倒退音樂(lè),且音樂(lè)已播放時(shí)長(zhǎng)也跟著變化
void videoTime();
void changestartbutton();
void button_style();
void mute();
private:
QMediaPlayer* player;
QVideoWidget* videoWidget;
QMediaPlaylist* playlist;
Ui::VideoPlayer *ui;
bool isPlay_wm=false;
bool ismute=false;
int moved;
};
#endif // VIDEOPLAYER_H
videoplayer.cpp代碼如下:
#include "videoplayer.h"
#include "ui_videoplayer.h"
#include <QDebug>
#include <QFile>
#include <QCloseEvent>
VideoPlayer::VideoPlayer(QWidget *parent) :
QDialog(parent),
ui(new Ui::VideoPlayer)
{
ui->setupUi(this);
qDebug()<<"執(zhí)行到此處";
connect(ui->Buttonstart,&QPushButton::clicked,this,&VideoPlayer::changestartbutton);
connect(ui->Buttonmute,&QPushButton::clicked,this,&VideoPlayer::mute);
init();
connect(ui->Buttonstart,&QPushButton::clicked,this,&VideoPlayer::slotButtonStart);
connect(ui->voiceSlider, SIGNAL(sliderMoved(int)), this, SLOT(volumChange(int)));
connect(player,SIGNAL(positionChanged(qint64)),this,SLOT(positionChange(qint64)));
connect(ui->timeSlider,SIGNAL(sliderMoved(int)),this,SLOT(seekChange(int)));
connect(player,SIGNAL(durationChanged(qint64)),this,SLOT(videoTime()));
}
VideoPlayer::~VideoPlayer()
{
slotstop();
delete ui;
}
void VideoPlayer::init(){
//widget=new QWidget;
button_style();
player= new QMediaPlayer;
videoWidget=new QVideoWidget;
playlist=new QMediaPlaylist;
playlist->clear();
playlist->addMedia(QUrl::fromLocalFile("C:\\Users\\44637\\Music\\MV\\陳奕迅-我們MV.mp4"));
player->setPlaylist(playlist);
QFile file("C:\\Users\\44637\\Music\\MV\\陳奕迅-我們MV.mp4");
if(!file.open(QIODevice::ReadOnly))
qDebug() << "Could not open file";
player->setVideoOutput(videoWidget);
player->setPlaylist(playlist);
videoWidget->setAutoFillBackground(true);
QPalette qplte;
qplte.setColor(QPalette::Window, QColor(0,0,0));
videoWidget->setPalette(qplte);
ui->verticalLayout->addWidget(videoWidget);
player->play();
isPlay_wm=true;
}
void VideoPlayer::slotButtonStart(){
if(!isPlay_wm){
isPlay_wm=true;
//Player->setVolume(100);
player->play();
//musicTime();
//qApp->quit();
}
else{
isPlay_wm=false;
player->pause();
//musicTime();
}
}
void VideoPlayer::slotstop(){
player->stop();
playlist->clear();
//player->
}
void VideoPlayer::closeEvent(QCloseEvent *event){
slotstop();
event->accept();
}
void VideoPlayer::volumChange(int vol)
{
player -> setVolume(vol);
}
void VideoPlayer::positionChange(qint64 position)
{
ui->timeSlider->setMaximum(player->duration() / 1000);//設(shè)置滑塊的長(zhǎng)度范圍為音樂(lè)長(zhǎng).00度
ui->timeSlider->setValue(position / 1000);//如果音樂(lè)進(jìn)度改變,則改變滑塊顯示位置
moved = position;//讓播放時(shí)間等于音樂(lè)進(jìn)度(毫秒)
QTime moveTime(0,(moved/60000) % 60,(moved / 1000) % 60);//設(shè)置時(shí)間
ui->currenttime ->setText(moveTime.toString("mm:ss"));//顯示時(shí)間
QString t=moveTime.toString("mm:ss");
QString mm = t.mid(0,2);
QString ss = t.mid(3, 2);
int m = mm.toInt();
int s = ss.toInt();
int time = m*60*1000 + s*1000;
qDebug()<<"int"<<time;
}
void VideoPlayer::seekChange(int position)
{
player -> setPosition(position * 1000);//如果滑塊改變位置,則改變音樂(lè)進(jìn)度
moved = position * 1000;//讓播放時(shí)間等于音樂(lè)進(jìn)度(毫秒)
QTime moveTime(0,(moved/60000) % 60,(moved / 1000) % 60);//設(shè)置時(shí)間
}
void VideoPlayer::videoTime(){
qint64 time = player->duration();
QTime Time(0,(time % (1000 * 60 * 60)) / (1000 * 60),(time % (1000 * 60)) / 1000);
ui->videotime->setText(Time.toString("mm:ss"));
qDebug()<<"time:"<<Time;
}
void VideoPlayer::changestartbutton(){
if(!isPlay_wm)
ui->Buttonstart->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\pause.jpg"));
else
ui->Buttonstart->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\start.jpg"));
}
void VideoPlayer::button_style(){
ui->Buttonstart->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\pause.jpg"));
ui->Buttonmute->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\volume.jpg"));
}
void VideoPlayer::mute(){
if(!ismute){
player -> setVolume(0);
ui->Buttonmute->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\mute.png"));
ismute=true;
}
else{
player -> setVolume(100);
ui->Buttonmute->setIcon(QIcon("E:\\QT\\QTcode\\MusicPlayer\\icon\\volume.jpg"));
ismute=false;
}
}
總體運(yùn)行界面如下:


一些關(guān)鍵方法和思路:
(1)導(dǎo)入歌曲:
從本地文件將歌曲名和歌曲的歌詞導(dǎo)入,獲取文件路徑下所有的音樂(lè)文件和歌詞文件,生成兩個(gè)QStringList類型的列表。同時(shí)將歌名添加到顯示歌名的組件上。同時(shí)實(shí)例化播放器和播放列表,將列表逐項(xiàng)加載到播放列表上,并將播放列表加載到播放器上。
(2)音樂(lè)、視頻進(jìn)度條:
設(shè)置滑塊的長(zhǎng)度范圍為音樂(lè)長(zhǎng)0.001倍,如果音樂(lè)進(jìn)度發(fā)生改變,則同時(shí)改變滑塊位置,如果滑塊改變位置,則改變音樂(lè)進(jìn)度。同時(shí)設(shè)置時(shí)間,讓播放時(shí)間等于音樂(lè)進(jìn)度(毫秒)并用Qlabel組件顯示。
(3)顯示歌詞:(個(gè)人覺(jué)得這是個(gè)最難的點(diǎn),參考了大神的思路,加上自己的思考,搞了好久才搞出來(lái)😂)
mp3歌詞文件是以lrc為擴(kuò)展名的文件,屬于純文本格式文件,通過(guò)解析mp3純文本格式的歌詞文件(“XXX.lrc”),實(shí)現(xiàn)歌詞的同步顯示。
LRC歌詞是一種包含著“[:]”形式的“標(biāo)簽(tag)”、基于純文本的歌詞專用格式。
標(biāo)簽分為“標(biāo)識(shí)標(biāo)簽”和“時(shí)間標(biāo)簽”兩種,下面①~⑤為“標(biāo)識(shí)標(biāo)簽”,⑥為“時(shí)間標(biāo)簽”。
①[ti:曲名]
②[ar:藝人名]
③[al:專輯名]
④[by:編者(指編輯LRC歌詞的人)]
⑤[offset:時(shí)間補(bǔ)償值] 其單位是毫秒,正值表示整體提前,負(fù)值相反。用于總體調(diào)整顯示的快慢。
⑥[分:秒.厘秒]歌詞內(nèi)容
中括號(hào)里邊是歌曲內(nèi)容顯示時(shí)的開(kāi)始時(shí)間,“:”前面為分鐘,“:”后面為秒,其中“.”前面為秒,“.”后面為厘秒(一秒的百分之一);中括號(hào)外邊是歌詞內(nèi)容。
讀取對(duì)應(yīng)音樂(lè)名字的歌詞文件,逐行讀取歌詞,用QMap格式儲(chǔ)存,不同標(biāo)簽開(kāi)頭用不同的key值儲(chǔ)存。
獲取每個(gè)標(biāo)簽中的時(shí)間,將時(shí)間和相對(duì)應(yīng)的歌詞以鍵值對(duì)的形式儲(chǔ)存到QMap中。
顯示歌詞將當(dāng)前時(shí)間以參數(shù)的形式傳入,將時(shí)間對(duì)應(yīng)的值讀出。
本人初學(xué)QT,已經(jīng)是盡力了,但還有很多做不好的地方,還有一些方法和思路之后再補(bǔ)充。
播放視頻貌似還有點(diǎn)bug,界面太丑,歌詞沒(méi)實(shí)現(xiàn)滾動(dòng),只能顯示當(dāng)前播放到的歌詞,希望大家討論指導(dǎo)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(122.買股票的最佳時(shí)間之二)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(122.買股票的最佳時(shí)間之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C語(yǔ)言入門篇--四大常量(字面,const修飾,宏,枚舉)及標(biāo)識(shí)符
本篇文章是c語(yǔ)言基礎(chǔ)篇,主要講述一下常量,常量即不可被直接修改的量(const修飾的常變量可間接修改,后續(xù)文章會(huì)繼續(xù)說(shuō)明)請(qǐng)大家持續(xù)關(guān)注腳本之家2021-08-08
C語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)版通訊錄的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用C語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的動(dòng)態(tài)版通訊錄,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言有一定幫助,需要的可以參考一下2022-08-08
C語(yǔ)言之字符串模糊查詢方法的實(shí)現(xiàn)
本篇文章主要為大家介紹字符串模糊查詢的C語(yǔ)言程序編寫(xiě)方法,有需要的朋友可以參考下2015-07-07
詳解C++異常處理(try catch throw)完全攻略
這篇文章主要介紹了詳解C++異常處理(try catch throw)完全攻略,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
你真的理解C語(yǔ)言qsort函數(shù)嗎?帶你深度剖析qsort函數(shù)
這篇文章主要介紹了你真的理解C語(yǔ)言qsort函數(shù)嗎?帶你深度剖析qsort函數(shù),本篇將引入一個(gè)庫(kù)函數(shù)來(lái)實(shí)現(xiàn)我們希望的順序,結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02

