使用Qt做一个简易音乐播放器[Phonon浅谈--续]

2010-2-13
使用Qt做一个简易音乐播放器【Phonon浅谈--续】

 

在第一篇Phonon浅谈中提及到了Phonon这个多媒体框架的一些基本知识,于是想着结合这些基本知识来实践一番,做一个简单的音乐播放器。

 

【步骤一】

新建一个Qt Gui工程,在建立过程中需要包含Phonon模块,之后生成文件如下图:

Qt Gui工程会生成一个ui文件,在这里是mainwindow.ui。双击mainwindow.ui进行一番简单的布局,如下图:

关于这个ui界面,中央位置是一个QListWidget,用来显示音乐文件列表;下面一栏红色矩形是一个QVBoxLayout垂直布局部件,用来确定等会要建立的播放进度条的位置;而下面则是四个相关控制按钮。

大概地说,Phonon的工作机制是使用MediaObject来管理MediaSource即源文件,通过Path连接到AudioOutput,最后是由AudioOutput将数据发送到相关物理设备。

于是有了步骤二。

 

【步骤二】

步骤一是用来实现基本的界面,而步骤二是用代码实现具体的功能。

基于对Phonon的认识,有了以下四点:

①使用MediaObject管理媒体源

②使用AudioOutput连接物理设备

③使用SeekSlider实现进度条

④使用QList实现播放列表

于是产生了相应的代码:

Phonon::MediaObject *mediaObject;
Phonon::AudioOutput *audioOutput;
Phonon::SeekSlider *seekSlider;
QList<Phonon::MediaSource> sourceList;//播放列表

并且需要在构造函数里面将
mediaObject 和
audioOutput 连接起来:

Phonon::createPath(mediaObject, audioOutput);

从而使得数据能从
mediaObject 到达
audioOutput ,再通过物理设备播放。

 

1、 
要播放音乐首先需要有源文件,所以先实现添加文件的功能。

首先,将添加按钮和添加功能连接起来:

connect(this->ui->addBtn, SIGNAL(clicked()), this, SLOT(addFiles()));

              从而实现点击按钮激活相应操作的功能,而添加音乐文件的槽的代码如下:

void MainWindow::addFiles(){
QStringList files = QFileDialog::getOpenFileNames(this, tr("Selec Files to play"));
QString file;
foreach(file, files){
this->ui->listWidget->addItem(file);
sourceList.append(file);
}
}

上述代码是使用
QFileDialog 的
getOpenFileNames 方法获取若干个音乐文件,然后再使用
Qt 中的 foreach
遍历每个选中的文件,将其添加到播放列表中。

2、 
播放、暂停和停止的基本实现

同样的先将信号和槽连接起来:

connect(this->ui->playBtn, SIGNAL(clicked()), this, SLOT(playFile()));
connect(this->ui->pauseBtn, SIGNAL(clicked()), this, SLOT(pauseFile()));
connect(this->ui->stopBtn, SIGNAL(clicked()), this, SLOT(stopFile()));

              之后再具体实现相应的简单功能,这里列出
playFile 的代码:

void MainWindow::playFile(){
if(sourceList.isEmpty()){
QMessageBox::information(this, tr("no music files"), tr("no files to play"));
return ;
}
mediaObject->setQueue(sourceList);
mediaObject->play();
this->ui->playBtn->setEnabled(false);
this->ui->pauseBtn->setEnabled(true);
}

首先判断列表是否为空,接着设置播放队列,然后播放当前文件,最后使得播放按钮不可用,而激活暂停按钮。其它的功能类似,都是使用
mediaObject 的方法。

 

【步骤三】

这里只简单地实现播放功能,当然还是可以再继续扩展功能,不过这是后话了。

运行的效果图如下:

此时就能听见蛮好听的《左边》了^_^

 

以下是全部代码:

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <Phonon>
#include <QList>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
void changeEvent(QEvent *e);
private slots:
void addFiles();
void playFile();
void pauseFile();
void stopFile();
private:
Ui::MainWindow *ui;
Phonon::MediaObject *mediaObject;
Phonon::AudioOutput *audioOutput;
Phonon::SeekSlider *seekSlider;
QList<Phonon::MediaSource> sourceList;//播放列表
};
#endif // MAINWINDOW_H

mainwindow.cpp:

#include <QtGui>
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(this->ui->addBtn, SIGNAL(clicked()), this, SLOT(addFiles()));
connect(this->ui->playBtn, SIGNAL(clicked()), this, SLOT(playFile()));
connect(this->ui->pauseBtn, SIGNAL(clicked()), this, SLOT(pauseFile()));
connect(this->ui->stopBtn, SIGNAL(clicked()), this, SLOT(stopFile()));
mediaObject = new Phonon::MediaObject(this);
audioOutput = new Phonon::AudioOutput(this);
seekSlider = new Phonon::SeekSlider(this);
Phonon::createPath(mediaObject, audioOutput);
seekSlider->setMediaObject(mediaObject);
this->ui->seekLayout->addWidget(seekSlider);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::changeEvent(QEvent *e)
{
QMainWindow::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
void MainWindow::addFiles(){
QStringList files = QFileDialog::getOpenFileNames(this, tr("Selec Files to play"));
QString file;
foreach(file, files){
this->ui->listWidget->addItem(file);
sourceList.append(file);
}
}
void MainWindow::playFile(){
if(sourceList.isEmpty()){
QMessageBox::information(this, tr("no music files"), tr("no files to play"));
return ;
}
mediaObject->setQueue(sourceList);
mediaObject->play();
this->ui->playBtn->setEnabled(false);
this->ui->pauseBtn->setEnabled(true);
}
void MainWindow::pauseFile(){
mediaObject->pause();
this->ui->pauseBtn->setEnabled(false);
this->ui->playBtn->setEnabled(true);
}
void MainWindow::stopFile(){
mediaObject->stop();
this->ui->pauseBtn->setEnabled(true);
this->ui->playBtn->setEnabled(true);
}

main.cpp:

#include <QtGui/QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}

 

时间: 2024-02-19 13:39:17

使用Qt做一个简易音乐播放器[Phonon浅谈--续]的相关文章

c#-怎样用C#做简易音乐播放器?用数据库存储播放列表

问题描述 怎样用C#做简易音乐播放器?用数据库存储播放列表 可以播放MP3.wav.WMV.wma等格式的声音文件,具有播放列表功能,要求使用数据库储存播放列表 解决方案 这个很简单的,网上找一大堆,至于用数据库存放,你只要会数据库操作,理清业务逻辑就行了 解决方案二: c#制作的简单音乐播放器 源码参考 http://download.csdn.net/detail/yinchangming/1587916

swing-java如何做视频或音乐播放器

问题描述 java如何做视频或音乐播放器 java有什么类是用来解码视频或者音乐的.想做个视频播放器.有什么现成的类使用么. 解决方案 MediaPlayer 解决方案二: Vitamiohttp://pan.baidu.com/share/link?shareid=2421751472&uk=423516888 解决方案三: Android中是使用android.media.MediaPlayer:Java中应该有类似的类,但我没有用过.

flash-问: 10 我想做一个winform的播放器来播放斗鱼的直播,求大神指点。

问题描述 问: 10 我想做一个winform的播放器来播放斗鱼的直播,求大神指点. 目前没有思路,希望大神出来指点一二.我试过了很多种,利用flash 的插件也无法实现. 解决方案 webbrowser里面加载http://www.douyutv.com/ 解决方案二: 想做一个推荐系统,求志同道合者...

Android简易音乐播放器实现代码

本文实例为大家分享了Android音乐播放器的具体代码,供大家参考,具体内容如下 1.播放项目内的音乐 package com.thm.g150820_android26_playmusic; import Android.media.MediaPlayer; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.wid

UI入门实例做一个个性的播放器

今天在网上看到了一个播放器的实例教程,感觉很不错,很适合UI入门新手练习,发来给大家看看,一起学习啊,好了废话不说了,开始学习吧: 最终效果图 1.新建一个文件,图象大小设置为200X200象素,72DIP,白色背景,RGB模式,.新建图层1,选择椭圆选框工具在图象中拉一个椭圆的选区出来 2.选择渐变填充工具,渐变样式选择'径向'渐变,并将渐变色作如下图般设置,从选区的左上角向选区的右下角拖动鼠标来填充选区 3.用鼠标双击图层1,在图层样式面板中钩选投影.内阴影.外发光,投影参数不作设置,按默认

用Flex3.0 做一个简单Flv 播放器

今天早上, 以前高中同学要我教他用 Flex 写一个flv播放器. 网上应该也有不少的教程了, 但中午吃完饭后, 觉得自己写写也不错, 毕竟自己很少在自己博客上写教程, 于是就写写了..... 有错误请高手指出..以下为我今天写在博客上的一篇简单教程: 用 AS2.0 做的 flv 播放器不少了, Flex 3.0 早期又出了, 就尝试着做一个 flv 播放器. 用 Flex3.0 写出来的东西, 本人觉得, 其产物可以是 flex , 也可以是 AIR ( 早期的Apollo ).  好了,

我是菜鸟,问一个关于音乐播放器的切换问题。

问题描述 这是一个tab标签页.如果我点击本地歌曲Mylove这首歌如何切换到正在播放这个页面? 解决方案 解决方案二: 解决方案三:从一个视图控制器切换到另一个视图控制器的几种方式1,模态(modal)画面的显示方法:例如iphone通讯录管理程序中,追加新的通讯纪录时,就是使用这种模态画面例:点击一个按钮,进入另一个界面-(IBAction)pressAbout:(id)sender{XAboutViewController*about=[[[XAboutViewControllerallo

关于android音乐播放器后台音乐服务停止的问题

问题描述 关于android音乐播放器后台音乐服务停止的问题 我在做一个android音乐播放器,当程序比较多的时候,手机会自动杀掉我的进程,但是我的服务还是在的,也就是0个进程和1个服务.可是我的服务里的音乐播放就停止了,随着进程被杀掉,音乐也停止了.可是我的服务还在啊,音乐为什么停了,我不知道为什么.求解惑. 解决方案 startService() 程序开启后服务不会随程序关闭而关闭,需要主动关闭 bindService() 服务会随着程序关闭而关闭 解决方案二: 请好好复习Service生

Android应用开发之简易、大气音乐播放器实现专辑倒影效果_Android

今天要实现的功能是实现专辑倒影效果,这个功能已经属于图像处理方面的了,对图像处理我不怎么在行,等一下会介绍一个很实用的工具类,专门用来进行图像处理的.这个工具类不是我写的,我只是拿来用到自己的项目当中,这已经足够了,我已经完美实现我想要的效果. 效果图: < 一个很有用的工具类 /SimpleBeautyMusicPlayer/src/com/wwj/sb/utils/ImageUtil.java package com.wwj.sb.utils; import java.io.ByteArra