MP3播放器设计
Qt Creator项目截图:

运行界面如图1.1所示:
图1.1 MP3播放器运行界面
运行界面右键单击弹出上下文菜单如图1.2所示:

图1.2 MP3运行界面右键单击弹出上下文菜单
mainwindow.h头文件实现代码如下:
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QSystemTrayIcon> //The QSystemTrayIcon class provides an icon for an application in the system tray namespace Ui { class MainWindow; } class QAction;//动作项 class QMenu;//菜单 class QMediaPlayer; class QMediaPlaylist; class QSystemTrayIcon; //The QMediaPlayer class allows the playing of a media source class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0);//声明为explicit的构造函数不能再隐式转换中使用 ~MainWindow();//析构函数 private slots: void positionChanged(qint64); void durationChanged(qint64); void playTo(int, int);//播放 void updateSongList(int);//更新播放列表 void showOrHideSongList();//显示或隐藏播放列表 void importSongs();//导入本地歌曲 void playLast();//播放上一首 void playOrPause();//播放或暂停 void playNext();//播放下一首 void plusSound();//音量增加 void reduceSound();//音量减小 void setPlaybackMode1();//设置歌曲播放模式 void setPlaybackMode2(); void setPlaybackMode3(); void setPlaybackMode4(); void support();//关于酷音听听 void aboutUs();//关于我们 void setPosition(int); void iconActivated(QSystemTrayIcon::ActivationReason reason); protected: void mousePressEvent(QMouseEvent *); void mouseMoveEvent(QMouseEvent *); void closeEvent(QCloseEvent *); private: void createContextMenu(); void createSystemTrayIcon(); Ui::MainWindow *ui; QPoint dragPos; int volume; QAction *restoreAction; QAction *quitAction; QAction *seperatorAction1; QAction *seperatorAction2; QAction *seperatorAction3; QAction *seperatorAction4; QAction *seperatorAction5; QMenu *trayContextMenu; QMediaPlayer *player; QMediaPlaylist *playList; QSystemTrayIcon *trayIcon; }; #endif // MAINWINDOW_H
mainwindow.cpp源文件实现代码如下:
#include <QtWidgets> #include <QMediaPlayer> #include <QMediaPlaylist> #include <QVideoWidget> #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); setWindowFlags(Qt::FramelessWindowHint);//去除窗体标题栏和边框 setAttribute(Qt::WA_TranslucentBackground,true);//设置窗体属性为背景透明 ui->horizontalSlider->setRange(0, 0); ui->tableWidget->hide(); ui->tableWidget->hideColumn(2); volume=80; createContextMenu(); createSystemTrayIcon(); playList=new QMediaPlaylist; playList->setPlaybackMode(QMediaPlaylist::Loop); player=new QMediaPlayer; player->setPlaylist(playList); ui->tableWidget->show();//默认打开软件显示歌曲列表 player->setVolume(volume); connect(ui->horizontalSlider, SIGNAL(sliderMoved(int)), this, SLOT(setPosition(int))); connect(ui->tableWidget, SIGNAL(cellClicked(int,int)), this, SLOT(playTo(int,int))); connect(player, SIGNAL(positionChanged(qint64)), this, SLOT(positionChanged(qint64))); connect(player, SIGNAL(durationChanged(qint64)), this, SLOT(durationChanged(qint64))); connect(playList, SIGNAL(currentIndexChanged(int)), this, SLOT(updateSongList(int))); connect(ui->action_SongList, SIGNAL(triggered()), this, SLOT(showOrHideSongList())); connect(ui->action_Import, SIGNAL(triggered()), this, SLOT(importSongs())); connect(ui->action_Last, SIGNAL(triggered()), this, SLOT(playLast())); connect(ui->action_Play, SIGNAL(triggered()), this, SLOT(playOrPause())); connect(ui->action_Stop, SIGNAL(triggered()), player, SLOT(stop())); connect(ui->action_Next, SIGNAL(triggered()), this, SLOT(playNext())); connect(ui->action_SoundPlus, SIGNAL(triggered()), this, SLOT(plusSound())); connect(ui->action_SoundReduce, SIGNAL(triggered()), this, SLOT(reduceSound())); connect(ui->action_Mode1, SIGNAL(triggered()), this, SLOT(setPlaybackMode1())); connect(ui->action_Mode2, SIGNAL(triggered()), this, SLOT(setPlaybackMode2())); connect(ui->action_Mode3, SIGNAL(triggered()), this, SLOT(setPlaybackMode3())); connect(ui->action_Mode4, SIGNAL(triggered()), this, SLOT(setPlaybackMode4())); connect(ui->action_Support, SIGNAL(triggered()), this, SLOT(support())); connect(ui->action_About, SIGNAL(triggered()), this, SLOT(aboutUs())); connect(ui->action_Quit, SIGNAL(triggered()), this, SLOT(close())); connect(ui->toolButton_Last, SIGNAL(clicked()), this, SLOT(playLast())); connect(ui->toolButton_Play, SIGNAL(clicked()), this, SLOT(playOrPause())); connect(ui->toolButton_Stop, SIGNAL(clicked()), player, SLOT(stop())); connect(ui->toolButton_Next, SIGNAL(clicked()), this, SLOT(playNext())); } MainWindow::~MainWindow() { delete ui; } //--------------------------------------创建主界面上下文菜单----------------------------------------- void MainWindow::createContextMenu() { seperatorAction1=new QAction(this);//创建五条分割线 seperatorAction1->setSeparator(true); seperatorAction2=new QAction(this); seperatorAction2->setSeparator(true); seperatorAction3=new QAction(this); seperatorAction3->setSeparator(true); seperatorAction4=new QAction(this); seperatorAction4->setSeparator(true); seperatorAction5=new QAction(this); seperatorAction5->setSeparator(true); addAction(ui->action_SongList); addAction(ui->action_Import); addAction(seperatorAction1); addAction(ui->action_Last); addAction(ui->action_Play); addAction(ui->action_Stop); addAction(ui->action_Next); addAction(seperatorAction2); addAction(ui->action_Mode1); addAction(ui->action_Mode2); addAction(ui->action_Mode3); addAction(ui->action_Mode4); addAction(seperatorAction3); addAction(ui->action_SoundPlus); addAction(ui->action_SoundReduce); addAction(seperatorAction4); addAction(ui->action_Support); addAction(ui->action_About); addAction(seperatorAction5); addAction(ui->action_Quit); setContextMenuPolicy(Qt::ActionsContextMenu); } //--------------------------------------创建系统托盘图标及对应的上下文菜单----------------------------------------- void MainWindow::createSystemTrayIcon() { trayIcon=new QSystemTrayIcon(this); trayIcon->setIcon(QIcon(tr(":/images/icon.ico"))); trayIcon->setToolTip(tr("CoolYing - Music player"));//生成.ts文件,然后再用Linguist进行翻译//创建一个系统托盘图标提示信息对象 restoreAction=new QAction(tr("Open the main panel"), this);//创建一个还原动作(当主界面最小化至托盘时,单击打开主界面菜单即可弹出软件主界面) connect(restoreAction, SIGNAL(triggered()), this, SLOT(show())); quitAction=new QAction(tr("Quit"), this); connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit())); trayContextMenu=new QMenu(this);//系统托盘图标上下文菜单 trayContextMenu->addAction(ui->action_SongList); trayContextMenu->addAction(ui->action_Import); trayContextMenu->addSeparator(); trayContextMenu->addAction(ui->action_Last); trayContextMenu->addAction(ui->action_Play); trayContextMenu->addAction(ui->action_Stop); trayContextMenu->addAction(ui->action_Next); trayContextMenu->addSeparator(); trayContextMenu->addAction(ui->action_Mode1); trayContextMenu->addAction(ui->action_Mode2); trayContextMenu->addAction(ui->action_Mode3); trayContextMenu->addAction(ui->action_Mode4); trayContextMenu->addSeparator(); trayContextMenu->addAction(ui->action_SoundPlus); trayContextMenu->addAction(ui->action_SoundReduce); trayContextMenu->addSeparator(); trayContextMenu->addAction(ui->action_Support); trayContextMenu->addAction(ui->action_About); trayContextMenu->addSeparator(); trayContextMenu->addAction(restoreAction); trayContextMenu->addAction(quitAction); trayIcon->setContextMenu(trayContextMenu); trayIcon->show(); //发出激活系统托盘图标信号时, connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), \ this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason))); } //--------------------------------------系统托盘图标激活槽函数----------------------------------------- void MainWindow::iconActivated(QSystemTrayIcon::ActivationReason reason) { switch(reason) {//指向哪种系统托盘激活事件 case QSystemTrayIcon::DoubleClick://双击系统托盘事件 case QSystemTrayIcon::Trigger://点击系统托盘条目 if(this->isVisible()==true) { ; } else { this->show(); this->activateWindow(); } break; default: break; } } //--------------------------------------关闭事件处理----------------------------------------- void MainWindow::closeEvent(QCloseEvent *event)//关闭事件处理函数 { if(trayIcon->isVisible()) { hide(); trayIcon->showMessage(tr("Prompting"), tr("CoolYing will run in the background")); event->ignore();//主界面可见时,忽略关闭事件,软件在后台运行 } else { event->accept();//主界面不可见并在后台运行时,退出事件有效 } } //--------------------------------------鼠标事件处理----------------------------------------- void MainWindow::mousePressEvent(QMouseEvent *event)//鼠标点击事件处理函数 { if(event->button()==Qt::LeftButton) { dragPos=event->globalPos()- this->pos();//-frameGeometry().topLeft(); event->accept(); } } void MainWindow::mouseMoveEvent(QMouseEvent *event)//鼠标移动事件处理函数 { if(event->buttons()&Qt::LeftButton) { move(event->globalPos()-dragPos); event->accept(); } } //--------------------------------------播放位置变化----------------------------------------- void MainWindow::positionChanged(qint64 position)//位置改变事件 { ui->horizontalSlider->setValue(position); } //--------------------------------------播放歌曲时长----------------------------------------- void MainWindow::durationChanged(qint64 duration)//播放时长改变 { ui->horizontalSlider->setRange(0, duration); } //-----------------------------------------更新歌曲列表------------------------------------------- void MainWindow::updateSongList(int i) { ui->tableWidget->selectRow(i);//选择i行歌曲 ui->label->setText(tr("Palying: %1").arg(ui->tableWidget->item(i, 0)->text()));//返回播放列表的i行0列歌曲名 } //--------------------------------------显示或隐藏歌曲列表----------------------------------------- void MainWindow::showOrHideSongList() { if(ui->tableWidget->isHidden()) { ui->tableWidget->show(); } else { ui->tableWidget->hide(); } } //--------------------------------------导入本地歌曲----------------------------------------------- void MainWindow::importSongs() { QString initialName=QDir::homePath(); QStringList pathList=QFileDialog::getOpenFileNames(this, tr("Select file"), initialName,"(*.mp3 *.ape)"); for(int i=0; i<pathList.size(); ++i) { QString path=QDir::toNativeSeparators(pathList.at(i)); if(!path.isEmpty()) { playList->addMedia(QUrl::fromLocalFile(path));//添加本地文件,fromLocalFile函数接受由斜杠构成的文件路径 QString fileName=path.split("\\").last();//取用斜杠分开的路径的最后一个文件名 int rownum=ui->tableWidget->rowCount(); ui->tableWidget->insertRow(rownum);//在歌曲列表中插入行号 ui->tableWidget->setItem(rownum, 0, new QTableWidgetItem(fileName.split(".").front()));//第0列显示文件名以"."分开的前部分文本 ui->tableWidget->setItem(rownum, 1, new QTableWidgetItem(fileName.split(".").last()));//第1列显示文件名以"."分开的后部分文本 //ui->tableWidget->setItem(rownum, 2, new QTableWidgetItem(path)); //ui->tableWidget->item(rownum,1)->setFlags(Qt::NoItemFlags); //ui->tableWidget->item(rownum,2)->setFlags(Qt::NoItemFlags); } } } //--------------------------------上一首、播放、暂停、下一首------------------------------------- void MainWindow::playLast()//播放上一首歌曲 { int currentIndex=playList->currentIndex(); if(--currentIndex<0) currentIndex=0; playList->setCurrentIndex(currentIndex); player->play(); } void MainWindow::playTo(int i,int)//播放 { playList->setCurrentIndex(i); player->play(); } void MainWindow::playOrPause()//暂停 { if(ui->toolButton_Play->text()==tr("Play")) { player->play(); ui->toolButton_Play->setText(tr("Stop")); } else { player->pause(); ui->toolButton_Play->setText(tr("Play")); } } void MainWindow::playNext()//播放下一首歌曲 { int currentIndex=playList->currentIndex(); if(++currentIndex==playList->mediaCount()) currentIndex=0; playList->setCurrentIndex(currentIndex); player->play(); } //--------------------------------------设置音量----------------------------------------------- void MainWindow::plusSound()//增加音量 { volume+=20; if(volume>=100) { volume=100; ui->action_SoundPlus->setEnabled(false); } player->setVolume(volume); if(!ui->action_SoundReduce->isEnabled()) ui->action_SoundReduce->setEnabled(true); } void MainWindow::reduceSound()//减小音量 { volume-=20; if(volume<=0) { volume=0; ui->action_SoundReduce->setEnabled(false); } player->setVolume(volume); if(!ui->action_SoundPlus->isEnabled()) ui->action_SoundPlus->setEnabled(true); } //--------------------------------------播放位置----------------------------------------------- void MainWindow::setPosition(int position) { player->setPosition(position); } //--------------------------------------播放模式----------------------------------------------- void MainWindow::setPlaybackMode1()//设置播放模式1--列表循环 { playList->setPlaybackMode(QMediaPlaylist::Loop); } void MainWindow::setPlaybackMode2()//随机播放 { playList->setPlaybackMode(QMediaPlaylist::Random); } void MainWindow::setPlaybackMode3()//单曲循环 { playList->setPlaybackMode(QMediaPlaylist::CurrentItemInLoop); } void MainWindow::setPlaybackMode4()//顺序播放 { playList->setPlaybackMode(QMediaPlaylist::Sequential); } //--------------------------------------关于----------------------------------------------- void MainWindow::support()//关于酷音听听 { QMessageBox::about(this, tr("About CoolYing"), tr("CoolYing,thank you for your use!")); } void MainWindow::aboutUs()//关于我们 { const QUrl url("http://blog.sina.com.cn/terrynotes"); QDesktopServices::openUrl(url); }
main.cpp源文件是实现代码如下:
#include "mainwindow.h" #include <QApplication> #include <QTranslator> int main(int argc, char *argv[]) { QApplication a(argc, argv); QTranslator qtTranslator; qtTranslator.load("CoolYing_zh_CN.qm"); a.installTranslator(&qtTranslator); MainWindow w; w.show(); return a.exec(); }
CoolYing.pro项目文件实现代码如下:
#------------------------------------------------- # # Project created by QtCreator 2013-09-25T22:18:04 # #------------------------------------------------- QT += core gui QT += multimedia QT += multimediawidgets greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = CoolYing TEMPLATE = app RC_FILE = CoolYing.rc SOURCES += main.cpp\ mainwindow.cpp HEADERS += mainwindow.h FORMS += mainwindow.ui OTHER_FILES += \ images/1.png \ images/4.png \ images/3.png \ images/2.png \ images/icon.png \ images/7.png \ images/6.png \ images/5.png \ images/8.png \ images/icon.ico RESOURCES += \ CoolYing.qrc TRANSLATIONS = CoolYing_zh_CN.ts DISTFILES += \ CoolYing.rc \ images/music.png
1、未使用setWindowFlags(Qt::FramelessWindowHint)函数显示效果如图2.1所示
图2.1未使用setWindowFlags(Qt::FramelessWindowHint)函数显示效果
设置窗口标志函数作用:自动去除窗口的标题栏和边框。
2、未使用setAttribute(Qt::WA_TranslucentBackground)函数显示效果如图2.2所示
图2.2未使用setWindowFlags(Qt::FramelessWindowHint)函数显示效果
设置窗口属性函数作用:设置窗口部件透明,控件不透明。
------------------------------------------------------------------------------------------------------------------------------






-----------------------------------------------------------------------------------------------------------------------------
Qt国际化:
使用D:\Qt\Qt5.5.0\5.5\msvc2013_64\bin文件夹下的lupadte工具生成*.ts文件

使用D:\Qt\Qt5.5.0\5.5\msvc2013_64\bin文件夹下的lrelease工具生成*.qm文件(使用lrelease工具发布翻译文件的二进制文件,这样在程序运行时载入会大大的加快速度)

在main源文件中,导入*.qm文件(导入的文件路径为相对路径,所以要将qm文件放到编译生成的exe可执行文件目录下)

----------------------------------------------------------------------------------------------------------------------
歌曲列表中的歌曲未去除文件路径名:

歌曲列表中的歌曲去除文件路径名:

文件名信息分两列显示,分别显示文件名和文件类型:


posted on 2015-08-13 21:48 Eternal love 阅读(121) 评论(0) 收藏 举报
浙公网安备 33010602011771号