3 软件结构及界面设计
3.1软件结构设计
软件人员要开发出一款成功的软件,其不仅要求功能完善,而且还要界面友好、美观。因此,对于一个成功的软件设计,功能模块的设计是关键。在软件的需求分析阶段,搞清楚了软件“做什么”的问题,从而形成目标软件的逻辑模型。而现在我们要做的是如何把逻辑模型转化为物理模型,着手实现软件的需求,描述系统的总体结构。
软件的设计最主要的是软件的模块化,这样能减少软件的复杂程度以及出错的机会。而我使用的编程语言是C++,这本来是面向对象的语言,面向对象编程从面向对象设计开始,而面向对象设计从抽象开始。抽象建立了一种抽象数据类型,C++使用类这个特性来实现它[8]。C++的核心概念是类[9],其重要的特征还是类[10]。而本文设计的播放器所使用的正是phonon库中的相关类。自顶向下将软件系统划分为若干子模块。每个模块只完成某一个特定的功能,而组后各个模块拼接成一个整体,从而达到整个系统设计的要求。
将播放器系统划分为多个子模块是为了降低其开发的复杂度,而且还能提高软件的可读性、可维护性,从而使得各个模块之间应尽可能独立。做到各个模块高内聚,低耦合,从而为设计高质量的软件结构奠定基础。
音乐播放器
主界面 添加文件 播放列表 播放、暂停 上一曲下一曲 音量控制 歌词 图3音乐播放器系统模块图
3.2、GUI界面设计
播放器的GUI界面设计主要是两个方面的设计:主界面布局设计和按钮的代码设计。在这其中,主界面的布局非常重要,因为如今的用户都非常注重软件界面的美观性,软件界面的美观在很大程度上影响着产品受用户欢迎的程度以及
7
其盈利性。比方说,苹果公司的产品之所以在全世界这么受欢迎,一部分原因就是其界面效果的美观大方。同时,如今很多的软件由于其漂亮的界面,而大受用户喜爱,因此,为了紧紧的抓住用户的心,在一些软件的开发过程中,项目组有一些专门的美工来美化软件的界面。在本次设计的过程中,各个GUI部件的功能图如图4所示。
主 界 面 打开文件 播放 歌词显示 播放列表 打开文件 音量控制 播放暂停 停止 上一曲 下一曲 显示歌词 显示列表 图4 播放器各GUI部件功能图
GUI界面的整体布局按照个人习惯,结合一定的美感,设计出来的。虽说不是显得很大气,不过也还算是眼前一亮。基本功能键全部安排在主界面,播放器GUI整体界面效果图如图5所示。
图5播放器GUI界面效果图
8
按钮的代码设计是指按钮功能的代码实现,在本次设计的“音乐播放器”中,由于按钮功能是软件的控制台,播放、暂停、上一曲、下一曲、停止、歌词显示、播放列表显示、音量调节、添加播放文件都需通过按钮,所以,按钮功能也是一个非常需要注意的地方。本次设计主要采用QT中信号与槽机制,及通过发送信号,来进入到相关的处理步骤中,完成播放器的功能。由于软件的开发使用的语言是C++,C++是具有良好的面向对象编程功能的语言,其强大的类的机制,结合QT中的信号与槽机制,实现通信。从而降低了本款软件的开发难度。也减少了软件开发过程中出错的机率。
9
4 详细设计
整个设计的核心主要借助KDE中的PHONON库。而phonon的架构主要是以下三个部分:
1)media object其主要用来管理多媒体来源,提供基本的播放控制 2)sinks多媒体输出,接受media object来的数据,并接受其控制播放,而由sink来处理这些多媒体
3)paths用来连接media object与sink。 4.1 主界面设计
播放器打开后,首先用户接触的是播放器的主体界面,以下是界面的具体代码实现:
//设置窗口基本属性
setWindowTitle(tr(\音乐播放器\
setWindowIcon(QIcon(\从资源文件中招图标 setMinimumSize(400, 200);
setMaximumSize(400, 200);//最大最小设置为一样,代表不改变播放器 窗口的大小
//创建媒体对象
media_object = new Phonon::MediaObject(this); Phonon::AudioOutput *audio_output = new
Phonon::AudioOutput(Phonon::MusicCategory, this);
Phonon::createPath(media_object, audio_output);//绑定源和接收器
//关联媒体对象的tick信号来更新播放时间的显示 connect(media_object, SIGNAL(tick(qint64)), this,
SLOT(UpdateTime(qint64))); //创建顶部标签
top_label = new QLabel(tr(\
href=\\\ http://weibo.com/u/3010837085?topnav=1&wvr=5\
top_label->setTextFormat(QT::RichText);
top_label->setOpenExternalLinks(true);//运行点击进入外部链接 top_label->setAlignment(QT::AlignCenter);
10
//创建控制播放进度的滑块
Phonon::SeekSlider *seek_slider = new Phonon::SeekSlider(media_object,
this);
//设置显示时间的标签
QToolBar *widget_bar = new QToolBar(this); time_label = new QLabel(tr(\ time_label->setToolTip(tr(\当前时间/总时间\ time_label->setAlignment(QT::AlignCenter);
//QSizePolicy类是描述水平和垂直修改大小策略的一种属性
time_label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);// 平方向上尺寸可扩展,水平方向已固定 //播放列表开启控制图标
PLAction = new QAction(tr(\
PLAction->setShortcut(QKeySequence(\设置开启播放列表的快 捷键为F4
PLAction->setToolTip(tr(\播放列表(F4)\
connect(PLAction, SIGNAL(triggered()), this, SLOT(SetPlayListShown()));//链接触发信号
//桌面歌词显示开启控制图标
LRCAction = new QAction(tr(\
LRCAction->setShortcut(QKeySequence(\设置开启桌面歌词的快 键为F2
LRCAction->setToolTip(tr(\桌面歌词(F2)\
connect(LRCAction, SIGNAL(triggered()), this, SLOT(SetLrcShown())); //将上面2个action和1个widget添加到工具栏,默认的添加方式为水 平方向添加
widget_bar->addAction(PLAction); widget_bar->addSeparator(); widget_bar->addWidget(time_label); widget_bar->addSeparator(); widget_bar->addAction(LRCAction); widget_bar->addSeparator(); ????
QLabel *label = new QLabel(this);
捷水
11