Qt学习笔记-编写简易的音乐播放器
生活随笔
收集整理的這篇文章主要介紹了
Qt学习笔记-编写简易的音乐播放器
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
程序運行截圖如下:
再次添加一個音樂并播放:
代碼如下:
widget.h
#ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QModelIndex>class QThread; class QTreeWidgetItem; class QMediaPlayer;namespace Ui { class Widget; }class Widget : public QWidget {Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);void saveData(); //每次正常關(guān)閉時,就自動保存void readData(); //每次打開程序時,就自動讀取void closeEvent(QCloseEvent *event);~Widget();private slots:void onListContextMenu(const QPoint &pt);void onMenuAdd();void onMenuRemove();void updateTreeWidget(bool available);void listDoubleClicked(QTreeWidgetItem *item, int col);void refreshPlayStatus(QModelIndex index);private:Ui::Widget *ui;QString m_newMusic;QMediaPlayer *m_metaInformationResolver;QMediaPlayer *m_player;};#endif // WIDGET_Hwidget.cpp
#include "widget.h" #include "ui_widget.h" #include <QDebug> #include <QTextStream> #include <QFile> #include <windows.h> #include <QThread> #include <QMenu> #include <QFileDialog> #include <QTreeWidgetItem> #include <QMediaPlayer> #include <QCloseEvent> #include <QUrl> #include <QTime> #include <QMediaContent>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);QStringList headList;headList<<"歌曲名"<<"作者"<<"歌曲長度"<<"文件路徑"<<"是否播放";ui->treeWidget->setHeaderLabels(headList);ui->treeWidget->setColumnWidth(3,250);ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);connect(ui->actionAdd,&QAction::triggered,this,&Widget::onMenuAdd);connect(ui->actionRemove,&QAction::triggered,this,&Widget::onMenuRemove);connect(ui->treeWidget,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(onListContextMenu(QPoint)));connect(ui->addPushButton,SIGNAL(clicked(bool)),this,SLOT(onMenuAdd()));m_metaInformationResolver=new QMediaPlayer(this);connect(m_metaInformationResolver,&QMediaPlayer::metaDataAvailableChanged,this,&Widget::updateTreeWidget);readData();m_player=new QMediaPlayer;connect(ui->treeWidget,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),this,SLOT(listDoubleClicked(QTreeWidgetItem*,int)));connect(ui->treeWidget,SIGNAL(doubleClicked(QModelIndex)),this,SLOT(refreshPlayStatus(QModelIndex))); }void Widget::saveData() {QFile file("musicPath.data");if(file.open(QIODevice::WriteOnly|QIODevice::Text)){QTextStream stream(&file);QTreeWidgetItemIterator it(ui->treeWidget);while(*it){stream<<(*it)->text(3)<<"\n";it++;}file.close();}}void Widget::readData() {QFile file("musicPath.data");if(!file.open(QIODevice::ReadOnly|QIODevice::Text)){return;}while(!file.atEnd()){m_newMusic=file.readLine();m_newMusic=m_newMusic.left(m_newMusic.size()-1);//估計的問題是 讀取太快了,估計要放入一個線程里面,然后每秒調(diào)用一次來試試m_metaInformationResolver->setMedia(QUrl::fromLocalFile(m_newMusic));}file.close();}void Widget::closeEvent(QCloseEvent *event) {saveData();qApp->exit(); }void Widget::refreshPlayStatus(QModelIndex index) {QTreeWidgetItemIterator it(ui->treeWidget);qDebug()<<index.row();int rowIndex=0;while(*it){if(rowIndex==index.row()){(*it)->setText(4,"播放中");}else{(*it)->setText(4,"否");}++it;rowIndex++;} }Widget::~Widget() {delete ui; }void Widget::onListContextMenu(const QPoint &pt) {QTreeWidgetItem *selected=ui->treeWidget->itemAt(pt);QMenu menu;if(selected){menu.addAction(ui->actionRemove);}else{menu.addAction(ui->actionAdd);}menu.exec(ui->treeWidget->mapToGlobal(pt));}void Widget::onMenuAdd() {m_newMusic=QFileDialog::getOpenFileName(this,"選擇mp3文件","D:\\","mp3文件(*.mp3)");if(!m_newMusic.isEmpty()){//添加文件m_newMusic.replace("/","\\");m_metaInformationResolver->setMedia(QMediaContent(QUrl::fromLocalFile(m_newMusic)));} }void Widget::onMenuRemove() {QTreeWidgetItem *item=ui->treeWidget->takeTopLevelItem(ui->treeWidget->currentIndex().row());if(item){delete item;} }void Widget::updateTreeWidget(bool available) {if(!available)return;qDebug()<<"void Widget::updateTreeWidget(bool available)";QString title,author;qint64 duration;title=m_metaInformationResolver->metaData("Title").toString();if(title=="")title="未知";author=m_metaInformationResolver->metaData("Author").toString();if(author=="")author="未知";duration=m_metaInformationResolver->metaData("Duration").toInt()/1000;QTime totalTime((duration/3600)%60,(duration/60)%60, duration%60,(duration*1000)%1000);QString format="mm:ss";if(duration>3600)format="hh:mm:ss";//添加到TreeWidget里面QStringList list;list.append(title);list.append(author);list.append(totalTime.toString(format));list.append(m_newMusic);list.append("否"); //默認不播放QTreeWidgetItem *newItem=new QTreeWidgetItem(ui->treeWidget,list);ui->treeWidget->addTopLevelItem(newItem); }void Widget::listDoubleClicked(QTreeWidgetItem *item,int col) {Q_UNUSED(col)m_player->setMedia(QUrl::fromLocalFile(item->text(3)));m_player->play();//m_player->playlist(XXXX);播放列表 }main.cpp
#include "widget.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }總結(jié)
以上是生活随笔為你收集整理的Qt学习笔记-编写简易的音乐播放器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt5.8 Windows端 关于 St
- 下一篇: Qt工作笔记-各种构造函数汇总以及运算符