Qt 项目实战 | 音乐播放器
- Qt 项目实战 | 音乐播放器
- 播放器整体架构
- 创建播放器主界面
官方博客:https://www.yafeilinux.com/
Qt开源社区:https://www.qter.org/
参考书:《Qt 及 Qt Quick 开发实战精解》
Qt 项目实战 | 音乐播放器
开发环境:Qt Creator 3.3.0 + Qt 4.8.6
播放器整体架构
创建播放器主界面
新建 Qt Gui 应用,项目名 myPlayer,基类为 QWidget,类名为 MyWidget。
添加资源文件 myImages,前缀为空,将 images 中的所有图片都添加进去。
myPlayer.pro 添加代码:
QT += phonon
在 mywidget.h 添加头文件和类前置声明:
#include <phonon>class QLabel;
添加私有变量、函数:
Phonon::MediaObject *mediaObject;
QAction *playAction;
QAction *stopAction;
QAction *skipBackwardAction;
QAction *skipForwardAction;
QLabel *topLabel;
QLabel *timeLabel;void initPlayer();
添加私有槽:
private slots:void updateTime(qint64 time);void setPaused();void skipBackward();void skipForward();void openFile();void setPlaylistShown();void setLrcShown();
在 mywidget.cpp 中添加头文件:
#include <QLabel>
#include <QToolBar>
#include <QVBoxLayout>
#include <QTime>
在构造函数中添加代码:
initPlayer();
添加 initPlayer() 函数的定义:
// 初始化播放器
void MyWidget::initPlayer()
{// 设置主界面标题、图标和大小setWindowTitle(tr("音乐播放器"));setWindowIcon(QIcon(":/images/icon.png"));setMinimumSize(320, 160);setMaximumSize(320, 160);// 创建媒体图mediaObject = new Phonon::MediaObject(this);Phonon::AudioOutput* audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this);Phonon::createPath(mediaObject, audioOutput);// 关联媒体对象的tick()信号来更新播放时间的显示connect(mediaObject, SIGNAL(tick(qint64)), this, SLOT(updateTime(qint64)));// 创建顶部标签,用于显示一些信息topLabel = new QLabel(tr("<a href = \" https://blog.csdn.net/ProgramNovice \"> https://blog.csdn.net/ProgramNovice </a>"));topLabel->setTextFormat(Qt::RichText);topLabel->setOpenExternalLinks(true);topLabel->setAlignment(Qt::AlignCenter);// 创建控制播放进度的滑块Phonon::SeekSlider* seekSlider = new Phonon::SeekSlider(mediaObject, this);// 创建包含播放列表图标、显示时间标签和桌面歌词图标的工具栏QToolBar* widgetBar = new QToolBar(this);// 显示播放时间的标签timeLabel = new QLabel(tr("00:00 / 00:00"), this);timeLabel->setToolTip(tr("当前时间 / 总时间"));timeLabel->setAlignment(Qt::AlignCenter);timeLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);// 创建图标,用于控制是否显示播放列表QAction* PLAction = new QAction(tr("PL"), this);PLAction->setShortcut(QKeySequence("F4"));PLAction->setToolTip(tr("播放列表(F4)"));connect(PLAction, SIGNAL(triggered()), this, SLOT(setPlaylistShown()));// 创建图标,用于控制是否显示桌面歌词QAction* LRCAction = new QAction(tr("LRC"), this);LRCAction->setShortcut(QKeySequence("F2"));LRCAction->setToolTip(tr("桌面歌词(F2)"));connect(LRCAction, SIGNAL(triggered()), this, SLOT(setLrcShown()));// 添加到工具栏widgetBar->addAction(PLAction);widgetBar->addSeparator();widgetBar->addWidget(timeLabel);widgetBar->addSeparator();widgetBar->addAction(LRCAction);// 创建播放控制动作工具栏QToolBar* toolBar = new QToolBar(this);// 播放动作playAction = new QAction(this);playAction->setIcon(QIcon(":/images/play.png"));playAction->setText(tr("播放(F5)"));playAction->setShortcut(QKeySequence(tr("F5")));connect(playAction, SIGNAL(triggered()), this, SLOT(setPaused()));// 停止动作stopAction = new QAction(this);stopAction->setIcon(QIcon(":/images/stop.png"));stopAction->setText(tr("停止(F6)"));stopAction->setShortcut(QKeySequence(tr("F6")));connect(stopAction, SIGNAL(triggered()), mediaObject, SLOT(stop()));// 跳转到上一首动作skipBackwardAction = new QAction(this);skipBackwardAction->setIcon(QIcon(":/images/skipBackward.png"));skipBackwardAction->setText(tr("上一首(Ctrl+Left)"));skipBackwardAction->setShortcut(QKeySequence(tr("Ctrl+Left")));connect(skipBackwardAction, SIGNAL(triggered()), this, SLOT(skipBackward()));// 跳转到下一首动作skipForwardAction = new QAction(this);skipForwardAction->setIcon(QIcon(":/images/skipForward.png"));skipForwardAction->setText(tr("下一首(Ctrl+Right)"));skipForwardAction->setShortcut(QKeySequence(tr("Ctrl+Right")));connect(skipForwardAction, SIGNAL(triggered()), this, SLOT(skipForward()));// 打开文件动作QAction* openAction = new QAction(this);openAction->setIcon(QIcon(":/images/open.png"));openAction->setText(tr("播放文件(Ctrl+O)"));openAction->setShortcut(QKeySequence(tr("Ctrl+O")));connect(openAction, SIGNAL(triggered()), this, SLOT(openFile()));// 音量控制部件Phonon::VolumeSlider* volumeSlider = new Phonon::VolumeSlider(audioOutput, this);volumeSlider->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);// 添加到工具栏toolBar->addAction(playAction);toolBar->addSeparator();toolBar->addAction(stopAction);toolBar->addSeparator();toolBar->addAction(skipBackwardAction);toolBar->addSeparator();toolBar->addAction(skipForwardAction);toolBar->addSeparator();toolBar->addWidget(volumeSlider);toolBar->addSeparator();toolBar->addAction(openAction);// 创建主界面布局管理器QVBoxLayout* mainLayout = new QVBoxLayout;mainLayout->addWidget(topLabel);mainLayout->addWidget(seekSlider);mainLayout->addWidget(widgetBar);mainLayout->addWidget(toolBar);setLayout(mainLayout);mediaObject->setCurrentSource(Phonon::MediaSource("../myPlayer/music.mp3"));
}
添加 updateTime(qint64 time) 槽的定义:
// 更新 timeLabel 标签显示的播放时间
void MyWidget::updateTime(qint64 time)
{qint64 totalTimeValue = mediaObject->totalTime();QTime totalTime(0, (totalTimeValue / 60000) % 60, (totalTimeValue / 1000) % 60);QTime currentTime(0, (time / 60000) % 60, (time / 1000) % 60);QString str = currentTime.toString("mm:ss") + " / " + totalTime.toString("mm:ss");timeLabel->setText(str);
}
添加 setPaused() 槽的定义:
// 播放或者暂停
void MyWidget::setPaused()
{// 如果先前处于播放状态,那么暂停播放;否则,开始播放if (mediaObject->state() == Phonon::PlayingState)mediaObject->pause();elsemediaObject->play();
}