计算机毕业论文基于qt的嵌入式网络浏览器设计内容摘要:

是一款强大的音乐播放器, Mplayer 是款强大的媒体播放器,可以作为 Qt 进程来实现一些功能,例如作为网页中嵌入的音频视频输出程序调用。 mpg123 能播放大部分常用格式音乐 如 mp wav 等, Mplayer 可播放 flv、 mpeg mpeg avi等格式视频,遗憾的是由于嵌入式系统限制不能播放 swf 和 rmvb。 Qt 的熟悉 由于大学期间未曾学过嵌入式系统编程用的语言,也未系统学过 C++,但是本人有 C 语言 [17]以及其他语言的基础,因此首先要摸清 Qt 程序的编写原理。 一、创建控件 图 11 Qtopia 的界面 吉林大学学士学位论文 6 图 11 为 Qtopia 的运行界面, 与 C++[23]、 VB 不同的是 Qt 创建完窗口就得重新编译出能实现窗体的源码,每次修改都要重新编译比较复杂,因此我采用直 接在 vi 下书写程序,在 Qt 模拟测试平台上观察结果。 首先是放置测试用控件如主窗体、输入文本框、标签、触发按钮等 [8]。 主窗体:主要作为其他控件的容器。 子窗体:显示一个网页的全部信息,随网页建立而建立。 这样存放便于使用后退、前进等功能。 输入文本框:主要作为测试,向主窗体发送一些自定义字符串,或者显示一些信息。 标签:作为显示测试,用途同上。 触发按钮:作为各个分功能的测试开关,点击后能实现在指定位置显示字符、图片等作用。 二、文本输出测试 起初有使用 textbrowser 进行直接 html 解析转换显示,但是 发现 的textbrowser 的能力有限,超链接等都显示为空白,还有一个换行符在文本框的末尾无法消除,因此放弃该想法。 转想用 textbrowser 来显示文本,想一些其他的方式显示超链接。 然而, textbrowser 对背景色支持极不方便,需要设置许多位置,而且还会影响到字体的颜色。 更不支持背景图片 [16]。 接着又发现,textbrowser 的滚动条有严重的缺陷。 滚动之后窗口的鼠标移动数值范围是不变的。 例如: 480x360 的主窗体在右滚动 100 单位之后,鼠标移动范围数值由 0480变为 100580,而 textbrowser 的滚动条则是无论滚动多少都是在 0480 范围 [11]。 这对超级链接位置的设置有重大阻碍,因此完全放弃用 text 控件。 改在子窗体上用画板进行文本输出。 这样会有一个缺点,就是鼠标拖拽选择文本功能暂时丧失(应该可以靠程序来补足,暂时不考虑这方面),然而却获得了背景色、图片的支持、以及滚动条的支持,对于当前“光标”位置的判定虽然比 text 控件要困难一些,不过仅仅只是算术上的困难,能够克服。 三、超链接的设计实现 超链接作为 web 浏览器的一大特色是不能忽视的,因此必须实现它。 在网络上找了几个资料 ,有人认为可以用改为平板型的按钮实现超链接,也有人用label 控件实现超链 [14],这些方法都不错,但是按钮按下时有 3D 效果,使用 label控件不利于背景的透明处理,因此,我决定写一个继承 QRect 控件的新类吉林大学学士学位论文 7 HyperLink,用于确定一个超链接范围,类中添加超链文本、超链颜色设置以及一些必要的范围设置与判定函数。 当超链文本在主窗口中创建的时候,同时创建一个 HyperLink 类覆盖文本区域并等待鼠标事件,点击后发送信号激活槽,槽中对 link 的功能(跳转、新开页面)进行判定实现。 超链接区域类 HyperLink 的存储方式应该是链表方式,对于每个 HyperLink类要实现的功能应该由 HyperLink 类自己进行设置,由一个 while 循环判断是哪一个 HyperLink 执行,读出功能属性(跳转、开窗口)再用 case 语句选择功能。 再者,文字和图片的 HyperLink 类应该用一个属性区分开,便于实现超链文本点击后变色的功能。 关于跳转功能,需要再添加个类似于超链的一个“落点”( LandPlace 类,用于存储一些关于落点的属性,当点击超链接发送跳转信号时,查找落点的位置信息。 四、熟悉 Qt 的准备工作 显示一段文字:利用画笔 的 drawText 功能,在当前的光标位置画上文字。 显示一张图片,利用画笔的 drawPixmap 功能,在当前光标位置画图片。 涂改,画笔的 eraseRect 功能,清除一个区域的内容。 刷新,如果只用画笔往窗体上画,那么一旦窗体被其他程序的窗体覆盖之后,所有显示内容都会消失,所以必须重载 paintEvent,使之以一定的速度刷新。 创建一个窗口超链:先用画笔显示一段加下划线改变颜色的文字(或图片),再创建 HyperLink 类,设置其功能为“窗口超链”。 五、 自定义类: HyperLink( x,y,w,h,name,linktext,endl)超链接类,用重载函数定义为两种超链接 —— 文字链接与图片链接,用 bool ispicture 来进行区分。 同时为除错,添加一个 bool endlink 来声明链表尾结点。 除错分析见(六)中超链接激活内相关内容。 LandPlace( x,y,w,h,name,endp)超链接落点类,同样为除错添加 bool endland 来声明链表尾结点,虽然理论上只需要定位两个参量 x, y,但是因为其链接继承于 QRect,且 w、 h 属性便于输入光标定位,因此保留。 在熟悉过主要需要的功能以后,下一章开始对 本浏览器的各模块加以实现。 吉林大学学士学位论文 8 第二章 主要部分功能模块的实现 本章内容为实现各部分主体功能模块,章节末尾附分模块的简单测试过程。 功能实现的基本方法和全局函数的说明 文字的输出 采用图文环绕的方式,图片后输出文字的方式在之后图片解析中给出。 此处给出一个有关的参数 nexttextplace,用于记录输出文字的位置(上、中、下)行间距默认为 5个像素,文字、图片边框的颜色默认为黑色,链接颜色默认为蓝色,点击后的链接颜色默认为紫色。 为某些居中、居右显示字串的要求考虑,提供一个 bool 变量 placeset,以及参数 nexttext,用于记录当前输入文字的位置(左、中、右)。 默认字体为 times,大小为 12,背景图片为空,最大字符高度maxweight 为当前行字符中最高的一个。 菜单与菜单功能的实现 由于主窗体的滚动条不能改变长度的限制,因此采用可隐现菜单的方式,制作一个菜单条,上有后退、前进、刷新、转到 4 个按键,以及 1 个 URL 输入框、 1 个电影栏存放该页面内视频的清单。 图 21 隐现菜单的效果 后退、前进、刷新、转到四个按键和文本录入框的实现与功能实现:每个打开的窗口拥有双向链表结 构,指向前一个窗口和后一个窗口。 为了实现这些功能在窗口类 mywidget 中添加了两个变量 URL 和 tpm,一个用于记录当前的页面,另一个用于记录当前页面的 URL,同时利用窗口类自带的 caption 属性来记录主窗体当前的标题。 在点击这四个按钮时,可以做出相应的变化。 “转到”实际上就是新建窗口。 新建窗口时,先按链表的顺序找到能前进的最终结点,然后顺序把这些结点释放,再创建新的结点,关闭前进按钮。 激吉林大学学士学位论文 9 活后退按钮。 在图 21 里用英文表示为 open。 “后退”功能只需要把主窗体的指针指向其后一个窗体即可,首先保存页面信 息,再把页面隐藏,改变指针后显示窗体即可。 在图 21 里用英文表示为backward。 “前进”功能与后退类似。 在图 21 里用英文表示为 forward。 “刷新”功能就是重新解析一遍本页面的 Html 脚本。 在图 21 里用英文表示为 reload。 这几个按钮和文本框集中在一个菜单窗口上,无法固定在窗体中,因为会影响滚动与观看页面。 因此将其做成可隐藏小窗体,用左上角一个小按钮来控制隐现。 小按钮的位置只占据在页边距空间上,因此对浏览网页基本不造成任何影响。 主要功能的实现程序在后面的函数中解释。 视频菜单 的实现 由于使用的是外部程序 mplayer,其不支持把视频嵌入到 Qt 窗口中,因此只能折中考虑,将当前窗口内能播放的视频文件放入一个下拉菜单中,用鼠标选取播放。 再者,由于移植的版本较低,没有完善的交互功能,能做到的只有播放、停止。 通过读取输入输出信息能得到文件的长度等信息。 如图 22 图 22 视频菜单 两个功能基本描述如下;在视频开始播放以后,画面停止刷新,并等待鼠标点击响应,点击后可以暂停视频,重新开始刷新画面,出现视频菜单。 点击暂停视频的响应槽: showbar()显示视频菜单,开始刷新。 继续播放 mediastart():隐藏视频菜单,停止刷新画面继续播放视频。 吉林大学学士学位论文 10 停止播放 mediastop():隐藏视频菜单,开始刷新画面,显示主菜单。 这三个函数比较简单,不在下一节解释。 初写各部分功能模块 emitword( int x,int y,QString emittext) : 输出文字信息的模块 输出文本的函数是必不可少的,参数中, x、 y 输入光标位置, emittext 就是输入的字符串,方便其他组件调用。 由于看见各类浏览器在添加超长的字串或超链时是自动拉长窗口大小,但是在本浏览器设计初期窗 口大小因为背景需要重画等问题,后来打算不使用这种方式。 改为使用自动换行功能。 该处的难点在于如何判断在何处需要换行。 这个难点的困难之处在于,每个字母占用的“宽度”是不一样的 [21]。 虽然有 QFontInfo 类来统计一串字符的宽度,但毕竟不能靠宽度 /每个字符的宽度来获得该段字符的字数。 因此,设计时考虑使用逐次折半法,即先将要输出的整个字符串与当前行余下的空白处宽度对比,如果小,则直接输出,如果大,则把字串折半,再进行对比,如果小,则把剩下的那部分折半,无法再折半的时候,输出,把剩下的字符串刷写到原来字符串中,再 开始用折半法输出。 如此周而复始就可以正确的输出所有的文字。 createlink( int x,int y,QString linktext,QString landtext,bool islink):超链接的创建 主要属性为方形的位置,链接显示内容、链接跳转文字,是否是链接(还是跳转),宽高可以靠 fm对 linktext 取宽高值以及本行最大字符高度值来确定,而是否是尾结点则通过 createlink 中的相关程序条件判定来确认。 createland( int x,int y,QString landtext,QString text):跳转点的创建 这个功能是用来创建一个新的跳转落点。 x、 y 就是当前输入光标位置,以x、 y 为左上角坐标, landtext 的长度为宽度, landtext 的最高可能高度为高度定义一个区域作为跳转落点。 以 x 和区域的头部 top()为坐标输出 landtext,即跳转到的标记 text 的所在处。 emitlink( int x,int y):超级链接的激活 这个是功能模块中非常重要的一个模块,两个参数是当前鼠标的位置,采用链表方式形成一个单向链表来进行点击位置的查找。 从链表头循环直到最后一个节点。 在测试过程中发现一个问题,如果以每个节点的 next 不为 0 来判断吉林大学学士学位论文 11 并往下查找,条件为 while( tempnext!=0)最后一节点则会指向一个空链表进而发生应用程序出错的问题。 因此我改造了数据结构,加上一个末尾节点,以空区域( 0, 0, 0, 0)为链接区域防止干扰其他正常的超级链接,定义 bool endlink属性,并修改查找条件为 while( tempendlink==false),测试成功,不会再出现应用程序出错,点击其他链接也能正常激活超级连接。 添加了一般浏览器所拥有的对当 前点击链接加框的功能。 由于加框和去框的过程中底部背景可能会受损,因此 hyperlink 类中添加一个小块背景图片的 QPixmap 作为补偿使用。 首先擦除该 hyperlink 类所在范围内的画板内容,用小块背景图片填充后,再补上相应字符。 在本设计的基础上,如果想重画整个画面是不现实的,因为打印的普通文字并未成为单独的类,难以在重画之后恢复。 关于后面 html 文本解析处也会遇到类似问题。 在窗体中打印文字时,我们以 y 轴为顶部为准输出文字和图片,因此超链的窗口也必须适应这点,以 x、 y 为坐标,链接字体的宽度和高度作为超链范 围的宽、高来创建。 宽度可以用 (linktext)来确定,高度可用 () 来确定,其实对于超链而言,用 ()即可确定高度,而不用管某些字符如J、 L 和 g、 y 这类会“出界”的特殊字符。 附:出界的问题,出在每个字符所占用的高度和宽度一样各有区别,例如,大写的 J 就比小写的 a 要占据更多的上部空间,而小写的 y 也比小写的 a 要多占据下方的控件。 ()表示了多占用的上部空间和中间统一高度之和,而 ()表示多占用的下部空间的高度。 如果不考虑这些问 题,则可能在显示的过程中会有字符重叠现象,或者是在擦除的过程中有留下痕迹的现象。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。