欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

QT實(shí)現(xiàn)簡單音樂播放器

 更新時(shí)間:2020年06月30日 17:01:29   作者:霧冷笙簫  
這篇文章主要為大家詳細(xì)介紹了QT實(shí)現(xiàn)簡單的音樂播放器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

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




工程結(jié)構(gòu)目錄如下(整個(gè)結(jié)構(gòu)沒有設(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)度條隨著音樂播放變化
  void seekChange(int position); //滑動(dòng)滑動(dòng)條快進(jìn)、倒退音樂,且音樂已播放時(shí)長也跟著變化
  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);  //獲取文件夾下所有音樂文件
  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è)置滑塊的長度范圍為音樂長.00度
  ui->Progressbar->setValue(position / 1000);//如果音樂進(jìn)度改變,則改變滑塊顯示位置
  moved = position;//讓播放時(shí)間等于音樂進(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);//如果滑塊改變位置,則改變音樂進(jìn)度
  moved = position * 1000;//讓播放時(shí)間等于音樂進(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);//如果滑塊改變位置,則改變音樂進(jìn)度
}

void MainWindow::fastBack(){
  qint64 position=Player->position();
  qDebug()<<"position"<<position;
  position=position-5000;
  ui->Progressbar->setValue(position/1000);
  Player -> setPosition(position);//如果滑塊改變位置,則改變音樂進(jìn)度

}

videoplayer.h代碼如下(視頻播放和音樂播放差不多):

#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)、倒退音樂,且音樂已播放時(shí)長也跟著變化
  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è)置滑塊的長度范圍為音樂長.00度
  ui->timeSlider->setValue(position / 1000);//如果音樂進(jìn)度改變,則改變滑塊顯示位置
  moved = position;//讓播放時(shí)間等于音樂進(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);//如果滑塊改變位置,則改變音樂進(jìn)度
  moved = position * 1000;//讓播放時(shí)間等于音樂進(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)入,獲取文件路徑下所有的音樂文件和歌詞文件,生成兩個(gè)QStringList類型的列表。同時(shí)將歌名添加到顯示歌名的組件上。同時(shí)實(shí)例化播放器和播放列表,將列表逐項(xiàng)加載到播放列表上,并將播放列表加載到播放器上。

(2)音樂、視頻進(jìn)度條:

設(shè)置滑塊的長度范圍為音樂長0.001倍,如果音樂進(jìn)度發(fā)生改變,則同時(shí)改變滑塊位置,如果滑塊改變位置,則改變音樂進(jìn)度。同時(shí)設(shè)置時(shí)間,讓播放時(shí)間等于音樂進(jìn)度(毫秒)并用Qlabel組件顯示。

(3)顯示歌詞:(個(gè)人覺得這是個(gè)最難的點(diǎn),參考了大神的思路,加上自己的思考,搞了好久才搞出來😂)
mp3歌詞文件是以lrc為擴(kuò)展名的文件,屬于純文本格式文件,通過解析mp3純文本格式的歌詞文件(“XXX.lrc”),實(shí)現(xiàn)歌詞的同步顯示。
LRC歌詞是一種包含著“[:]”形式的“標(biāo)簽(tag)”、基于純文本的歌詞專用格式。
標(biāo)簽分為“標(biāo)識標(biāo)簽”和“時(shí)間標(biāo)簽”兩種,下面①~⑤為“標(biāo)識標(biāo)簽”,⑥為“時(shí)間標(biāo)簽”。
①[ti:曲名]
②[ar:藝人名]
③[al:專輯名]
④[by:編者(指編輯LRC歌詞的人)]
⑤[offset:時(shí)間補(bǔ)償值] 其單位是毫秒,正值表示整體提前,負(fù)值相反。用于總體調(diào)整顯示的快慢。
⑥[分:秒.厘秒]歌詞內(nèi)容
中括號里邊是歌曲內(nèi)容顯示時(shí)的開始時(shí)間,“:”前面為分鐘,“:”后面為秒,其中“.”前面為秒,“.”后面為厘秒(一秒的百分之一);中括號外邊是歌詞內(nèi)容。
讀取對應(yīng)音樂名字的歌詞文件,逐行讀取歌詞,用QMap格式儲(chǔ)存,不同標(biāo)簽開頭用不同的key值儲(chǔ)存。
獲取每個(gè)標(biāo)簽中的時(shí)間,將時(shí)間和相對應(yīng)的歌詞以鍵值對的形式儲(chǔ)存到QMap中。
顯示歌詞將當(dāng)前時(shí)間以參數(shù)的形式傳入,將時(shí)間對應(yīng)的值讀出。

本人初學(xué)QT,已經(jīng)是盡力了,但還有很多做不好的地方,還有一些方法和思路之后再補(bǔ)充。
播放視頻貌似還有點(diǎn)bug,界面太丑,歌詞沒實(shí)現(xiàn)滾動(dòng),只能顯示當(dāng)前播放到的歌詞,希望大家討論指導(dǎo)。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++實(shí)現(xiàn)LeetCode(122.買股票的最佳時(shí)間之二)

    C++實(shí)現(xiàn)LeetCode(122.買股票的最佳時(shí)間之二)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(122.買股票的最佳時(shí)間之二),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言入門篇--四大常量(字面,const修飾,宏,枚舉)及標(biāo)識符

    C語言入門篇--四大常量(字面,const修飾,宏,枚舉)及標(biāo)識符

    本篇文章是c語言基礎(chǔ)篇,主要講述一下常量,常量即不可被直接修改的量(const修飾的常變量可間接修改,后續(xù)文章會(huì)繼續(xù)說明)請大家持續(xù)關(guān)注腳本之家
    2021-08-08
  • C語言實(shí)現(xiàn)動(dòng)態(tài)版通訊錄的示例代碼

    C語言實(shí)現(xiàn)動(dòng)態(tài)版通訊錄的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C語言實(shí)現(xiàn)一個(gè)簡單的動(dòng)態(tài)版通訊錄,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C語言有一定幫助,需要的可以參考一下
    2022-08-08
  • C語言預(yù)處理詳解

    C語言預(yù)處理詳解

    這篇文章主要給大家介紹了關(guān)于C語言之預(yù)處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-10-10
  • C語言之字符串模糊查詢方法的實(shí)現(xiàn)

    C語言之字符串模糊查詢方法的實(shí)現(xiàn)

    本篇文章主要為大家介紹字符串模糊查詢的C語言程序編寫方法,有需要的朋友可以參考下
    2015-07-07
  • 詳解C++異常處理(try catch throw)完全攻略

    詳解C++異常處理(try catch throw)完全攻略

    這篇文章主要介紹了詳解C++異常處理(try catch throw)完全攻略,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 你真的理解C語言qsort函數(shù)嗎?帶你深度剖析qsort函數(shù)

    你真的理解C語言qsort函數(shù)嗎?帶你深度剖析qsort函數(shù)

    這篇文章主要介紹了你真的理解C語言qsort函數(shù)嗎?帶你深度剖析qsort函數(shù),本篇將引入一個(gè)庫函數(shù)來實(shí)現(xiàn)我們希望的順序,結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • C語言中循環(huán)嵌套的應(yīng)用方式

    C語言中循環(huán)嵌套的應(yīng)用方式

    這篇文章主要介紹了C語言中循環(huán)嵌套的應(yīng)用方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C語言版實(shí)現(xiàn)三子棋游戲

    C語言版實(shí)現(xiàn)三子棋游戲

    這篇文章主要為大家詳細(xì)介紹了C語言版實(shí)現(xiàn)三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 一篇文章帶你了解C++智能指針詳解

    一篇文章帶你了解C++智能指針詳解

    這篇文章主要介紹了c++ 智能指針基礎(chǔ)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下,希望能給你帶來幫助
    2021-08-08

最新評論