昨天历经千辛万苦,配置好了VS 2010中的Qt环境(包括Qt for VS插件),今天决定浅浅地品味一下将两者结合进行编程的魅力。

上网查了一些资料,学习了一些基础知识,决定做一个简单的音乐播放器,主要用到Phonon多媒体框架。

Phonon的工作机制:

使用MediaObject来管理MediaSource即源文件,通过Path连接到AudioOutput,最后是由AudioOutput将数据发送到相关物理设备。

1、新建一个工程:文件->新建->项目:

选择Qt Application,本人命名为Player1;

*注意在此过程一定要把Phonon库选上:

2、创建好项目以后,可以看到VS自动生成了很多文件,先不用管它们:

1)双击Form目录下的player1.ui,进行控件的添加:

说明,从上到下分别是:

一个ListWeight(名:listWidget),

一个VerticalLayout(名:verticalLayout),

四个PushButton(名:addBtn,playBtn,pauseBtn,stopBtn)。

当然,各种属性可以自行设置及更改(颜色,大小等);

2)此时,需要的控件已添加完毕,可以保存,并回到VS主页对其进行右击->编译,ui_player1.h文件得到完善;

3、接下来就是各控件对应功能的实现,并进行信号与槽的连接:

1)先来看头文件"player1.h",类的名称在项目创建过程中也可以进行更改(默认为:项目名称+Class):

  1. #ifndef PLAYER1_H
  2. #define PLAYER1_H
  3. #include <QMainWindow>
  4. #include <Phonon>
  5. #include <QList>
  6. #include "ui_player1.h"
  7.  
  8. class Player1Class : public QMainWindow
  9. {
  10. Q_OBJECT
  11. public:
  12. Player1Class(QWidget *parent = 0);
  13. ~Player1Class();
  14. protected:
  15. void changeEvent(QEvent *e);
  16. private slots:
  17. void addFiles();
  18. void playFile();
  19. void pauseFile();
  20. void stopFile();
  21. private:
  22. Ui::Player1Class *ui;
  23. Phonon::MediaObject *mediaObject;
  24. Phonon::AudioOutput *audioOutput;
  25. Phonon::SeekSlider *seekSlider;
  26. QList<Phonon::MediaSource> sourceList;//播放列表
  27. };
  28. #endif //PLAYER1_H

  2)源文件"player1.cpp"

  1. #include <QtGui>
  2. #include "player1.h"
  3. #include "ui_player1.h"
  4.  
  5. Player1Class::Player1Class(QWidget *parent) :
  6. QMainWindow(parent),ui(new Ui::Player1Class)
  7. {
  8. ui->setupUi(this);
  9. connect(this->ui->addBtn, SIGNAL(clicked()), this, SLOT(addFiles()));
  10. connect(this->ui->playBtn, SIGNAL(clicked()), this, SLOT(playFile()));
  11. connect(this->ui->pauseBtn, SIGNAL(clicked()), this, SLOT(pauseFile()));
  12. connect(this->ui->stopBtn, SIGNAL(clicked()), this, SLOT(stopFile()));
  13. mediaObject = new Phonon::MediaObject(this);
  14. audioOutput = new Phonon::AudioOutput(this);
  15. seekSlider = new Phonon::SeekSlider(this);
  16. Phonon::createPath(mediaObject, audioOutput);
  17. seekSlider->setMediaObject(mediaObject);
  18. this->ui->verticalLayout->addWidget(seekSlider);
  19. }
  20.  
  21. Player1Class::~Player1Class()
  22. {
  23. delete ui;
  24. }
  25.  
  26. void Player1Class::changeEvent(QEvent *e)
  27. {
  28. QMainWindow::changeEvent(e);
  29. switch (e->type())
  30. {
  31. case QEvent::LanguageChange:
  32. ui->retranslateUi(this);
  33. break;
  34. default:
  35. break;
  36. }
  37. }
  38.  
  39. void Player1Class::addFiles()
  40. {
  41. QStringList files = QFileDialog::getOpenFileNames(this, tr("Select Files to play"));
  42. QString file;
  43. foreach(file, files)
  44. {
  45. this->ui->listWidget->addItem(file);
  46. sourceList.append(file);
  47. }
  48. }
  49.  
  50. void Player1Class::playFile()
  51. {
  52. if(sourceList.isEmpty())
  53. {
  54. QMessageBox::information(this, tr("no music files"), tr("no files to play"));
  55. return ;
  56. }
  57. mediaObject->setQueue(sourceList);
  58. mediaObject->play();
  59. this->ui->playBtn->setEnabled(false);
  60. this->ui->pauseBtn->setEnabled(true);
  61. }
  62.  
  63. void Player1Class::pauseFile()
  64. {
  65. mediaObject->pause();
  66. this->ui->pauseBtn->setEnabled(false);
  67. this->ui->playBtn->setEnabled(true);
  68. }
  69.  
  70. void Player1Class::stopFile()
  71. {
  72. mediaObject->stop();
  73. this->ui->pauseBtn->setEnabled(true);
  74. this->ui->playBtn->setEnabled(true);
  75. }

  3)主函数文件"main.cpp"

  1. #include <QtGui/QApplication>
  2. #include "player1.h"
  3.  
  4. int main(int argc, char *argv[])
  5. {
  6. QApplication a(argc, argv);
  7. Player1Class w;
  8. w.show();
  9. return a.exec();
  10. }

  4、至此,便可以进行整个项目的编译、运行,结果为:

一首张宇的"给你们"先给大家。谢谢!

  

简单的音乐播放器(VS 2010 + Qt 4.8.5)的更多相关文章

  1. swift3.0 简单直播和简单网络音乐播放器

    本项目采用swift3.0所写,适配iOS9.0+,所有界面均采用代码布局. 第一个tab写的是简单直播,传统MVC模式,第二个tab写的是简单网络音乐播放器.传说MVVM模式(至于血统是否纯正我就不 ...

  2. 用PHP+H5+Boostrap做简单的音乐播放器(进阶版)

    前言:之前做了一个音乐播放器(纯前端),意外的受欢迎,然后有人建议我把后台一起做了,正好也想学习后台,所以学了两天php(不要吐槽我的速度,慢工出细活嘛~)然后在之前的基础上也又完善了一些功能,所以这 ...

  3. 用H5+Boostrap做简单的音乐播放器

    前言:这个是综合一下我最近在学的东西做的小Demo,到实际使用还有距离,但是用来练手巩固知识点还是不错的,最近在二刷JS书和Boostrap.css的源码,做完这个Demo也算是暂告一段落,接下来是j ...

  4. 使用Service组件实现简单的音乐播放器功能 --Android基础

    1.本例利用Service实现简单的音乐播放功能,下面是效果图.(点击开始播放开启服务,音乐播放,点击“停止播放”关闭服务,音乐停止播放.) 2.核心代码: MusicService.java: pa ...

  5. Android课程---简单的音乐播放器

    第一个:用Activity实现 activity_music_play1.xml <?xml version="1.0" encoding="utf-8" ...

  6. HTML5+CSS3+jquery实现简单的音乐播放器

    ...最近天热的,感觉就像煎饼...然后别人在把妹子的时候,只有偶们这帮苦逼的程序员在那边撸代码...我日哦! 然后今天晒的是偶早年写的一个播放器...看上去是不是很有感觉的样子!一番宝物,Lisa唱 ...

  7. Android——用Activity和Service实现简单的音乐播放器

    一.只用Activity 容易出现问题 xml <?xml version="1.0" encoding="utf-8"?> <LinearL ...

  8. Android开发6:Service的使用(简单音乐播放器的实现)

    前言 啦啦啦~各位好久不见啦~博主最近比较忙,而且最近一次实验也是刚刚结束~ 好了不废话了,直接进入我们这次的内容~ 在这篇博文里我们将学习Service(服务)的相关知识,学会使用 Service ...

  9. Android实现简单音乐播放器(MediaPlayer)

    Android实现简单音乐播放器(MediaPlayer) 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 实现一个简单的音乐播放器,要求功能 ...

随机推荐

  1. redis AOF保存机制

    网上说AOF有三种保存方式,不自动保存.每秒自动保存.每命令自动保存. 其中每秒自动保存这个看起来很美好,但是可能会被各种IO的时间所延迟,所以究竟是怎么判断每秒保存的,并不是太明白,故有此文. AO ...

  2. 设计模式C#实现(四)——迭代器模式

    迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. UML类图: 煎饼屋和餐厅合并了!但是有个小问题,虽然两家都同意实现相同的菜单项MenuItem,但是煎饼屋想使用A ...

  3. JS高级程序设计2nd部分知识要点4

    ECMAScript中所有函数的参数都是按值传递的. 5种基本数据类型: Undfined,Null,Boolean,Number,String. ECMAScript中的所有参数传递的都是值,不可能 ...

  4. Redis系列(二)—— 数据类型及其使用

    Redis数据类型及其使用 参考:http://www.cnblogs.com/jackluo/p/3173436.html Redis支持五种数据类型:string(字符串),hash(哈希),li ...

  5. 01_传说中的车(Fabled Rooks UVa 11134 贪心问题)

    问题来源:刘汝佳<算法竞赛入门经典--训练指南> P81: 问题描述:你的任务是在n*n(1<=n<=5000)的棋盘上放n辆车,使得任意两辆车不相互攻击,且第i辆车在一个给定 ...

  6. poj 3169 Layout 差分约束模板题

    Layout Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6415   Accepted: 3098 Descriptio ...

  7. linux文件压缩与打包

    在linux中常见的压缩命令 首先,在linux中压缩文件的扩展名大多是 *.gz gzip程序压缩的文件 *.bz2 bzip2程序压缩的文件 *.tar tar程序打包的数据,并没有压缩过 *.t ...

  8. UESTC 882 冬马党 --状压DP

    定义:dp[i][j]为状态为j时,第i行符合条件的状态数 转移方程:dp[i][j] += dp[i-1][t]   //t为上一行状态,与当前行不冲突. 从第一行开始向下枚举,每次枚举当前行的状态 ...

  9. AC日记——过河卒 洛谷 1002

    题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒”. ...

  10. github结合TortoiseGit使用sshkey,无需输入账号和密码

    1.github上支持三种方式进行项目的clone    https,ssh,subversion https://github.com/用户名/版本库.git ssh的方式 git@github.c ...