Qt版音乐播放器
转载请标明出处:牟尼的专栏 http://blog.csdn.net/u012027907
一、关于Qt
1.1 什么是Qt
Qt是一个跨平台应用程序和UI开发框架。使用Qt只需一次性开发应用程序,无需重新编写源代码,便可跨不同桌面和嵌入式操作系统部署这些应用程序。
Qt Creator是全新的跨平台Qt IDE,可单独使用,也可与Qt库和开发工具组成一套完整的SDK,其中包括:高级C++代码编辑器,项目和集成管理工具,集成的上下文相关的帮助系统,图形化调试器,代码管理和浏览工具。
1.2 Qt的特点
1)直观的C++类库:模块化Qt C++类库提供一套丰富的应用程序生成块,包含了构件高级跨平台应用程序所需的 全部功能。具有直观、易学、易用,生成好理解、易维护的代码等特点。
2)跨桌面和嵌入式操作系统的移植性:使用Qt,您只需一次性开发应用程序,就可跨不同桌面和嵌入式操作系 统进行部署,而无须重新写代码,可以说Qt无处不在。
3)使用单一的源代码定位多个操作系统。
4)无须考虑平台,可重新分配开发资源。
5)代码不受担忧平台更改影响的长远考虑。
6)具有跨平台IDE的集成开发工具:Qt Creator是专门为满足Qt开发人员需求而量身定制的跨平台集成开发环境 (IDE)。Qt Creator可在Windows、Linux/X11和Mac OS X桌面操作系统上运行,公开发人员针对多个桌面和移 动平台设备创建应用程序。
1.3 Qt Creator的功能和特性
1)复杂代码编辑器:Qt Creator的高级代码编辑器支持C++和QML(JavaScript)、上下文相关帮助、代码完成功 能、本机代码转化及其功能。
2)版本控制:支持包括Git、Subversion、CVS等版本控制。
3)集成用户界面设计器:Qt Creator提供了两个集成的可视化编辑器:用于通过QWidget生成界面的Qt Designer, 以及用于通过QML语言开发动态界面的Qt Quick Designer
4)项目和编译管理:无论是导入原有项目还是新建全新的项目,Qt Creator都能生成必要的文件。包括对Cross- qmake和Cmake的支持。
5) 桌面和移动平台:支持在桌面和移动设备中编译和运行Qt程序。
6)Qt 模拟器:Qt模拟器是诺基亚Qt SDK的一部分。
二 、窗口部件
2.1 基础窗口部件QWidget
QWidget类是所有用户界面对象的基类,被称为基础窗口部件。QWidget继承自QObject类和QPaintDevice类,其中QObject类是所有支持Qt对象模型的基类,QPaintDevice类是所有可以绘制的对象的基类。
2.2 对话框QDialog
对话框分为模态对话框和非模态对话框。
模态对话框是:在该对话框没有关闭之前,不能与其他应用程序的其他窗口进行交互。常见的模态对话框是提示对话框和警告对话框等。
非模态对话框:与模态对话框相反,在其关闭之前,可以与其他应用程序的其他窗口进行交互。
2.2.1 认识信号和槽
在Qt中使用信号和槽机制来完成对象之间的协同操作,简单来说,信号和槽都是函数,比如单击窗口上的一个按钮想要弹出一个对话框,那么就可以将这个按钮的单击信号和定义的槽关联起来,在这个槽中可以创建一个对话框并显示。这样单击这个按钮机会发射信号,进而执行槽来显示一个对话框。
2.2.2 标准对话框
常用的标准对话框有:颜色对话框、文件对话框、字体对话框、输入对话框、消息对话框、进度对话框、错误信息对话框、向导对话框。
2.3 其他窗口部件
2.3.1 QFrame类
QFame类是带有边框的部件的基类,它的子类有最为常见的标签部件QLabel、QLCDNumber、QSplitter、QStackedWidget、QToolBox和QAbstractScrollArea类。
2.3.2 按钮部件
QAbstractButton类是按钮部件的抽象类,提供了按钮的通用功能。它的子类包括复选框QCheckBox、标准按钮QPushButton、单选按钮QRadioButton和工具按钮QToolButton.
2.3.3 行编辑器
行编辑器QLineEdit部件是一个单行的文本编辑器,允许用户输入和编辑单行的纯文本内容,而且提供了一系列有用的功能,包括撤销和恢复、剪切和拖放等操作。
2.3.4 数值设定框
QAbstractSpinBox类是一个抽象类,提供了一个数值设定框和一个行编辑器来显示设定值。它有三个子类QDateTimeEdit、QSpinBox和QDoubleSpinBox分别用来完成日期时间、整数和浮点数的设定。
2.3.5 滑块部件
QAbstractSlider类提供了一个区间内的整数值,有一个滑块,可以定位到一个整数区间的任意值。这个类是一个抽象类,有3个子类QScrollBar、QSlider和QDial。其中滚动条QScrollBar更多的用在QScrollArea类中来实现滚动区域;而QSlider是最常见的音量控制或多媒体播放进度等滑块;QDial是一个刻度表盘。
三、布局管理
3.1 布局管理系统
Qt的布局管理系统提供了简单而强大的机制来自动排列一个窗口中的部件,确保他们有效的使用空间。Qt包含了一组布局管理类来描述怎样在应用程序的用户界面中对部件进行布局。比如QLayout的几个子类,这里将他们称作布局管理器。所有的QWidget类的子类的实例或对象都可以使用布局管理器来管理位于其中的子部件,QWidget::setLayout()函数可以在一个部件上应用布局管理器。一旦一个部件上设置了布局管理器,那么它会完成一下几种操作:
*定位子部件
*感知窗口默认大小
*感知窗口最小大小
*改变大小处理
*当内容改变时自动更新
布局管理器有:
1)基本布局管理器(QBoxLayout)
2)栅格布局管理器(QGridLayout)
3) 表单布局管理器 (QFormLayout)
分裂器QSlider是一个很实用的东西,他提供了布局管理器的分裂功能,可以将一个部件均匀分裂。
3.2 设置伙伴关系
将一个标签和一个输入框设置为伙伴关系,就可以使得两者为伙伴关系。
3.3 设置Tab键顺序
使用setTabOrder()函数来设置Tab键的顺序。
四、应用程序主窗口
4.1 主窗口框架
主窗口为建立应用程序用户界面提供了一个框架,Qt提供了QMainWindow和其他一些相关的类共同组成主窗口。QMainWindow类拥有自己的布局。它包含一下部件:
1)菜单栏:菜单包含了一个下拉菜单项的列表,这些菜单项由QAction动作类实现。菜单位于主窗口的顶部,一个主窗口只能有一个菜单栏。
2)工具栏:工具栏一般用于显示一些常用的菜单项目,也可以插入其他窗口部件,而且工具栏是可以移动的。一个窗口可以控制多个工具栏。
3)中心部件:在窗口的中心区域可以放入一个窗口部件作为中心部件,是应用程序主要功能实现区。一个主窗口只能有一个中心部件。
4)Dock部件:Dock部件常被称为停靠窗口,因为可以停靠在中心部件的四周。它用来放置一些部件来实现一些功能,就像一个工具箱。一个主窗口可以拥有多个Dock部件。
5)状态栏:状态栏用于显示一些程序的状态信息,在主窗口的最底部。一个主窗口只能有一个状态栏。
4.2 富文本处理
富文本(Rich Text)就是在文档中可以使用多种格式,比如字体颜色、图片和表格等。它是与纯文本(Plain Text)相对而言的。比如Windows上的记事本就是纯文本编辑器,而Word就是富文本编辑器。Qt提供了对富文本处理的支持,可以子啊帮助中查看Rich Text Processsing 关键字。
富文本文档的结构:
QTextEdit: A.QtextCursor检索QTextFrameFormat、QTextBlockFormat、QTextTable、QTextListFormat
B.QTextDocument 检索QTextFrame、QTextBlock、QTextTable、QTextList
4.3 拖放操作
对于一个应用程序,不仅希望能从文件菜单中打开一个文件,更希望可以通过拖动直接将桌面上的文件拖入程序界面上来打开,就像可以将.pro文件拖入Qt Creator中来打开整个项目一样。Qt中提供了强大的拖放操作,可以在帮助中查看Drag and Drop关键字来了解。拖放操作分为拖动(Drag)和(Drop)两种操作。当数据拖动时会被存储为MIME类型,在Qt 中使用QMimeData类来表示MIME类型的数据,并使用QDrag类来完成数据的转移,而整个拖放操作都定义咋I几个鼠标事件和拖放事件中完成的。
五、事件系统
5.1 Qt中的事件
事件是对各种应用程序需要知道的由应用程序内部或者外部产生的事情或者动作的通称。在Qt中使用一个对象来表示一个事件,继承自QEvent类。需要说明的是,事件与信号并不相同,比如单击一个界面上的按钮,那么就会产生鼠标事件QMouseEvent(不是按钮产生的),而是因为按钮被按下了,所以它会发出clicked()单击信号。这里只关心按钮的单击信号,而不用考虑鼠标事件,但是如果要设计一个按钮,或者当单击按钮时让他产生别的效果,那么就要关心鼠标事件了。
在QCoreApplication类的notify()函数的帮助文档中给出了5种处理事件的方法:
方法一:重新实现部件的paintEvent()、mousePressEvent()等事件处理函数。这是最常用的一种方法,不过他只能用来处理特定部件的特定事件。
方法二:重新实现notify()函数。这个函数功能强大,提供了完全的控制,可以在事件过滤器得到事件之前就获得它们。但是,它一次只能处理一个事件。
方法三:重新实现event()函数。QObject类的event()函数可以在事件到达默认事件处理函数之前获得该事件。
方法四:项QApplication对象上安装事件过滤器。因为一个程序只有一个QApplication对象,所以这样实现的功能与使用Notify()函数是相同的,优点是可以同时处理多个事件。
方法五:在对象上安装事件过滤器。使用事件过滤器可以在一个界面类中同时处理不同子部件的不同事件。
5.2 鼠标事件和滚轮事件
QMouseEvent类用来表示一个鼠标事件,当在窗口部件中按下鼠标或者移动鼠标指针时,都会产生鼠标事件。利用 QMouseEvent类可以获知鼠标是哪个键按下了、鼠标指针当前的位置等信息。通常是重新定义部件的鼠标事件处理函数来进行一些自定义的操作。
QWheelEvent类用来表示鼠标滚轮事件,在这个类中主要是获取滚轮移动的方向和距离。以此来进行相应的操作。
5.3 键盘事件
QKeyEvent来用来描述一个键盘事件。当键盘按下或者被释放时,键盘事件便会被送给拥有键盘输入焦点的部件。 QKeyEvent的key()函数可以获取具体的按键,对于Qt中给定的所有按键,可以在帮助中查看Qt::Key关键字。需 要特别说明的是,回车键在这里是Qt::Key_Return;键盘上的一些修饰键不如Ctrl和Shift键等,这里需要使用 QKeyEvent的modifiers()函数来获取。
5.4 定时器事件和随机数
QTimerEvent类用来描述一个定时事件。对于一个QObject的子类,只需要使用int QObject::startTimer(intinterval)函数来开启一个定时器,这个函数需要输入以毫秒为单位的整数作为参数来表明设定的时间,他返回一个整型编号来代表这个定时器。当定时器溢出时就可以在timerEvent()函数中获取改定时器的编号来进行相关的操作。
关于随机数,在Qt中使用qrand()汉qsrand()两个函数来实现的。
5.5 事件过滤器和事件的发送
Qt提供了事件过滤器来在一个部件中监控其他多个部件的事件。事件过滤器与其他部件不同,它不是一个类,只是由两个函数组成的一种操作,用来完成一个部件对其他部件的事件监视。这两个函数分别是installEventFilter()和eventFilter(),部件是QObject类中的函数。
六、界面外观
6.1 Qt风格
Qt中的各种风格是一组继承自QStyle的类。QStyle类是一个抽象基类,分装了一个GUI的外观,Qt的内建(built-in)部件使用它来执行几乎所有的绘制工作,以确保它们看起来可以像各个平台上的本地部件一样。一些风格已经内置在Qt中了。
Qt提供的风格有:
1)QCDEStyle: CDE风格
2)QCleanlooksStyle:类似于GNOME的Clearlook风格
3)QMacStyle: Mac OS风格
4)QMotifStyle: Motif风格
5)QWindowsStyle: 微软Windows风格
6.2 Qt样式表
Qt样式表是一个可以自定义部件外观的十分强大的机制。Qt样式表的概念、术语和语法都受到了HTML的层叠样式表(CSS)的启发,不过与CSS不同的是,Qt样式表应用与部件的世界。
6.3 特殊效果窗体
可以实现不规则窗体、透明窗体等特殊效果的窗体,可以使得应用程序的外观更加个性化,更具吸引力。
转载请标明出处:牟尼的专栏 http://blog.csdn.net/u012027907
七、音乐播放器实例
7.1 功能需求
1) 导入音乐文件和文件夹
2) 播放、暂停、上一曲、下一曲及停止等功能
3) 播放列表的显示及歌词显示
4) 声音大小及进度的控制
5) 频谱的显示
6) 漂亮的界面设计
7.2 总体设计
1) 界面设计:
主要是播放列表、频谱显示、播放、暂停等按钮的设计,界面的设计我花了很多功夫,能够设计出优美的界面,也得益于Qt的设计师,使用类似CSS的方式进行界面的设计,使得界面能够轻松改变。
2) 导入音乐文件、播放、暂停等功能设计:
导入文件使用文件对话框,播放、暂停直接使用QMediaPlayer类的函数控制,导入文件夹是一个难点,主要是在扫描文件夹下所有的文件,提取出.mp3类型的文件,然后加入到QMediaPlaylist列表类中即可,然后将其播放路径写入文件,之后读入播放列表并显示。
3) 歌词播放类的设计:
将歌词播放窗体及播放功能单独设计。
4) 频谱显示:
频谱显示的具体类也是单独设计,显示时在主窗体中显示。
7.3 技术难点
音乐播放器的技术难点是歌词播放及频谱的显示。首先,歌词播放的总体思想是获得当前音乐播放的时间进度,然后与歌词文件的时间点进行比较,如果到了该时间点,就播放其后的歌词,获取的是该时间点与下一句歌词的时间差,均匀播放即可,其次是频谱的显示,这个相对较难,我参考了Qt中自带的示例程序,其是将音乐文件进行傅里叶变换,之后获取不同频率波段的值,最后动态显示。我使用的播放音乐的是QMediaPlayer类和QMeidaPlaylist类,没有用Phonon框架,因为Qt5.0以后不再使用该多媒体框架。
7.4 测试实现
转载请标明出处:牟尼的专栏 http://blog.csdn.net/u012027907