版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ⅡI基于QT的音乐播放器设计与实现摘要音乐作为一种娱乐性质的产品,从古到今一直受人喜爱。进入信息社会,音乐的传播越来越广,应对大众对音乐的需求,市场上出现了大量的音乐播放软件,其中包括千千静听、酷狗等众所周知的产品。同时随着电子技术的不断发展,各种智能设备的出现,使得不同设备都需要音乐播放器软件。QT作为一种跨平台开发框架,可以轻松开发适应各种平台的软件,而且丰富的代码库和方便的界面设计过程使得开发成本低,而本软件的实现正是基于QT。本音乐播放器主要完成音乐播放与暂停、歌词同步、创建音乐列表、播放上一首和下一首、调节音量、播放模式、添加删除歌曲、窗口的拖动、主流音频格式的播放支持等功能。目前系统实现所采用的技术为QT与C++。关键词:音乐播放器,QT,C++
MusicPlayerbasedonQTdesignandimplementationAbstractMusicasakindofentertainmentproducts,hasbeenpopularfromancienttimestothepresent.Intheinformationsociety,thespreadofmusicisbecomingmoreandmorepopular,demandformusictothepublic,themarketappearedalargenumberofmusicplayersoftware,includingTTPlayer,cooldog,aseveryoneknowstheproduct.Atthesametime,withthedevelopmentofelectronictechnology,theemergenceofvarioussmartdevices,sothatdifferentdevicesneedmusicplayersoftware.QTisacrossplatformdevelopmentframework,caneasilyadapttothedevelopmentofavarietyofplatforms,butalsoenrichthecodebaseandconvenientinterfacedesignprocesssothatthedevelopmentoflowcost,andtherealizationofthesoftwareisbasedonQT.Themusicplayerismainlytocompletethemusicplaybackandpause,synchronouslyrics,musicplaylist,createasongandthenextsong,adjustvolume,playmode,addanddeletesongs,dragthewindow,themainstreamaudioformatsupportandotherfunctions.ThecurrentsystemimplementationtechniquesusedforQTandC++.KeyWords:MusicPlayer,C++,QT
目录TOC\t"标题1,1,标题2,2,标题3,3"第一章引言 11.1研究现状 11.2主要研究的目的及内容 11.3研究方法及设计思路 21.3.1研究方法 21.3.2设计思路 3第二章应用需求分析与可行性分析 42.1应用需求分析 42.2运行需求分析 42.3其他需求分析 42.4可行性分析 42.4.1经济可行性 42.4.2技术可行性 52.4.3运行可行性 52.4.4时间可行性 52.4.5法律可行性: 5第三章相关技术简介 63.1C++ 63.2QT 73.3音乐播放原理 7第四章系统分析 94.1系统实现目标 94.2系统体系结构 9第五章系统设计 115.1概要设计 115.2软件结构设计 115.3详细设计 125.3.1歌曲列表显示 125.3.2歌词同步功能 145.3.3播放控制 155.4主要技术实现 175.4.1播放类QMediaPlayer的使用 175.4.2播放列表QMediaPlaylist 185.4.3歌词显示 18第六章测试 206.1程序调试 206.2程序的测试 206.2.1测试的重要性及目的 206.2.2测试的步骤 226.2.3测试的主要内容 226.3本程序的测试情况 236.3.1主要测试用例 236.3.2测试用例的实施 23结束语 25参考文献 26致谢 27附录 28太原科技大学华科学院毕业设计(论文)PAGEPAGE4太原科技大学华科学院毕业设计(论文)PAGEPAGE1第1章引言1.1研究现状所谓音乐播放器可以说是把音频解码器进行可视化呈现,变成可以供人操作的图形画面,本质上是应用了各种音频编码格式的解码工具软件。比如说ape格式调用的是Monkey'sAudio解码器,flac格式调用的是flac解码器,mp3调用的是lame解码器。很多音乐播放器都播放各种音乐格式的音乐文件,其实是这些播放器把各种的音频解码器统一包装起来,而且使用一致的播放画面,进而让使用者能够简洁地播放和听取多样化的音乐。大众的音乐播放器单单是将音频解码器包装起来,而同一种音频的解码方法又是不变的,所以理论上所有播放器软件音质应该是完全相同的,若果说有音质最好的音乐播放器实际上是欲盖弥彰。一些个音乐播放器在应用解码器的前提上加入DSP插件,以转换和扭曲方法处理原始的音乐,以迎合人们的喜好,看似以这样的形式获得了优质音质,但事实真相是原本音乐被毁坏,音质成了两极分化,有的变好,有的变差。音乐播放器的特色在于可视界面亲民并具有强大的扩展性。界面酷炫,操作简单是当前市面上播放软件的绝招,缺乏扩展性是根本弱点,支持格式不多且自成体系。所以开源播放软件的制胜法宝是针对扩展性加强建设,符合音乐更多种的格式,但界面平淡无奇,影响力小使用者基数低的缺点也是暴露无遗。1.2主要研究的目的及内容当下社会,每个移动平台或电子产品里都有音乐播放器的身影。它将声音或是音乐传遍大江南北。科技为王的时下如雨后春笋般不同平台开发的音乐播放器涌现网络,其中值得注意的是QtCreator开发的音乐播放器占用内存小功能强,只要进行一次编译,就可以移植到嵌入式平台下或其他平台下。科技的进步,将许许多多的嵌入式设备带入人们的视野中,所以嵌入式软件的开发对于嵌入式系统设备的前景有着巨大推动作用。比如linux系统对各种设备的广泛支持性,能方便应用与电脑、手机、汽车及工业等。嵌入式系统在众多领域的应用带来了便利,提高了我们的生活质量,尤其是消费电子产品潜力是巨大的。随着人们精神需求的加强,人们更加期待功能好的美观简洁的嵌入式音乐播放器,所以应用嵌入式系统开发音乐播放器在市场中占有重要的席位。这次的设计是开发一个音乐播放器,能够实现播放不同类型的音频功能。该音乐播放器具有添加歌曲,删除歌曲,上一曲,播放歌曲,暂停歌曲,下一曲,播放模式等,具备基本的音乐软件功能,用QT设计出来的播放器都有,并且可以显示歌词,使用QT开发,利用其跨平台性和易扩展性可以为将来播放器的扩展打下基础。1.3研究方法及设计思路1.3.1研究方法音乐播放器是一个典型的应用软件,其功能性是第一位的。我在产品开发过程中遵循的是瀑布模型开发方法,先后进行相对全面的市场调查、需求分析、可行性分析、系统设计、详细设计、编码、测试等步骤。在系统设计时采用的是结构化设计方法。瀑布模型(WaterfallModel)实际上是项目开发架构只不过是形象化的称呼,一个严格开发过程是通过合理的规划分步骤分阶段完成的,不管是系统需求分析还是软件的发布及维护的过程中,每个阶段里有源源不断不断的产生反馈信息生成,所以当发现信息没有被覆盖或是遇到问题的产生,最好方法是“返回”上一个阶段将错误改正,最终发现项目开发过程程是以上到下形象的“流动”,因为这样得名瀑布模型。在软件工程、企业项目、产品生产还有市场销售等方面都会涉及运用瀑布模型。结构化设计方法给出一组帮助设计人员在模块层次上区分设计质量的原理与技术。它把系统作为一系列数据流的转换,输入数据被转换为期望的输出值,通过模块化来完成自顶而下实现的文档化,并作为一种评价标准在软件设计中起指导性作用,通常与结构化分析方法衔接起来使用,以数据流图为基础得到软件的模块结构。结构化设计所使用的工具有结构图和伪代码。结构图是一种通过使用矩形框和连接线来表示系统中的不同模块以及其活动和子活动的工具。SD方法在构建变换型结构或事务型结构的系统时有非常好的效果。数据模型与过程模型的一并使用组成了结构化设计的过程。实际设计的时候,采取面向整体程序下结构为对象,并常常制作模块结构图描述程序模块间的联系。结构化设计应分为一下几步:①测评数据流图情况;②明确数据流图类型问题;③将数据流图映射至软件模块结构,作为推出模块结构的上层的依据;④基于数据流图逐步分解高层模块,设计中下层模块;⑤改进模块结构,产生规范全面的软件结构;⑥描述模块接口。1.3.2设计思路(1)分析市场上现有的音乐播放器产品,找到主要产品的优势和缺点;(2)分析本软件的可行性和应该具备的功能;(3)针对系统功能研究和解决技术问题,并进行设计;(4)使用具体的程序设计技术实现软件并测试。第2章应用需求分析与可行性分析2.1应用需求分析本软件应简单易用,并且占用资源少,包含播放器软件的主要功能。2.2运行需求分析硬件条件:CORECPU、1GRAM、10GROM以上的PC机。软件条件:Windows72.3其他需求分析该系统具备的条件有可维护性、可靠性、可理解性、效率等。方便使用者的认识和操作。可维护性囊括可读性、可测试性等。可靠性囊括正确性和健壮性等。在开发过程中,应克服不利因素与限制的条件(费用、时间、适合的软、硬件资源等),尽量满足以上各方面需求。2.4可行性分析2.4.1经济可行性进行项目时对开发者的经济现状和投资能力予以分析,对项目建设运行与维护费用做好预算,预计项目完成后可能获得的社会和经济效益。本项目是作为毕业课题由自我设计的,投入费用甚小,软件开发完成后可为以后实现功能扩展提供便利,估算开发费用和今后的运行、维护费用,预计项目会获得的收益,把费用与效益进行对比。开发、运行和维护费用主要包括:购买和安装设备的费用:计算机硬件;软件开发费用:使用QT的免许可证版本,免费;人员费用:个人独自开发,正常生活费用;消耗品费用:相关软件开发资料、保障系统运行的消耗用品。所有开支都不大,所以经济上是可行的。2.4.2技术可行性技术可行性是估计拥有的技术条件是不是能保证实现项目,开发工具的配置能否满足项目的要求等。该软件运用QT进行开发,QT作为被广泛使用的框架,具有强大的功能,而其中的QMediaPlayer功能也十分适合开发音乐播放器。进过1个月的学习和研究,我已经初步掌握了QT开发过程,以及相关的类库。所以技术是可行的。2.4.3运行可行性本软件小巧易用,占用资源少,可以在多种平台上安装运行,本毕业设计只在windows7系统下的PC上测试和运行,运行可行。2.4.4时间可行性学习时间紧,项目任务重,要一边设计和实现相关功能,时间也算是紧紧凑凑,但是经过努力,项目功能能基本实现,一些功能在测试会有点问题,以后会在逐步解决。2.4.5法律可行性:①所有技术资料都为合法。②开发过程中不存在知识产权问题。③未抄袭任何网站,不存在侵犯版权问题。④开发过程中未涉及任何法律责任。结合以上考虑,本项目的实现从技术上、从经济上、从法律上皆可行。第3章相关技术简介3.1C++说到C++其实是由C语言发展出来的语言,从1969年开始C++登上了历史舞台。大约1969年,美国贝尔实验室的KenThompson为DECPDP-7计算机开发了一个操作系统软件,于是最早的UNIX诞生了。之后,他以剑桥大学的MartinRichards开发的BCPL语言为依据,给UNIX开发了一个方便编写系统软件的语言,取名叫做B。B语言是一款无类型的语言,与之后的C语言相比他的特点是直接面对机器字操作。B语言可说是系统软件编程语言的首个应用,而且B语言其本身的解释程序由KenThompson用这首个应用改写。1972至1973期间,时为贝尔实验室的DenisRitchie对B语言进行优化,从此B语言多了数据类型的理念,也是从这开始世界上多了一种可以在直接生成机器代码的编译程序,它叫做C。于1973年,UNIX的内核在KenThompson小组的努力下用C被重新改编。紧接着,许多计算机例如:IBM360/370、Honeywell11以时VAX-11/780等,皆应用了C语言所编译程序,C用其无可抵挡的势头发展成为最具影响力的系统程序设计语言。但是,C语言也有美中不足的地方,比如说类型检查机制薄弱、缺失支持代码复用的语言结构,这些不足使C语言在开发大程序时遇到难题。有缺点就有改进的空间,贝乐实验室的BjarneStroustrup博士和同事们开始了针对C语言进行优化改造工作,为C语言添加了“类”的概念,最初的C++语言就此出现(1983)。往后的时间,Stroustrup和他的同事们将运算符重载、引用、虚函数等功能添加到C++家族,C++变得更加完善,在1989年后诞生了AT&TC++2.0版本。随后美国国家标准化协会ANSI(AmericanNationalStandardInstiute)和国际标准化组织ISO(InternationalStandardsOrganization)一起进行了标准化工作,并于1998年正式发布了C++语言的国际标准ISO/IEC:98-14882。业界软件商表示都支持C++编译器具备的标准,对不同程序进行扩展。C++设计方法的特点是面向对象,处于中型和大型的软件开发项目的首选之列,C++的优越性极多,从开发历时、经费得到充分体现,开发出来的软件可重用、可扩充、可维护并且可靠。值得一提的是,C++作为C语言的一个超集,其好处就是C代码不经改动就可用C++编译通过。3.2QT1991年奇趣科技推出QT软件,其实质是跨平台c++的AppDevelopFramework。它可以同时开发GUI程式和非GUI程式。它为APP开发者建立艺术级APP提供应该具备的功能。Qt扩展性强,允许进行对组件编程。可以说,Qt与XWindow的Motif,Openwin,GTK等图形界面库和Windows平台上的MFC,OWL,VCL,ATL是同类型产品。2008年时Nokia公司将奇趣科技“揽于麾下”,QT之后便服务于诺基亚。QtCreator是诺基亚把QT收归旗下后开发跨平台的IDE,意思是轻量级集成开发环境。此IDE能够跨平台运行,服务于Linux(32位及64位)、MacOSX和Windows等系统。官方的理念是,让QtCreator的相关工作者能够使用Qt这个应用程序框架高效地完成他们的开发工作为其减轻负担。3.3音乐播放原理人类用声音传递信息,用声音抒发情感,声音带给人们以美的享受和快乐,声音无处不在,听得到声音能让人感到生命的真实。时代在发展,科技的更新日日颠覆人们的认识,人们逐渐已不简单满足于物质生活的提高,进而对精神世界需求日益剧增。而音乐从古到今都是人们休闲娱乐的上佳之选,以作音乐为趣,以听音乐为乐。这就引发了问题,美妙的音乐是如何通过媒介播放的呢?科技的力量在这时显露无遗,其过程应该是要播放多媒体文件,计算机就把指令传递到声卡,声卡起到把媒体播放信息重新整合的作用,但要想播放效果好就要使用高质量的硬件设备。对于电脑声卡,使用Fm合成与波表合成可提高音效。Fm合成运用在旧时的isa声卡上,Fm是“频率调变”的意思,是以声音振荡的理论为基础的MIDI合成处理。此技术带有局限性,又因为这种声卡或显卡用的是廉价的芯片,体验的效果不如人意;不同的是波表和视频合成呈现出来的效果要大大好于Fm,且在电脑上被大量推广使用,各种不同的波表,声卡、显卡,以及解码软件充斥市场。对于数字音频编码来说,在编码方案和实现方式上具有差异,但基础的编码思路却差别不大。PCM音频信号存在于音频声道中的,处理时,要把PCM映射到频域中,即时遇到频域,这个过程用子带滤波器或变换滤波器组可以完成。区别是子带滤波器和变换滤波器组中的频率分辨率不一样。音频采样块位于声道中,需运用心里声学模型达到计算掩蔽门限值的目的,得到的掩蔽门限值可推算出,从公共比特池配给到这个声道中不同频率域内的比特数,或是否该引入频率范围内的量化噪声。这样经过编码的数据流就可以通过控制参数和辅助数据获得。对于音频解码来说,要把编码后的数据流作解码复用处理,接把音频数据作反量化,这一步要用到比特流中传输的控制参数。另一个方法是得到心里声学模型参数反向运算之后产生的音频信号,将其从频域反变换至时域,解码便完成了。时下主流的音频编码系统包括G.7xx、MPEG伴音系列和杜比音像系统。CCITT推出了最早的音频编码算法建议标准如G.711、G.721、G.723等。1995年,ITU-T批准了新的语音压缩标准G.729.该标准采用共轭结构代数码激励线性预测(CS-ACELP),可以仅用8kbit/s的带宽传输话音,而话音质量与32kbit/s的ADPCM相同,它被用于IP-phone技术中。第4章系统分析4.1系统实现目标本软件主要实现:音乐播放与暂停、歌词同步、创建音乐列表、播放上一首和下一首、调节音量、播放模式、添加删除歌曲、窗口的拖动、主流音频格式的播放支持等功能。播放器播放暂停歌词同步音乐列表上下切歌播放器播放暂停歌词同步音乐列表上下切歌调节音量播放模式添加删除窗口拖动理主流音频图4.1系统结构图音乐播放与暂停: 播放器界面应有一个按钮,当使用者点击时可以播放已选择的歌曲,再次点击该按钮暂停播放。歌词同步: 播放器播放音乐时,应该自动在本地查找有无歌词,有歌词的话就应显示歌词,并且歌词应与播放的音乐同步。创建音乐列表: 软件需创建一个播放列表,以供列表中歌曲根据指定模式自动播放。播放上一首和下一首: 播放器界面上应有上一首下一周的按钮,点击可以切换歌曲。调节音量: 按下相应的菜单或鼠标滚动实现音量调节。播放模式: 包括列表、单曲循环,随机、顺序播放。添加删除歌曲: 可以从本地添加歌曲到播放列表,也可以从列表删除指定歌曲。窗口的拖动: 点击播放器窗口可以自由拖动。主流音频格式的播放支持: 播放器应支持常见的歌曲格式如mp3、wav等。
第5章系统设计该软件要求功能齐全,界面美观,进行合格的软件开发,功能模块开发的是重中之重。5.1概要设计在系统需求分析过程中,不是两眼一抹黑,就是先要明确软件“做什么”的问题。之后我们要考虑的就是从软件是“做什么”的转变成是“怎么做”的概念,全力实现系统的需求。首先,我们需要描述的是系统的总的体系结构。5.2软件结构设计软件需要模块化这更是软件概要设计的重中之重。模块化可说是一个化整为零又从零到整的变换过程,开发是软件往往是复杂的,从整体上解决难度很大,所以要把其拆分成许多小的模块逐个解决,每个模块分工明确只需完成单个特殊功能,但不仅是单兵作战要通过纽带将这些模块串联,扭成一股绳,成为完整一个个体,发挥应有的作用。讲到划分模块,也有其独特的规则,不能想当然随意为之,要保证每个模块的独立性是硬性规定,才能达到简化复杂软件系统的目的,同时每个模块职责皆要不同,即子功能不同,又不能全封闭式要保留简单的接口,为最后的重新组合作准备,进而开发高可读性,可维护性的软件系统。软件的概要设计采用结构化设计,通过需求分析生成的数据流图,按部就班形象化成软件结构。开发软件就是要化繁为简,以小见大,逐步解决相关的问题,这次设计的音乐软件中,具备歌词显示、音乐播放、主界面、右键菜单等模块。然后,进一步细分模块,添加细节。5.3详细设计5.3.1歌曲列表显示歌曲列表显示本地可以播放的歌曲,可以隐藏也可以显示,如图。图5.1歌曲列表图 主要UI设计代码如下: 歌曲列表显示:<widgetclass="QTableWidget"name="tableWidget"><propertyname="geometry"><rect><x>310</x><y>30</y><width>201</width><height>271</height></rect></property><propertyname="autoFillBackground"><bool>true</bool></property><propertyname="styleSheet"><stringnotr="true">QHeaderView::section{background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0#616161,stop:0.5#505050,stop:0.6#434343,stop:1#656565);color:white;padding-left:4px;border:1pxsolid#6c6c6c;}QHeaderView::section:checked{background-color:red;}/*stylethesortindicator*/QHeaderView::down-arrow{image:url(down_arrow.png);}QHeaderView::up-arrow{image:url(up_arrow.png);}</string></property><propertyname="frameShape"><enum>QFrame::StyledPanel</enum></property><propertyname="horizontalScrollBarPolicy"><enum>Qt::ScrollBarAlwaysOff</enum></property><propertyname="editTriggers"><set>QAbstractItemView::NoEditTriggers</set></property><propertyname="alternatingRowColors"><bool>true</bool></property><propertyname="selectionMode"><enum>QAbstractItemView::SingleSelection</enum></property><propertyname="selectionBehavior"><enum>QAbstractItemView::SelectRows</enum></property><propertyname="gridStyle"><enum>Qt::DashLine</enum></property><column><propertyname="text"><string>歌曲</string></property></column><column><propertyname="text"><string>类型</string></property></column><column><propertyname="text"><string>Url</string></property></column></widget>5.3.2歌词同步功能歌词同步是播放器的重要功能,本播放器歌词可以在windows桌面上显示,也可以在播放器顶端显示,如图。图5.2歌曲列表图主要代码如下:classlrcWindow:publicQLabel{//Q_OBJECTpublic:lrcWindow(QWidget*parent);~lrcWindow();QAction*exit;voidsetTime(intnum){time=num;}voidsetLrcWidth();QTimer*timer;private:QPointdragPosition;inttime;qreallength;qreallrcWidth;protected:voidmousePressEvent(QMouseEvent*);voidmouseMoveEvent(QMouseEvent*);voidcontextMenuEvent(QContextMenuEvent*ev);voidpaintEvent(QPaintEvent*);privateslots:voidtimeout();};5.3.3播放控制本模块主要实现音乐的播放控制功能。如下图所示:图5.3歌曲列表图在这个界面,布局了几个控制按钮、滑动条、时间显示、歌词显示。主要设计代码如下:<widgetclass="QWidget"name="layoutWidget"><propertyname="geometry"><rect><x>22</x><y>272</y><width>281</width><height>31</height></rect></property><layoutclass="QHBoxLayout"name="horizontalLayout"><item><widgetclass="QToolButton"name="toolButton_Last"><propertyname="toolTip"></property><propertyname="text"><string>上一首</string></property></widget></item><item><widgetclass="QToolButton"name="toolButton_Play"><propertyname="toolTip"><propertyname="styleSheet"><stringnotr="true"/></property><propertyname="text"><string>播放</string></property><propertyname="icon"><iconsetresource="CoolYing.qrc"></widget></item><item><widgetclass="QToolButton"name="toolButton_Stop"><propertyname="text"><string>停止</string></property><propertyname="icon"><iconsetresource="CoolYing.qrc"></widget></item><item><widgetclass="QToolButton"name="toolButton_Next"><propertyname="toolTip"></widget></item><item><widgetclass="QSlider"name="horizontalSlider"></widget></item></layout></widget>5.4主要技术实现5.4.1播放类QMediaPlayer的使用QmediaPlayer是一个QT媒体播放类,本播放器使用它来完成播放功能。主要用到的函数如下:QmediaPlayer::play,作用是播放歌曲。实现使用者点击列表中的歌曲、播放按钮、点击上一首、下一首的功能。QmediaPlayer::pause,用来暂停一首音乐的播放。正在播放音乐时,点击播放按钮将调用此函数。QmediaPlayer::setVolume,用来设置音量,可以在右件菜单中点击控制音量。由于时间所限,暂未实现鼠标滚轮控制音量。QmediaPlayer::setPosition,用来定位播放,在滑动条上拖动可以定位歌曲播放位置。QmediaPlayer::setPlaylist,用来设置播放器的播放源。QmediaPlayer::positionChanged,播放位置发生变化时通知,主要用来同步歌词显示和滑动条。QmediaPlayer::durationChanged,播放歌曲发生变化时,歌曲播放时间长度也应该变化。创建QmediaPlayer代码如下: player=newQMediaPlayer; player->setPlaylist(playList); connect(player,SIGNAL(positionChanged(qint64)),this,SLOT(positionChanged(qint64)));connect(player,SIGNAL(durationChanged(qint64)),this,SLOT(durationChanged(qint64)));5.4.2播放列表QMediaPlaylistQmediaPlaylist用来组织播放内容,将需要播放的歌曲添加进去后,QmediaPlayer可以播放其中内容。主要用到的函数如下:QmediaPlaylist::setPlaybackMode用来设置播放模式,播放模式有循环、单曲、顺序、随机等。QmediaPlaylist::currentIndexChanged是一个信号函数,当播放列表中的正在播放的歌曲的下标更改时将会触发此信号函数。QmediaPlaylist::setCurrentIndex函数用来控制播放哪个歌曲。QmediaPlaylist::addMedia函数添加歌曲。添加歌曲的逻辑代码如下:voidMainWindow::importSongs(){QStringinitialName=QDir::homePath();QStringListpathList=QFileDialog::getOpenFileNames(this,tr("选择文件"),initialName,tr("audio(*.mp3*.wav)"));//"ImageFiles(*.jpg*.png)")for(inti=0;i<pathList.size();++i){QStringpath=QDir::toNativeSeparators(pathList.at(i));if(!path.isEmpty()){playList->addMedia(QUrl::fromLocalFile(path));QStringfileName=path.split("\\").last();intrownum=ui->tableWidget->rowCount();ui->tableWidget->insertRow(rownum);ui->tableWidget->setItem(rownum,0,newQTableWidgetItem(fileName.split(".").front()));ui->tableWidget->setItem(rownum,1,newQTableWidgetItem(fileName.split(".").last()));ui->tableWidget->setItem(rownum,2,newQTableWidgetItem(path));}}}5.4.3歌词显示此次音乐播放器,设计了一个类lrcWindow实现桌面歌词功能。并且,于播放器界面上设置一个按钮,可点击显示歌词。歌词需要在新的歌曲播放时加载,并根据播放位置的改变来进行加载。主要代码如下:显示当前播放时间: qint64temp=ui->horizontalSlider->maximum(); QTimetotalTime(0,(temp/60000)%60,(temp/1000)%60,time%1000); QTimecurTime(0,(time/60000)%60,(time/1000)%60,time%1000);ui->label_time->setText(tr("%1/%2").arg(curTime.toString("mm:ss")).arg(totalTime.toString("mm:ss"))); ui->label_time->update(); /**歌词的更新显示**/QStringstrTime=curTime.toString("mm:ss.zzz").left(8);歌词查找与显示: QStringstr=ui->textEdit->textCursor().block().text().replace(QRegExp("\\[\\d{2}:\\d{2}\\.\\d{2}\\]"),"");ui->label_lrc->setText(str);lrcWnd->setText(str);lrcWnd->setLrcWidth();//设置用于遮罩label的宽度为0lrcWnd->show();QTimett=curTime;intb=1;intc=0;text->setText(ui->textEdit->document()->toPlainText());boolover=ui->textEdit->textCursor().block().next().text().isEmpty();while(!over&&!text->find(tt.addMSecs(b*100).toString("mm:ss.zzz").left(7))){b++;c++;}while(over&&!text->find(tt.addMSecs(b*100).toString("mm:ss.zzz").left(7),QTextDocument::FindBackward)){b++;c++;break;}lrcWnd->timer->start(c);第6章测试6.1程序调试在设计软件时,出错是在所难免的,有些错误是显性错误,即是语句语法错误,遇到这些错误时,程序在测试运行时会自动予以提示,程序员可自行改正,可是还有些错误是隐性错误,即逻辑错误,遇到这些错误,程序往往无法自行检测出来,会正常运行但结果错误,所以这些隐性错误检测起来十分费事,这就要求程序员细心谨慎去检查代码。6.2程序的测试6.2.1测试的重要性及目的(1)测试的重要性对于软件的测试,不应该仅仅局限于产品使用之前,正确的观点是从软件开始诞生到结束寿命都应该将测试贯穿其中。但值得一提的是早前的测试起到把舵的重要地位,把即将发生的错误及时扭正,否则在错误的道路下,一直开发下去,最后导致的必然结果就是,耗费更大的人力物力精力,去修改之前的错误,这样是得不偿失的,所以着重于早期测试是科学正确合理的决定,但后续的测试也要跟进,不能荒废,要勤俭勤测,养成良好的开发习惯,这样会大大提高软件开发的进度与质量。大量的事实证明,无论拥有多优秀的程序员,多优秀的软件,在开发过程中一定会遇到错误,这些有利因素有可能会大大减少错误的出现,但绝不可能做到滴水不漏、完美无缺,这时测试的作用将会体现出来,测试是开发过程中不可或缺的一环,对软件的测试在实际开发工作中不论是在开发时间还是开发经费上一直占有很大的比重,就算为达节省成本的目的,在前期节省了许多测试工作,但一出现问题进行维护的时候,一样要进行测试本质并没有达到该有的目的,所以把测试工作贯穿整个软件生命周期中,是必然的选择。但软件测试由于它本身的困难繁琐使得很多人不愿意去做这些事,长期抱有侥幸的心里,但往往偷懒会耽误大事,没有好的态度,没有正确的认识就不能更好的完成自己的本职工作,错误的观点大致包括以下几种:①测试出错误后无法取得成就感;②检测自己的错误是在否定自己的工作,选择不了了之;③测试工作索然无味,提不起兴趣;④测试工作是艰苦而细致的工作;⑤盲目自大,过于相信自己的能力,如果检出错误,介意别人的眼光。以上观点都是极端且错误的,谨慎小心,戒骄戒躁能让人的能力得到逐步的提升,只有打消错误观点,人才会进步,同时个人的发展与软件的未来息息相关。(2)测试的目的如果测试的目的是为了尽可能多地找出错误,那么测试就应该直接针对软件比较复杂的部分或是以前出错比较多的位置。①软件测试是为了发现错误而执行程序的过程;②测试是为了证明程序有错,而不是证明程序无错误;③一个好的测试用例是在于它能发现至今未发现的错误;④一个成功的测试是发现了至今未发现的错误的测试。遇到错误时一定要去仔细查找的,但不能为了找错误而找错误,测试是一个良好习惯的养成,是科学开发软件的必然经过的过程,通过大量的测试可以查找使用者使用软件的不足之处,量变之后会有质变的飞跃,对于改进开发者的开发策略,弥补软件自身的不足具有十分显著的作用,通过测试产生的实质价值远远超过测试本身,所有的方法都是前人经验的总结,遵照科学有效的方法往往让开发事半功倍。6.2.2测试的步骤与开发过程类似,测试过程也必须分步骤进行,每个步骤在逻辑上是前一个步骤的继续。大型软件系统通常由若干个子系统组成,每个子系统又由若干个模块组成。因此,大型软件系统的测试基本上由下述几个步骤组成:(1)模块测试在这个测试步骤中所发现的往往是编码和详细设计的错误。(2)系统测试在这个测试步骤中发现的往往是软件设计中的错误,也可能发现需求说明中的错误。(3)验收测试在这个测试步骤中发现的往往是系统需求说明书中的错误。6.2.3测试的主要内容要确保高质量测试,要把测试分成五个步骤,包括:代码审查、单元测试、集成测试、确认测试和系统测试。(1)单元测试单元测试是指以最小模块为检查对象,运用测试的方法调查需求功能与实际实现的功能是否一致,顺便查找编码上的漏洞(2)集成测试集成测试是将模块按照设计要求组装起来同时进行测试,主要目标是发现与接口有关的问题。如一个模块与另一个模块可能有由于疏忽的问题而造成有害影响;把子功能组合起来可能不产生预期的主功能;个别看起来是可以接受的误差可能积累到不能接受的程度;全程数据结构可能有错误等。(3)确认测试确认测试的目的是向未来的使用者表明系统能够像预定要求那样工作。经集成测试后,已经按照设计把所有的模块组装成一个完整的软件系统,接口错误也已经基本排除了,接着就应该进一步验证软件的有效性,这就是确认测试的任务,即软件的功能和性能如同使用者所合理期待的那样。(4)系统测试软件开发工作进入尾声,必须还要整体进行测试,即系统测试,与其他模块的功能一起运作看是否正常,常用测试的项目有恢复测试、安全测试、强度测试和性能测试等。单独对系统的测试主要从以下几方面入手:①功能测试:测试的结果是不是按照需求分析出来的功能进行了开发,符不符合使用者的要求。功能测试在系统测试中是基本的必要进行的测试,通常还会通过正规的软件说明书当做测试的标准。②强度测试及性能测试:为了测试软件在极端条件下的实际运行情况,而进行的模拟测试,以便解决一些隐患问题的存在。③安全测试:查验安装在系统内的保护机构是否能够对系统进行保护,使之不受各种非常的干扰。针对本系统主要是对权限系统的测试和对无效数据、错数据、和非法数据干扰的能力的测试。6.3本程序的测试情况6.3.1主要测试用例测试用例1:添加音乐到列表过程描述:右键点击播放器上的显示歌曲列表按钮,于歌曲列表中点击右键选择添加歌曲,从文件夹选择歌曲。预期结果:歌曲列表中显示被添加的歌曲。测试用例2:播放音乐过程描述:点击歌曲列表中的歌曲,点击播放按钮,点击上一首,点击下一首,拖动滑动条。预期结果:能播放歌曲测试用例3:查看歌词过程描述:播放音乐,并查看歌词显示是否正确预期结果:显示正确的歌词。其他用列略。6.3.2测试用例的实施针对上述用例分别进行实施,并记录各种问题,经测试,发现歌词显示有问题有时不能显示出正确的歌词,经研究发现是因为QMediaPlayer::positionChanged被调用的时间间隔太长导致的,经过改进歌词能正确显示了。通过以上步骤测试软件,得出该播放器主要功能可运行,测试结束。结束语在进行毕业设计这段日子里,挑战与进步共存,不仅检验了四年的所见所学,也让我有机会可以把相关专业知识综合的去实战中训练,去提升。同时我也感受到开发一个软件是一个工程,需要仔细的分析和设计,并严谨的实现和测试。在设计的过程中,我利用所学到的C++编程知识进行毕设的开发,不仅巩固了这段期间的C++知识,也更加体会到了C++这种语言的魅力,和它具有的广泛的应用性,其实设计的过程就像是模拟了真实的工作情况,许多难题来的时候不在慌乱,而是勤动手动脑动嘴,去尽力解决,这是一个培养个人的自学能力的好机会;在实在没有办法的情况下,我会去向老师求教,老师给予我很大的帮助与启迪,老师的每次点拨都有使我拨开云雾见月明的感觉。在以往我们学习的时候没有整体设计的概念,仅仅设计单个模块或简单的小系统,而这一次却是不一样的,毕业设计的目的就是将所学知识规整为一个体系来设计实用的播放器软件。开发一个合格的播放器软件,为此需要我们付出辛劳与汗水。我常常在设计中遇到一些难题不知该怎么解决,但是令人高兴的是很多同学都伸出了援助之手。毕设就是实战,学习千日用在一时,抓住每一个机会锻炼自己,不断提高自我的编程能力和编程思维,无论是为以后的就业还是生活都是非常好的事情。参考文献[1]赵辉,叶子青.《VisualStudio2005系统开发实例精粹》.人民邮电出版社,2007年1月:45-67[2]DaielSolin《24小时学通QT编程》机械工业出版社,2000年1月:21-48[3]JasminBlanchetteAndMarkSummerfield.《C++GUIProgram-mingwithQT4》电子工业出版社,2008年6月:70-210[4]陆文周.《Qt5开发及实例》.电子工业出版社,2014年1月:30-110[5]张波.《Qt中的C++技术》.电子工业出版社,2012年7月:55-89[6]StanleyB.Lippman,JoséeLajoie,BarbaraE.Moo.《C++Primer》.电子工业出版社,2013年9月:32-260[7]AndrewKoenig.《C和C++经典著作:C陷阱与缺陷》.人民邮电出版社,2008年2月:21-65[8]孙涌.《现代软件工程》.北京希望电子出版社,2003年8月:30-246[9]ScottMeyers.《EffectiveC++》.电子工业出版社,2011年1月:3-160[10]BruceEckel,ChuckAllison.《C++编程思想》.机械工业出版社,2011年7月:53-168致谢在本次毕业设计过程中,得到了指导老师的指导与支持。在总体结构、功能的把握上给予了非常大的帮助,同时根我们提供了非常优越的设计环境,并对我在编程设计的细节工作上给予了耐心的指导,对于我顺利完成这次毕业设计起到了关键性的作用。另外和我同学们大家始终共同学习共同进步,努力拼搏,增强了我的团队意识,并且我们接下了深厚的友谊,我们自始至终在一种愉快的气氛中学习工作。此次毕业设计对提高我的编程技术、协调团队成员的关系等方面都由许多益处。在此我一并向他表示感谢。我还要感谢我的母校——太原科技大学,以及在大学四年生活中给予我关心和帮助的老师和同学,是他们教会了我专业的知识和做人的道理。通过这次毕业设计我还明白了作为一名通信专业的大学毕业生,我们要会的不仅仅是编写代码,更重要的是要有整体把握系统设计的能力。我会在以后的工作和学习中不断完善自己,为我最热爱的母校争光,为自己翻开辉煌的新篇章。转眼间,大学生活即将结束,回首过去四年的大学生活,真是有苦也有乐,然而更多的则是收获,感谢母校的各位老师不但无私地传授给我们知识,也教会了我们如何做人。通信工程专业的毕业设计任务繁重,但正是在这几个月紧张而充实的设计中,我感到自己的知识得到了一次升华,我相信:我的毕业设计会给我的四年大学画上一个圆满的句号。21世纪已经到来了,在新的世纪里,人们自然对未来有许多美好的愿望和设想。现代科学技术的飞速发展,改变了世界,也改变了世界的生活。作为新世纪的大学生,应当站在世界的发展前列,掌握现代科学技术知识,调整自己的知识结构和能力结构,以适应社会发展的要求。新世纪需要具有丰富现代科学知识、能够独立解决面临任务、有创新意识的新型人才。附录主要代码#include<QtWidgets>#include<QMediaPlayer>#include<QMediaPlaylist>#include<QVideoWidget>#include"mainwindow.h"#include"ui_mainwindow.h"#include"lrcwindow.h"MainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(newUi::MainWindow){ui->setupUi(this);setWindowFlags(Qt::FramelessWindowHint);setAttribute(Qt::WA_TranslucentBackground);ui->horizontalSlider->setRange(0,0);ui->tableWidget->hide();ui->tableWidget->hideColumn(2);volume=80;createContextMenu();createSystemTrayIcon();playList=newQMediaPlaylist;playList->setPlaybackMode(QMediaPlaylist::Loop);player=newQMediaPlayer;player->setPlaylist(playList);player->setVolume(volume);lrcWnd=newlrcWindow(0);text=newQTextEdit(this);text->hide();//用于查找下句歌词以计算时间间隔ui->textEdit->setVisible(false);//文本编辑框不可见,(解析歌词)connect(ui->horizontalSlider,SIGNAL(sliderMoved(int)),this,SLOT(setPosition(int)));connect(ui->tableWidget,SIGNAL(cellClicked(int,int)),this,SLOT(playTo(int,int)));connect(player,SIGNAL(positionChanged(qint64)),this,SLOT(positionChanged(qint64)));connect(player,SIGNAL(durationChanged(qint64)),this,SLOT(durationChanged(qint64)));//connect(playList,SIGNAL(currentIndexChanged(int)),this,SLOT(currentIndexChanged(int)));connect(playList,SIGNAL(currentIndexChanged(int)),this,SLOT(updateSongList(int)));connect(ui->action_SongList,SIGNAL(triggered()),this,SLOT(showOrHideSongList()));connect(ui->action_Import,SIGNAL(triggered()),this,SLOT(importSongs()));connect(ui->action_Last,SIGNAL(triggered()),this,SLOT(playLast()));connect(ui->action_Play,SIGNAL(triggered()),this,SLOT(playOrPause()));connect(ui->action_Stop,SIGNAL(triggered()),player,SLOT(stop()));connect(ui->action_Next,SIGNAL(triggered()),this,SLOT(playNext()));connect(ui->action_SoundPlus,SIGNAL(triggered()),this,SLOT(plusSound()));connect(ui->action_SoundReduce,SIGNAL(triggered()),this,SLOT(reduceSound()));connect(ui->action_Mode1,SIGNAL(triggered()),this,SLOT(setPlaybackMode1()));connect(ui->action_Mode2,SIGNAL(triggered()),this,SLOT(setPlaybackMode2()));connect(ui->action_Mode3,SIGNAL(triggered()),this,SLOT(setPlaybackMode3()));connect(ui->action_Mode4,SIGNAL(triggered()),this,SLOT(setPlaybackMode4()));connect(ui->action_Support,SIGNAL(triggered()),this,SLOT(support()));connect(ui->action_About,SIGNAL(triggered()),this,SLOT(aboutUs()));connect(ui->action_Quit,SIGNAL(triggered()),this,SLOT(close()));connect(ui->toolButton_Last,SIGNAL(clicked()),this,SLOT(playLast()));connect(ui->toolButton_Play,SIGNAL(clicked()),this,SLOT(playOrPause()));connect(ui->toolButton_Stop,SIGNAL(clicked()),player,SLOT(stop()));connect(ui->toolButton_Next,SIGNAL(clicked()),this,SLOT(playNext()));}MainWindow::~MainWindow(){deleteui;}voidMainWindow::createContextMenu(){seperatorAction1=newQAction(this);seperatorAction1->setSeparator(true);seperatorAction2=newQAction(this);seperatorAction2->setSeparator(true);seperatorAction3=newQAction(this);seperatorAction3->setSeparator(true);seperatorAction4=newQAction(this);seperatorAction4->setSeparator(true);seperatorAction5=newQAction(this);seperatorAction5->setSeparator(true);addAction(ui->action_SongList);addAction(ui->action_Import);addAction(seperatorAction1);addAction(ui->action_Last);addAction(ui->action_Play);addAction(ui->action_Stop);addAction(ui->action_Next);addAction(seperatorAction2);addAction(ui->action_Mode1);addAction(ui->action_Mode2);addAction(ui->action_Mode3);addAction(ui->action_Mode4);addAction(seperatorAction3);addAction(ui->action_SoundPlus);addAction(ui->action_SoundReduce);addAction(seperatorAction4);addAction(ui->action_Support);addAction(ui->action_About);addAction(seperatorAction5);addAction(ui->action_Quit);setContextMenuPolicy(Qt::ActionsContextMenu);}voidMainWindow::createSystemTrayIcon(){trayIcon=newQSystemTrayIcon(this);trayIcon->setIcon(QIcon(tr(":/new/background/images/icon.ico")));trayIcon->setToolTip(tr("乐响音符-音乐播放器"));restoreAction=newQAction(tr("打开主面板"),this);connect(restoreAction,SIGNAL(triggered()),this,SLOT(show()));quitAction=newQAction(tr("退出"),this);connect(quitAction,SIGNAL(triggered()),qApp,SLOT(quit()));trayContextMenu=newQMenu(this);trayContextMenu->addAction(ui->action_SongList);trayContextMenu->addAction(ui->action_Import);trayContextMenu->addSeparator();trayContextMenu->addAction(ui->action_Last);trayContextMenu->addAction(ui->action_Play);trayContextMenu->addAction(ui->action_Stop);trayContextMenu->addAction(ui->action_Next);trayContextMenu->addSeparator();trayContextMenu->addAction(ui->action_Mode1);trayContextMenu->addAction(ui->action_Mode2);trayContextMenu->addAction(ui->action_Mode3);trayContextMenu->addAction(ui->action_Mode4);trayContextMenu->addSeparator();trayContextMenu->addAction(ui->action_SoundPlus);trayContextMenu->addAction(ui->action_SoundReduce);trayContextMenu->addSeparator();trayContextMenu->addAction(ui->action_Support);trayContextMenu->addAction(ui->action_About);trayContextMenu->addSeparator();trayContextMenu->addAction(restoreAction);trayContextMenu->addAction(quitAction);trayIcon->setContextMenu(trayContextMenu);trayIcon->show();connect(trayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),\this,SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));}voidMainWindow::iconActivated(QSystemTrayIcon::ActivationReasonreason){switch(reason){caseQSystemTrayIcon::DoubleClick:caseQSystemTrayIcon::Trigger:if(this->isVisible()==true){;}else{this->show();this->activateWindow();}break;default:break;}}voidMainWindow::closeEvent(QCloseEvent*event){if(trayIcon->isVisible()){hide();trayIcon->showMessage(tr("提示"),tr("酷音听听将在后台运行"));event->ignore();}else{event->accept();}}voidMainWindow::mousePressEvent(QMouseEvent*event){if(event->button()==Qt::LeftButton){dragPos=event->globalPos()-frameGeometry().topLeft();event->accept();}}voidMainWindow::mouseMoveEvent(QMouseEvent*event){if(event->buttons()&Qt::LeftButton){move(event->globalPos()-dragPos);event->accept();}}voidMainWindow::positionChanged(qint64position){ui->horizontalSlider->setValue(position);showTime(position);}voidMainWindow::durationChanged(qint64duration){ui->horizontalSlider->setRange(0,duration);}voidMainWindow::currentI
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025工程(手机维修)合同
- 2026年小区装修垃圾清运管理注意事项
- 2026年全国硕士研究生招生考试政治真题及答案解析
- 2025年执业药师中药学专业知识二历年真题汇编
- 生产不良品处理管理规定
- 塔吊安装拆卸监理细则
- 健身房管理层岗位职责说明
- 下穿通道排水及防渗工程监理规划
- 形如绝对值x+1小于1不等式解集计算详细步骤解析D6
- 南京市教师招聘考试题库及答案
- 2025造价咨询劳务(分包)合同
- 2026年上海市浦东新区初三下学期二模数学试卷和答案
- 2026年网络安全全景防护与实践培训
- 三方代收代付协议模板
- 石油天然气风险勘探目标评价规范
- 新版中国食物成分表
- 路灯基础现浇混凝土检验批质量验收记录
- 合并多支病变的CTO介入治疗
- 《浙江省建筑垃圾资源化利用技术导则》
- 护理患者的排泄管理
- 上海市临检中心 基因扩增实验室常见仪器设备的使用和维护
评论
0/150
提交评论