qt实现的一个简单的musicplayer

/qt/musicplayer/main.cpp
#include <QtGui/QApplication>
#include "widget.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    a.setApplicationName("musicplayer");

    Widget w;
    w.show();

    return a.exec();
}
/qt/musicplayer/widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QLabel>
#include <QToolButton>
#include <Phonon/VideoPlayer>
#include <Phonon/MediaSource>
#include <QTimeLine>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();
    void createUi();

private slots:
    void prev();
    void next();
    void pause();
    void play();
    void setTimeLabel(int s);

private:
    QVBoxLayout *layout;
    QLabel *nameLabel;
    QLabel *timeLabel;
    QHBoxLayout *buttonLayout;
    QToolButton *backwardButton;
    QToolButton *playButton;
    QToolButton *pauseButton;
    QToolButton *forwardButton;

    void loadDir();
    void loadSong(QString& s);
    void togglePlayPause();
    const QString PlayDir;

    bool isPaused;
    Phonon::VideoPlayer *player;
    QTimeLine *timeLine;

    QStringList songs;
    int totalSongs;
    int songId;
    int prevSongId;
};

#endif // WIDGET_H
/qt/musicplayer/widget.cpp
#include "widget.h"

#include <QStringList>
#include <QDir>

#include <ctime>

Widget::Widget(QWidget *parent)
    : QWidget(parent), PlayDir("d:\\music\\"), isPaused(false),
      songId(0), prevSongId(0)
{
    qsrand((uint) time(0));

    createUi();

    connect(playButton, SIGNAL(clicked()), this, SLOT(play()));
    connect(pauseButton, SIGNAL(clicked()), this, SLOT(pause()));
    connect(backwardButton, SIGNAL(clicked()), this, SLOT(prev()));
    connect(forwardButton, SIGNAL(clicked()), this, SLOT(next()));

    player = new Phonon::VideoPlayer(Phonon::MusicCategory, parent);

    timeLine = new QTimeLine(1000000, parent);
    timeLine->setCurveShape(QTimeLine::LinearCurve);
    timeLine->setFrameRange(0, 1000000);
    connect(timeLine, SIGNAL(frameChanged(int)), this, SLOT(setTimeLabel(int)));

    loadDir();
    if (!totalSongs)
    {
        playButton->setEnabled(false);
        pauseButton->setEnabled(false);
        backwardButton->setEnabled(false);
        forwardButton->setEnabled(false);
    }
    else
    {
        songId = qrand() % totalSongs;
        play();
        connect(player, SIGNAL(finished()), this, SLOT(next()));
    }
}

Widget::~Widget()
{
}

void Widget::loadDir()
{
    QDir dir(PlayDir);
    QStringList filters;
    filters << "*.mp3";
    songs = dir.entryList(filters, QDir::Files);
    totalSongs = songs.count();
}

void Widget::loadSong(QString& s)
{
    player->load(Phonon::MediaSource(PlayDir + s));
    nameLabel->setText(s.left(s.size() - 4));
    timeLine->stop();
}

void Widget::togglePlayPause()
{
    playButton->setHidden(!isPaused);
    pauseButton->setHidden(isPaused);
}

void Widget::setTimeLabel(int s)
{
    int s1 = player->currentTime() / 1000;
    int s2 = player->totalTime() / 1000;
    int m1 = s1 / 60;
    int m2 = s2 / 60;
    timeLabel->setText(tr("%1:%2 / %3:%4").arg(m1).arg(s1 % 60).arg(m2).arg(s2 % 60));
}

void Widget::play()
{
    if (!isPaused)
        loadSong(songs[songId]);

    if (timeLine->state() == QTimeLine::Paused)
        timeLine->resume();
    else
        timeLine->start();

    isPaused = false;
    togglePlayPause();
    player->play();
}

void Widget::pause()
{
    timeLine->setPaused(true);

    isPaused = true;
    togglePlayPause();
    player->pause();
}

void Widget::next()
{
    prevSongId = songId;
    songId = qrand() % totalSongs;

    isPaused = false;
    play();
}

void Widget::prev()
{
    songId = prevSongId;
    prevSongId = 0;

    isPaused = false;
    play();
}

void Widget::createUi()
{
    resize(300, 100);
    setMinimumSize(QSize(300, 100));
    setMaximumSize(QSize(300, 100));

    layout = new QVBoxLayout;
    layout->setSpacing(6);
    layout->setContentsMargins(11, 11, 11, 11);

    nameLabel = new QLabel;
    QFont nameFont;
    nameFont.setPointSize(10);
    nameLabel->setFont(nameFont);
    layout->addWidget(nameLabel);

    timeLabel = new QLabel;
    QFont timeFont;
    timeFont.setPointSize(9);
    timeLabel->setFont(timeFont);
    layout->addWidget(timeLabel);

    buttonLayout = new QHBoxLayout();
    buttonLayout->setSpacing(6);

    backwardButton = new QToolButton;
    playButton = new QToolButton;
    pauseButton = new QToolButton;
    forwardButton = new QToolButton;
    backwardButton->setIcon(QIcon(QString(":/icon/backward.png")));
    playButton->setIcon(QIcon(QString(":/icon/play.png")));
    pauseButton->setIcon(QIcon(QString(":/icon/pause.png")));
    forwardButton->setIcon(QIcon(QString(":/icon/forward.png")));
    buttonLayout->addWidget(backwardButton);
    buttonLayout->addWidget(playButton);
    buttonLayout->addWidget(pauseButton);
    buttonLayout->addWidget(forwardButton);
    pauseButton->setHidden(true);

    buttonLayout->addStretch();
    layout->addLayout(buttonLayout);
    layout->addStretch();
    setLayout(layout);

    setWindowIcon(QIcon(QString(":/icon/play.png")));
    setWindowTitle(tr("musicplayer"));
}

转载于:https://www.cnblogs.com/hylent/archive/2011/11/03/2234347.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值