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)    收藏  举报

导航