毕业设计(论文)基于S3C2440的嵌入式浏览器设计.doc

上传人:仙人指路1688 文档编号:2393804 上传时间:2023-02-17 格式:DOC 页数:39 大小:1.28MB
返回 下载 相关 举报
毕业设计(论文)基于S3C2440的嵌入式浏览器设计.doc_第1页
第1页 / 共39页
毕业设计(论文)基于S3C2440的嵌入式浏览器设计.doc_第2页
第2页 / 共39页
毕业设计(论文)基于S3C2440的嵌入式浏览器设计.doc_第3页
第3页 / 共39页
毕业设计(论文)基于S3C2440的嵌入式浏览器设计.doc_第4页
第4页 / 共39页
毕业设计(论文)基于S3C2440的嵌入式浏览器设计.doc_第5页
第5页 / 共39页
点击查看更多>>
资源描述

《毕业设计(论文)基于S3C2440的嵌入式浏览器设计.doc》由会员分享,可在线阅读,更多相关《毕业设计(论文)基于S3C2440的嵌入式浏览器设计.doc(39页珍藏版)》请在三一办公上搜索。

1、摘 要嵌入式网络浏览器多用于嵌入式小型设备中,如手机、数字电视机顶盒、PDA、小型广告机等。其拥有体积小、耗能低、功能能基本满足需要等特点。本文首先对个人机上的常用网络浏览器进行分析,再对当前存在的一些嵌入式网络浏览器如konqueror、UCweb进行分析并与个人机上的网络浏览器进行比较,给出了设计嵌入式浏览器的一些方案。在文章中主要介绍了用较低版本的Qt2.2来实现一个嵌入式网络浏览器基本功能的方法。给出了每个程序模块的设计思想和主要算法。本文的主要内容涉及Qt语法的分析,浏览器各部分功能模块的分析实现,以及Html语法分析程序的解析。在文中给出了程序各模块的测试结果。并且照本浏览器的特性

2、与主流浏览器的相应功能进行对比。关键词:嵌入式、浏览器、html语法、QtAbstractAn embedded browser is always used in small-sized embedded equipment such as mobile phone,Set-Top Box for digital TV,PDA,and advertisement broadcasts. They are small size, low power consumption,and the function they have can basically meet the need of peo

3、ple.Firstly, this paper analysis the fashion web browser on PC and embedded web browser such as konqueror and UCweb. Then give a comparison between those browsers. At last, we give out a project design for our new embedded web browser.This paper introduced a method to achieve a browser with basic fu

4、nctions using a lower version designer named Qt 2.2.It also include the design philosophy and main algorithm.The main contents include the analysis of syntax of Qt and html language. And the achievement of each function module. The main algorithm is presented in this paper while the result of test w

5、ill be given. Whats more, a comparison between the fashion web browsers and this design based on the identity will be given.Key words: embedded,browser,html syntax,Qt目 录引言1第一章 嵌入式浏览器的基本知识21.1 主流浏览器的功能分析21.1.1 Internet Explorer概述21.1.2 Mozilla FireFox的概述21.2 嵌入式浏览器的分析31.2.1 konqueror31.2.2 手机浏览器31.3

6、嵌入式浏览器的开发难度分析31.3.1 方案分析31.3.2 需求分析41.3.3 硬件要求41.3.4 软件要求51.4 准备工作51.4.1 移植操作系统与文件系统51.4.2 应用程序的移植51.4.3 Qt的熟悉5第二章 主要部分功能模块的实现82.1 功能实现的基本方法和全局函数的说明82.1.1 文字的输出82.1.2 菜单与菜单功能的实现82.1.3 视频菜单的实现92.2 初写各部分功能模块102.2.1 emitword()输出文字信息的模块102.2.2 createlink()超链接的创建102.2.3 createland()跳转点的创建102.2.4 emitlink

7、()超级链接的激活102.2.5 jumptoplace()转到指定位置112.2.6 eraseword()擦除文字112.2.7 createpicturelink()创建图片链接122.2.8 emitpicture()创建图片122.2.9 newpage()用原始窗口打开一个新网页122.2.10 fileanalysis()文件分析132.2.11 enter()回车132.2.12 clear()清屏命令132.2.13 backward(),forward()后退命令和前进命令13第三章 Html文本的解析工作163.1 关于解析的步骤163.2 各标记的解析163.2.1 标

8、题解析163.2.2 换行解析163.2.3 页面属性解析163.2.4 超链接解析173.2.5 图片解析183.2.6 字体及所属其他标记的解析193.2.7 标尺线解析203.2.8 段落解析243.2.9 和列表解析243.2.10 背景音乐解析253.2.11视频解析25第四章 关键问题分析284.1 关于读入参数的容错问题284.2 关于输出字符位置的判断和每行的高度问题284.3 关于网页之间切换的一些问题284.4 关于图文环绕之中的一些问题284.5 关于背景画板扩大的一些问题284.6 关于显示文字的问题294.7 关于获取网络文件的问题29第五章 总体测试30测试1 输出

9、本地网页30测试2 URL页面测试30结论31致谢错误!未定义书签。参考文献33引 言随着嵌入式技术的发展,高科技产品逐渐向着小型化,智能化的方向发展。嵌入式设备以其独有的小型、快速、功耗低等优势逐渐在各行各业有着迅速的成长,产品包括新型手机、PDA、导航设备、信息家电等等。浏览器作为嵌入式设备与网络对接的一个重要应用软件,在当今正处于发展阶段,只有少数公司拥有自主知识产权的嵌入式浏览器。因此,需要更多的关注和投入。嵌入式系统虽然有体积小、速度快、功耗低等优点,但是不可避免的是存在运算能力不如大型机,外部设备不够齐全等缺点。因此,在大型机上能运行的一些应用软件并不能完整移植到嵌入式设备之中。必

10、须经过剪裁和关键部分的修改。由于硬件的不同,在大型机上仿真运行的软件也必须针对硬件特性经过一定的修改才能在嵌入式设备上正常运行。Qt作为Nokia公司的一个开源的源码包,自1996年以来,已成为世界范围内数千种成功的应用程序基础,也是流行的Linux桌面环境KDE的基础。支持带帧缓冲(framebuffer)的Linux平台(即一般的嵌入式系统所用操作系统平台)。它是用C+编写的源码包,能够方便的跨平台移植。该源码包包含了许多应用软件应涉及到的各种功能模块,为编写大型软件提供了有力的支持。本设计利用了Qt2.2作为开发平台,构建了浏览器的框架,再利用一些共享的外部程序来实现主流浏览器所具备的一

11、些功能。在本文中详细解释了各个功能模块的功能及算法,以及对Html语法解释的核心算法。并且做出了各功能模块的测试。同时,把已经完成的小型嵌入式浏览器与主流大型机上的浏览器进行对比分析。本浏览器是从零做起,没有使用其他浏览器作为内核。因此工作量比较大,在毕业设计期间只能尽量完成一些常用功能,对一些不能完成的功能将进行一定的处理,使其不干扰已完成功能的正常运行。鉴于Qt2.2的软件特性以及嵌入式硬件平台的特性,本浏览器对一些比较困难的问题做出了一定的妥协和折中考虑,尽量避免影响浏览器的整体效果。第一章 嵌入式浏览器的基本知识1.1 主流浏览器的功能分析在这里解释的主流浏览器指在大型机上运行的网络浏

12、览器,主要分析Windows下的代表软件Internet Explorer、Linux下的代表软件Mozilla FireFox。1.1.1 Internet Explorer概述Internet Explorer是微软公司推出的一款网页浏览器10。拥有广泛的市场占有率,它在为互联网的发展做出了贡献的同时,也因为它并不开放源码,并且不断爆出安全漏洞等问题而遭人诟病3。Internet Explorer支持HTML4.01、CSS Level 1,XML 1.0和DOM Level 1。只有一些排版错误。对于当今各种各样的网页已经支持的相当完美了。对于一些网页中特殊的元素,例如Flash以及一些

13、视频音频文件,有专用的插件可供使用。然而完美的功能伴随的是巨大的资源开销,不仅是需要较大的存储空间,运行时还需要较大的内存资源。如果一次开多个网页,甚至会造成内存不足,产生种种错误,甚至死机。当前Windows下有许多所谓低开销、多功能的浏览器,如腾讯TT、Maxthon、360安全浏览器等,也是以IE浏览器作为内核,加上一些定制的外部模块来构建的,这些浏览器仅仅是改变了界面、一些输入输出的过滤,以及线程的规划,能起到减少资源消耗,防堵危险信息等功能。在脚本分析,排版等核心技术方面并没有任何技术可言。用当前的编程软件,如visual studio下的VC、VB等中的activeX控件可以比较容

14、易的开发出来。对于各标准的支持,只能以控件中现存的内容为准,无法进行更新。1.1.2 Mozilla FireFox的概述该浏览器的前身是网景(NetScape)浏览器,NetScape公司和微软在取得NCSA授权后各自开发的第一代浏览器,在浏览器大战中最终不敌IE而后网景将浏览器源代码重新改写,推出了Mozilla。Mozilla Firefox是其旗下的两种浏览器(另一种是雷鸟)之一,其安全性优于IE,有许多突出的特色,如分页浏览、即时书签、下载管理器等。在Linux下主流的浏览器就是Firefox,其对目前各种网页的解析也是相当完善的。也可以通过安装组件来支持不同的网页元素。1.2 嵌入

15、式浏览器的分析嵌入式系统的主流操作系统有WinCE和Linux,因为本设计使用的是Linux系统,在这里,我们对主流嵌入式浏览器konqueror,以及一些手机上使用的小型浏览器的功能做简要分析。1.2.1 konquerorkonqueror是一个基于KDE的基本嵌入式浏览器,能支持浏览器的一部分功能。例如网页解析、信息发送接收等,能获取处理过的网络数据库信息,能比较完整的显示一个网页。但是因为其基于嵌入式设备的特性,许多功能被加以简化。例如,字体不能更改、显示不出某些格式的图片、排版存在一些缺陷、一些图形标记(如)过于简化、不能正常播放音、视频等等。但是其对gif图片的支持很完美,可以看到

16、动画。作为PDA等小型掌上设备的网络浏览器,其实功能已经显得足够了。1.2.2 手机浏览器手机由于屏幕大小的限制以及信息传输流量的限制,其浏览器就更为简单。因为网络流量问题,因此手机浏览器以“获取足够的信息”为前提,一般只能得到文字信息以及少量的图片信息。没有很好的排版功能(其实因为屏幕太小,没有必要)大部分手机浏览器还是支持表单等对网络数据库进行操作的功能。目前流行的手机浏览器仅有UCweb等少数几款,数量极少,市场空间较大。1.3 嵌入式浏览器的开发难度分析1.3.1 方案分析首先想到的是在以开放源码的浏览器内核的基础上添加新的内容,就如同1.1节介绍的基于IE的一些浏览器的做法一样,在现

17、有基础上进行继续开发。这个方案是比较容易执行的方案,然而,即使是开放源码的浏览器内核,也需要对原有源代码进行完整具体的分析才能明白如何在源码的基础上加以改进。这个需要花费很多的时间和精力,而且,就本设计而言,对源代码所用的编程语言并不熟悉,也不清楚是使用何种编译环境,因而无从下手。之后,就产生了从零开始编写一个小型的嵌入式浏览器的想法。本设计是基于Qt2.2的开发包,因为有相关资料,开发平台与测试平台的搭建比较容易,能比较快速的进入开发过程。但是,从零开始开发一个大型软件的工程量是巨大的,不是一个人在几个月间可以实现的。因此,基于这种考虑,打算编写一个具有一定基本功能的小型网络浏览器,这个工程

18、量就减小了许多,可以考虑在毕业设计期间完成。由于国内嵌入式浏览器技术被少数几家公司垄断,市场前景良好,因此有必要从底层开始进行设计。这也是一次编写大型程序的很好的锻炼机会。1.3.2 需求分析浏览器的核心在于对脚本文件的正确解析。脚本文件是由一系列标记(由符号组成)以及文本内容组成的。需要编写一个分析标记的程序,在分析标记的同时在页面上进行元素的布局。虽然多数浏览器采用的是将标记与文本先用数据结构存储之后再进行布局的模式,然而这种模式正是大资源占用量的来源。为了减少资源的开支,加上嵌入式浏览器的局限性,决定采用边分析边布局的方式。按照能够实现的最好布局效果来实现功能。软件界面采用Qtopia的

19、KDE界面,其提供标准窗体、菜单、按钮、以及窗体中绘制图片、文字等功能。主窗体、菜单、按钮等使用Qt中自带的类来实现,而窗体中文本的显示则使用绘图功能,编写相应的模块函数来实现。要求实现的功能暂定为:文本的输出、图片的输出、超链接的识别和输出、标尺线的输出、列表文字的输出、字体的改变、背景与标题的处理、背景音乐输出、简单的视频支持。这些功能标记规范由Html语言教程1给出。1.3.3 硬件要求本设计重点在于软件的设计开发,在这里简单介绍一下硬件平台的配置。采用天嵌公司以S3C24406为核心的开发板TQ2440,与本设计中相关功能有关的基本硬件20有:USB接口电路:USB模块集成于S3C24

20、40A芯片中,该接口主要用于文件的传输,例如测试网页、执行程序的转移。IIS音频数据接口电路:芯片为UDAl341TS,可把数字信号与模拟信号相互转换,内部提供DSP功能,用于输出网页中的音频文件。驱动为Linux2.6.29中的UDAl3410驱动。网络接口电路:使用DM9000E 100M网络接口芯片,用普通网线与以太网进行连接。驱动使用Linux2.6.30中的DM9000驱动。显示采用320x240点阵东华4.3寸液晶。驱动采用修改过的Linux2.6.30内的LCD驱动程序。1.3.4 软件要求编程环境:Linux2.6.99,交叉编译器4.3.3,Qtopia2.2。1.4 准备工

21、作1.4.1 移植操作系统与文件系统按照天嵌公司提供的教程4,经过一段时间的移植,已经可以在开发板上运行Qt主界面。移植器件并未遇到特别大的困难。1.4.2 应用程序的移植主要是音频播放器mpg123与视频播放器Mplayer的移植2,mpg123是一款强大的音乐播放器,Mplayer是款强大的媒体播放器,可以作为Qt进程来实现一些功能,例如作为网页中嵌入的音频视频输出程序调用。mpg123能播放大部分常用格式音乐如mp3、wav等,Mplayer可播放flv、mpeg2、mpeg4、avi等格式视频,遗憾的是由于嵌入式系统限制不能播放swf和rmvb。1.4.3 Qt的熟悉由于大学期间未曾学

22、过嵌入式系统编程用的语言,也未系统学过C+,但是本人有C语言17以及其他语言的基础,因此首先要摸清Qt程序的编写原理。一、创建控件图1-1 Qtopia的界面图1-1为Qtopia的运行界面,与C+23、VB不同的是Qt创建完窗口就得重新编译出能实现窗体的源码,每次修改都要重新编译比较复杂,因此我采用直接在vi下书写程序,在Qt模拟测试平台上观察结果。首先是放置测试用控件如主窗体、输入文本框、标签、触发按钮等8。主窗体:主要作为其他控件的容器。子窗体:显示一个网页的全部信息,随网页建立而建立。这样存放便于使用后退、前进等功能。输入文本框:主要作为测试,向主窗体发送一些自定义字符串,或者显示一些

23、信息。标签:作为显示测试,用途同上。触发按钮:作为各个分功能的测试开关,点击后能实现在指定位置显示字符、图片等作用。二、文本输出测试起初有使用textbrowser进行直接html解析转换显示,但是发现Qt2.2的textbrowser的能力有限,超链接等都显示为空白,还有一个换行符在文本框的末尾无法消除,因此放弃该想法。转想用textbrowser来显示文本,想一些其他的方式显示超链接。然而,textbrowser对背景色支持极不方便,需要设置许多位置,而且还会影响到字体的颜色。更不支持背景图片16。接着又发现,textbrowser的滚动条有严重的缺陷。滚动之后窗口的鼠标移动数值范围是不变

24、的。例如:480x360的主窗体在右滚动100单位之后,鼠标移动范围数值由0-480变为100-580,而textbrowser的滚动条则是无论滚动多少都是在0-480范围11。这对超级链接位置的设置有重大阻碍,因此完全放弃用text控件。改在子窗体上用画板进行文本输出。这样会有一个缺点,就是鼠标拖拽选择文本功能暂时丧失(应该可以靠程序来补足,暂时不考虑这方面),然而却获得了背景色、图片的支持、以及滚动条的支持,对于当前“光标”位置的判定虽然比text控件要困难一些,不过仅仅只是算术上的困难,能够克服。三、超链接的设计实现超链接作为web浏览器的一大特色是不能忽视的,因此必须实现它。在网络上找

25、了几个资料,有人认为可以用改为平板型的按钮实现超链接,也有人用label控件实现超链14,这些方法都不错,但是按钮按下时有3D效果,使用label控件不利于背景的透明处理,因此,我决定写一个继承QRect控件的新类HyperLink,用于确定一个超链接范围,类中添加超链文本、超链颜色设置以及一些必要的范围设置与判定函数。当超链文本在主窗口中创建的时候,同时创建一个HyperLink类覆盖文本区域并等待鼠标事件,点击后发送信号激活槽,槽中对link的功能(跳转、新开页面)进行判定实现。超链接区域类HyperLink的存储方式应该是链表方式,对于每个HyperLink类要实现的功能应该由Hyper

26、Link类自己进行设置,由一个while循环判断是哪一个HyperLink执行,读出功能属性(跳转、开窗口)再用case语句选择功能。再者,文字和图片的HyperLink类应该用一个属性区分开,便于实现超链文本点击后变色的功能。关于跳转功能,需要再添加个类似于超链的一个“落点”(LandPlace类,用于存储一些关于落点的属性,当点击超链接发送跳转信号时,查找落点的位置信息。四、熟悉Qt的准备工作1、 显示一段文字:利用画笔的drawText功能,在当前的光标位置画上文字。2、 显示一张图片,利用画笔的drawPixmap功能,在当前光标位置画图片。3、 涂改,画笔的eraseRect功能,清

27、除一个区域的内容。4、 刷新,如果只用画笔往窗体上画,那么一旦窗体被其他程序的窗体覆盖之后,所有显示内容都会消失,所以必须重载paintEvent,使之以一定的速度刷新。5、 创建一个窗口超链:先用画笔显示一段加下划线改变颜色的文字(或图片),再创建HyperLink类,设置其功能为“窗口超链”。五、 自定义类:1、 HyperLink(x,y,w,h,name,linktext,endl)超链接类,用重载函数定义为两种超链接文字链接与图片链接,用bool ispicture来进行区分。同时为除错,添加一个bool endlink来声明链表尾结点。除错分析见(六)中超链接激活内相关内容。2、

28、LandPlace(x,y,w,h,name,endp)超链接落点类,同样为除错添加bool endland来声明链表尾结点,虽然理论上只需要定位两个参量x,y,但是因为其链接继承于QRect,且w、h属性便于输入光标定位,因此保留。在熟悉过主要需要的功能以后,下一章开始对本浏览器的各模块加以实现。第二章 主要部分功能模块的实现本章内容为实现各部分主体功能模块,章节末尾附分模块的简单测试过程。2.1 功能实现的基本方法和全局函数的说明2.1.1 文字的输出采用图文环绕的方式,图片后输出文字的方式在之后图片解析中给出。此处给出一个有关的参数nexttextplace,用于记录输出文字的位置(上、

29、中、下)行间距默认为5个像素,文字、图片边框的颜色默认为黑色,链接颜色默认为蓝色,点击后的链接颜色默认为紫色。为某些居中、居右显示字串的要求考虑,提供一个bool变量placeset,以及参数nexttext,用于记录当前输入文字的位置(左、中、右)。默认字体为times,大小为12,背景图片为空,最大字符高度maxweight为当前行字符中最高的一个。2.1.2 菜单与菜单功能的实现由于主窗体的滚动条不能改变长度的限制,因此采用可隐现菜单的方式,制作一个菜单条,上有后退、前进、刷新、转到4个按键,以及1个URL输入框、1个电影栏存放该页面内视频的清单。 图2-1 隐现菜单的效果后退、前进、刷

30、新、转到四个按键和文本录入框的实现与功能实现:每个打开的窗口拥有双向链表结构,指向前一个窗口和后一个窗口。为了实现这些功能在窗口类mywidget中添加了两个变量URL和tpm,一个用于记录当前的页面,另一个用于记录当前页面的URL,同时利用窗口类自带的caption属性来记录主窗体当前的标题。在点击这四个按钮时,可以做出相应的变化。“转到”实际上就是新建窗口。新建窗口时,先按链表的顺序找到能前进的最终结点,然后顺序把这些结点释放,再创建新的结点,关闭前进按钮。激活后退按钮。在图2-1里用英文表示为open。“后退”功能只需要把主窗体的指针指向其后一个窗体即可,首先保存页面信息,再把页面隐藏,

31、改变指针后显示窗体即可。在图2-1里用英文表示为backward。“前进”功能与后退类似。在图2-1里用英文表示为forward。“刷新”功能就是重新解析一遍本页面的Html脚本。在图2-1里用英文表示为reload。这几个按钮和文本框集中在一个菜单窗口上,无法固定在窗体中,因为会影响滚动与观看页面。因此将其做成可隐藏小窗体,用左上角一个小按钮来控制隐现。小按钮的位置只占据在页边距空间上,因此对浏览网页基本不造成任何影响。主要功能的实现程序在后面的函数中解释。2.1.3 视频菜单的实现由于使用的是外部程序mplayer,其不支持把视频嵌入到Qt窗口中,因此只能折中考虑,将当前窗口内能播放的视频

32、文件放入一个下拉菜单中,用鼠标选取播放。再者,由于移植的版本较低,没有完善的交互功能,能做到的只有播放、停止。通过读取输入输出信息能得到文件的长度等信息。如图2-2图2-2 视频菜单两个功能基本描述如下;在视频开始播放以后,画面停止刷新,并等待鼠标点击响应,点击后可以暂停视频,重新开始刷新画面,出现视频菜单。点击暂停视频的响应槽:showbar()显示视频菜单,开始刷新。继续播放mediastart():隐藏视频菜单,停止刷新画面继续播放视频。停止播放mediastop():隐藏视频菜单,开始刷新画面,显示主菜单。这三个函数比较简单,不在下一节解释。2.2 初写各部分功能模块2.2.1 emi

33、tword(int x,int y,QString emittext):输出文字信息的模块输出文本的函数是必不可少的,参数中,x、y输入光标位置,emittext就是输入的字符串,方便其他组件调用。由于看见各类浏览器在添加超长的字串或超链时是自动拉长窗口大小,但是在本浏览器设计初期窗口大小因为背景需要重画等问题,后来打算不使用这种方式。改为使用自动换行功能。该处的难点在于如何判断在何处需要换行。这个难点的困难之处在于,每个字母占用的“宽度”是不一样的21。虽然有QFontInfo类来统计一串字符的宽度,但毕竟不能靠宽度/每个字符的宽度来获得该段字符的字数。因此,设计时考虑使用逐次折半法,即先将

34、要输出的整个字符串与当前行余下的空白处宽度对比,如果小,则直接输出,如果大,则把字串折半,再进行对比,如果小,则把剩下的那部分折半,无法再折半的时候,输出,把剩下的字符串刷写到原来字符串中,再开始用折半法输出。如此周而复始就可以正确的输出所有的文字。2.2.2 createlink(int x,int y,QString linktext,QString landtext,bool islink):超链接的创建主要属性为方形的位置,链接显示内容、链接跳转文字,是否是链接(还是跳转),宽高可以靠fm对linktext取宽高值以及本行最大字符高度值来确定,而是否是尾结点则通过createlink中

35、的相关程序条件判定来确认。2.2.3 createland(int x,int y,QString landtext,QString text):跳转点的创建这个功能是用来创建一个新的跳转落点。x、y就是当前输入光标位置,以x、y为左上角坐标,landtext的长度为宽度,landtext的最高可能高度为高度定义一个区域作为跳转落点。以x和区域的头部top()为坐标输出landtext,即跳转到的标记text的所在处。2.2.4 emitlink(int x,int y):超级链接的激活这个是功能模块中非常重要的一个模块,两个参数是当前鼠标的位置,采用链表方式形成一个单向链表来进行点击位置的查

36、找。从链表头循环直到最后一个节点。在测试过程中发现一个问题,如果以每个节点的next不为0来判断并往下查找,条件为while(temp-next!=0)最后一节点则会指向一个空链表进而发生应用程序出错的问题。因此我改造了数据结构,加上一个末尾节点,以空区域(0,0,0,0)为链接区域防止干扰其他正常的超级链接,定义bool endlink属性,并修改查找条件为while(temp-endlink=false),测试成功,不会再出现应用程序出错,点击其他链接也能正常激活超级连接。添加了一般浏览器所拥有的对当前点击链接加框的功能。由于加框和去框的过程中底部背景可能会受损,因此hyperlink类中

37、添加一个小块背景图片的QPixmap作为补偿使用。首先擦除该hyperlink类所在范围内的画板内容,用小块背景图片填充后,再补上相应字符。在本设计的基础上,如果想重画整个画面是不现实的,因为打印的普通文字并未成为单独的类,难以在重画之后恢复。关于后面html文本解析处也会遇到类似问题。在窗体中打印文字时,我们以y轴为顶部为准输出文字和图片,因此超链的窗口也必须适应这点,以x、y为坐标,链接字体的宽度和高度作为超链范围的宽、高来创建。宽度可以用fm.width(linktext)来确定,高度可用fm.ascent() 来确定,其实对于超链而言,用fm.height()即可确定高度,而不用管某些

38、字符如J、L和g、y这类会“出界”的特殊字符。附:出界的问题,出在每个字符所占用的高度和宽度一样各有区别,例如,大写的J就比小写的a要占据更多的上部空间,而小写的y也比小写的a要多占据下方的控件。fm.ascent()表示了多占用的上部空间和中间统一高度之和,而fm.descent()表示多占用的下部空间的高度。如果不考虑这些问题,则可能在显示的过程中会有字符重叠现象,或者是在擦除的过程中有留下痕迹的现象。2.2.5 jumptoplace(QString text):跳转到指定位置参数只有jump文本,就是html协议里name定义的文本。QScrollView有实现跳转的功能setCont

39、entsPos(x,y)能直接跳转到x、y轴为左上角坐标的窗口位置。只需要像emitlink功能中链表搜索一样搜索到含有指定字符的结点,读取位置信息,即可方便地跳转到指定位置。同时,如果是另一网页的定位跳转(html解释语句中有此类),一般在主程序中实现。2.2.6 eraseword(int x,int y,int w,int h):擦除文字擦除指定位置的画板,这个用于一些重置操作例如超链接的边框去除等等。便于其他函数使用,如图片的擦除等等。利用全局变量color来确定颜色。2.2.7 createpicturelink(int x,int y,QString linktext,QStrin

40、g landtext,QPixmap image,bool islink,int border):创建图片链接理论上在网速比较快的今天很少有能看到图片下面的文字的情况,且因为图片下文字有一定限制范围,因此暂时忽略此功能。或许在之后的表格功能设计时会添加该功能。在窗体中(x,y)位置放置一张图片,可带跳转文本,可设置边缘宽度。按Html规则,如果是链接,则在点击链接后边框变色。一些网页支持“点击时文字变色”的功能,由于利用的是mouserelease事件,这里暂时不实现该功能。2.2.8 emitpicture(int x,int y,QPixmap image,int border):创建图片

41、在指定位置(x,y)画一张带边框宽度border的图片image。与emitword函数一样用全局变量color来决定颜色分配(link色还是text色),在解释函数中对颜色进行确定。颜色主要用于边框的绘制。2.2.9 newpage(QString filename):用原始窗口打开一个新网页网页名为filename。该函数需要进行许多初始化过程,清空电影条、停止背景音乐、建立新的窗口隐藏旧窗口,把旧窗口可使用前进功能到达的所有窗口给删除,取消多个主窗口中信号与子窗口槽的连接,重新建立新连接。重画窗口画板,设置画板大小,把行间距,字体颜色等所有所需全局属性返回原始,最后再分析文件打开文件。打

42、开文件前,清空临时目录/tmp/web,为获取网络文件作准备。打开文件后,把URL保存于窗体内的变量URL中,再把当前URL显示于菜单栏的文本框中。为此方法修改了Mainwindow类的全局变量link、finlink、land这三个链表头结点,把他们移至mywidget类中。因为每个网页窗口都需要这三个链表结点。将程序中所有的link、finlink、land全部加上main-。接着发现无法显示带滚动条的新网页,在检查过后发现是未使用addChild,然而,在addChild之后反而无法显示新网页,窗口呈灰色。多次试验后,发现应该在新创建mywidget类时就应该addChild这个类,之后

43、再把窗体指针main指向新创建的窗体。接着又发现鼠标无法响应点击事件,经过测试发现是鼠标事件没和主窗体连接。在newpage()里重新建立该连接,测试后,可以在新窗口中使用之前创建的任何功能。同时在mywidget类中添加了pre和next两个指针作为前结点和后结点,为之后添加前进和后退指令做铺垫。reload():其实就是简化了的newpage(),把当前网页初始化后重新分析当前页面。openURL():其实就是把地址框的文字作为参数赋值给newpage()。2.2.10 fileanalysis(QString path):文件分析很重要的一个功能,也是本设计最后才完成的功能22。起初是为

44、了分析本地文件而写的函数,之后加上了分析网络文件的过程。首先判断是否是绝对地址,以开头是否为/和是否以http:/(其他协议暂不考虑)来判断。如果是相对地址,则和全局变量workingPath做相加,获得工作目录和希望获取的文件。如果是本地文件,则直接返回本地文件名,如果是URL上的文件,则通知进程wget获取网络上相应文件,存放于/tmp/web/下为同名文件,返回该文件,并把工作目录存入workingPath内。2.2.11 enter():回车这个回车的要求比较高。首先按照本行的最大字符高度改变输出y坐标的位置,使其下移一行,同时,由于有文本环绕功能,下一行的是否有图片占用必须进行判断,

45、从而决定下一行x坐标的起始点和终止点,最后,倘若y坐标即将超出当前画板的最下方,则要把画板扩大。2.2.12 clear():清屏命令除清屏外,复制背景图片到画板中,并把x、y坐标移回原点,初始化几个与文本环绕有关的位置信息。2.2.13 backward(),forward():后退命令和前进命令两个命令写起来差不多,都是先关闭背景音乐,清空电影栏,隐藏当前窗口,解除与主窗体的信号连接,再改变窗口指针,把保存在子窗口中临时画板内的信息输出到当前画板中。各部分功能的第一次测试过程:1、背景图片的设置:结果如图2-1,平铺效果。2、文字的输出:在(0,0)位置输出“This is a test!

46、”结果如图2-1。3、在屏幕上创建3个超链接的点击区域,测试其是否响应鼠标点击:Link1为普通链接(暂时没有其他功能),Link2为跳转链接,跳到place1,Link3为跳转链接,跳到滚动条下方另一个点place2。(图2-1中下面两个文本框仅供测试用,无功能。)图2-2 背景图片、文字输出、超链接的建立4、点击Link1:注意到已变色、加框。目前没有“去框”的功能,但是设计方法已有,添加一个新Hyperlink变量“上一个框”,然后擦除带框区域,重写链接文字。这个变量可以利用到尾结点,节省空间,如图2-2。图2-3 点击Link1后的结果5、点击Link2:注意到已跳转到以place1的

47、左上角为主窗体左上角的位置。以下两图为同一页面的上下两部分,此时Link2已经变色,加框。如图2-3、图2-4 图2-3 点击Link2的之后跳转到place1 图2-4 place1上方区域如图2-5、图2-6是添加图片的测试: 图2-5 添加了一张border=5的图片 图2-6 链接图片的测试如图2-6此图片是链接,因此边框为蓝色。左边place2与Link4重叠是为测试焦点框离开Link4时place2是否被擦除。如图2-7为点击Link1,变色,加框的结果,图2-8为点击旁边区域后,框消失:图2-7 已修正的点框 图2-8 去除框如图2-9点击链接图片,跳转place2,变色,加框。图2-9 图片的变色和加框效果自此,分模块功能已经基本完成,下一步进行最主要的Html文本解析工作。第三章 Html文本的解析工作这是本设计中最主要的工程,而且是要在将来不断添加新内容的工程。函数名为htmlanalysis(QString filename),filename为解析的文件名。在每完

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号