完整版数字城市查询系统嵌入式linux下的GUI编程毕业设计Word文档格式.docx
《完整版数字城市查询系统嵌入式linux下的GUI编程毕业设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《完整版数字城市查询系统嵌入式linux下的GUI编程毕业设计Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
嵌入式运行模式允许嵌入式数据库通过SQL来轻松管理应用程序数据,而不依靠原始的文本文件。
典型嵌入式数据库比较
目前,基于嵌入式数据库应用的市场需求已经进入加速发展的阶段,适用于嵌入式开发的嵌入式数据库主要有mSQL、BerkeleyDB、SQLite等。
(1)BerkeleyDB
BerkeleyDB是一个开放源代码的嵌入式数据库管理系统,为许多编程语言提供了实用的API接口,包括C、C++、Java、Perl、Tcl、Python和PHP等。
它通过调用这些API来完成对数据的保存、查询、修改和删除等操作,能够用来管理多达256TB的数据,并且在许多方面的性能还能够同商业级的数据库系统相抗衡。
BerkeleyDB能够很轻松地应付几千个用户同时访问同一个数据库的情况。
另外,由于其应用程序和数据库管理系统运行在相同的进程空间当中,进行数据操作时可以避免繁琐的进程间通信,因此耗费在通信上的开销自然也就降低到了极低程度。
但是BerkeleyDB不是关系型的数据库,不能应用标准的SQL语句对数据库操作,缺少灵活性,而且学习起来有一定难度,必然会加大开发成本。
(2)mSQL
mSQL是一种简化的SQL数据库,体系结构小巧,占用系统资源少,特别适合在嵌入式Linux系统中使用。
同时,mSQL提供专门的API函数,使得用C语言编写的CGI程序可以与mSQL的数据库引擎进行通信。
但它只有30天的使用期限,并非完全的开源。
(3)SQLite
SQLite是D.RichardHipp用C语言编写的开源嵌入式数据库,是同类产品中的后起之秀,2005年获得了开源大奖。
SQLite可以在所有主要的操作系统上运行,并且支持大多数计算机语言。
SQLite还非常健壮。
其创建者保守地估计SQLite可以处理每天负担多达100,00次点击率的Web站点,并且SQLite有时候可以处理10倍于上述数字的负载。
SQLite采用单文件存放数据库,速度又比MySQL快上1~2倍,存储量也不是问题,在操作语句上更类似关系型数据库的使用,使用操作非常方便。
其主要的特点:
1.支持多数SQL92标准
2.ACID事务支持,甚至在数据库崩溃和恢复时也支持
3.零配置-无需安装和管理
4.整个数据库存储在单个文件中
5.支持数据库大小至2TB
6.足够小,大致3万行C代码,250K二进制目标代码
7.大部分普通数据库操比一些流行的数据库还要快
8.提供简单、易用、多种语言的API
9.完全独立的,不具有外部依赖性
10.作为一款嵌入式数据库,SQLite与BerkelyDB一样,以库的形式提供,通过C函数直接操作数据库文件(也支持其他的访问方式,比如Tcl)
SQLite不是Server,所以和SQLServer等不同,它和程序运行在同一进程,中间没有进程间通信,速度很快,而且体积小巧,易于分发,非常适合运行在单机环境和嵌入式环境。
与BerkelyDB相比,SQLite功能虽较BerkeleyDB略有逊色,但在开源组织的推动下差距正在缩小。
实际上,很多情况,特别是在嵌入式系统应用中,并不需要存储过程或复杂的表之间的关联,这时会发现SQLite在大小和功能之间找到了一个理想的平衡点。
其次SQLite是关系型数据库,支持大部分SQL语句,这是它比BerkelyDB优秀的地方。
体积也比BDB小一倍。
更重要的是,SQLiate允许自由地用于任何目的甚至包括商业应用,故能大大降低开发成本。
因此本项目嵌入式数据库将采用SQLite。
1.1.2嵌入式操作系统
1.1.2.1什么是嵌入式系统
近年来随着微电子技术的迅速发展,实际应用领域产生了很大变化,各种各样的应用于工业设备、电子产品中专用的计算机大量涌现。
这种计算机隐藏在各种产品和系统中,嵌入式计算机由此而得名。
嵌入式计算机系统正式定义为以应用为中心,软硬件可裁减的,适应应用系统对功能、可靠性、成本、体积、功耗等综合性严格要求的专用计算机系统。
嵌入式系统主要由嵌入式处理器、相关支撑硬件、嵌入式操作系统和应用软件等组成。
嵌入式系统是面向用户、面向产品、面向应用的,是针对具体应用的专用系统。
它的硬件和软件都必须高效率地设计、量体裁衣去除冗余、力争在同样的硅片面积上实现更高的性能。
1.1.2.2经典嵌入式系统的比较
嵌入式操作系统EOS(EmbeddedOperatingSystem)是一种用途广泛的系统软件,EOS负责嵌入系统的全部软、硬件资源的分配、调度作业,控制、协调并发活动;
它必须体现其所在系统的特征,能够通过装卸某些模块来达到系统所要求的功能。
以下对比了几种最常用的嵌入式操作系统。
1.WindowsCE
WindowsCE是微软开发的一个开放的、可升级的32位嵌入式操作系统,是基于掌上型电脑类的电子设备操作。
它是精简的Windows95。
WindowsCE的图形用户界面相当出色。
它的设计目标是:
模块化及可伸缩性、实时性能好,通信能力强大,支持多种CPU。
它不仅继承了传统的Windows图形界面,并且在WindowsCE平台上可以使用Windows9598上的编程工具(如VisualBasic、VisualC++等)、使用同样的函数、使用同样的界面网格,使绝大多数的应用软件只需简单的修改和移植就可以在WindowsCE平台上继续使用。
2.PalmOS
这是一种32位的嵌入式操作系统,主要运用于移动终端上。
此系统最初由3Com公司的PalmComputing部开发,目前PalmComputing已经独立成一家公司。
PalmOS与同步软件HotSync结合可以使移动终端与电脑上的信息实现同步,把台式机的功能扩展到了移动设备上。
它更倾向于PDA的操作系统,在PDA市场占有主导地位。
在编写程序时,PalmOS充分考虑了掌上电脑内存相对较小的情况,因此它只占有非常小的内存。
由于基于PalmOS编写的应用程序占用的空间也非常小(通常只有几十KB),所以,基于PalmOS的掌上电脑(虽然只有几MB的RAM)可以运行众多应用程序。
3.Linux
Linux是一个类似于Unix的操作系统。
它起源于芬兰一个名为LinusTorvalds的业余爱好,但是现在已经是最为流行的一款开放源代码的操作系统。
Linux从1991年问世到现在,短短10年的时间内已发展成为一个功能强大、设计完善的操作系统,伴随网络技术进步而发展起来的LinuxOS已成为Microsoft公司的DOS和Windows9598的强劲对手。
Linux系统不仅能够运行于PC平台,还在嵌入式系统方面大放光芒,在各种嵌入式LinuxOS迅速发展的状况下,LinuxOS逐渐形成了可与WindowsCE等EOS进行抗衡的局面。
目前正在开发的嵌入式系统中,49%的项目选择Linux作为嵌入式操作系统。
Linux现已成为嵌入式操作的理想选择。
嵌入式Linux操作系统与WindowsCE相比的优点:
第一,Linux是开放源代码的,不在存黑箱技术,遍布全球的众多Linux爱好者都是Linux开发者的强大技术支持者;
而WindowsCE是非开放性OS,使第三方很难实现产品定制。
第二,Linux的源代码随处可得,注释丰富,文档齐全,易于解决各种问题。
第三,Linux的内核小、效率高;
而WindowsCE在这方面是笨拙的,占用过多的RAM,应用程序庞大。
第四,Linux是开放源代码的OS,在价格上极具竞争力,适合中国国情。
WindowsCE的版权费用是厂家不得不考虑的因素。
第五,Linux不仅支持x86芯片,还是一个跨平台的系统,移植容易实现。
第六,Linux内核的结构在网络方面是非常完整的,它提供了对包括十兆位、百兆位及千兆位的以太网络,还有无线网络、Tokenring(令牌环)和光纤甚至卫星的支持。
第七,Linux的内核结构是高度可裁减的,WindowsCE在内核结构的设计中并未考虑适应系统的高度可裁减性的要求。
PalmOS、WindowsCE、Linux这三种嵌入式操作系统各有不同的特点,不同的用途;
但Linux比PalmOS和WindowsCE更小、更稳定,而且Linux是开放的OS,在价格上极具竞争力。
当然嵌入式linux操作系统也有其明显不足的地方:
第一,是开发难度较高,需要很高的技术实力;
第二,是核心调试工具不全,调试不太方便,尚没有很好的用户图形界面。
1.1.3Qt开发语言
Qt是一个多平台的C++图形用户界面应用程序框架。
它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。
Qt是完全面向对象的很容易扩展,并且允许真正地组件编程。
自从1996年早些时候,Qt进入商业领域,它已经成为全世界范围内数千种成功的应用程序的基础。
Qt也是流行的Linux桌面环境KDE的基础,KDE是所有主要的Linux发行版的一个标准组件。
Qt支持所有Unix系统,当然也包括Linux,还支持Windows平台。
支持下述平台:
♦MSWindows-95、98、NT4.0、ME、和2000
♦UnixX11-Linux、SunSolaris、HP-UX、CompaqTru64UNIX、IBMAIX、SGIIRIX和其它很多X11平台
♦Macintosh-MacOSX
♦Embedded-有帧缓冲(framebuffer)支持的Linux平台。
Qt
具有下列优点:
1.优良的跨平台特性:
Qt支持下列操作系统:
MicrosoftWindows9598,MicrosoftWindowsNT,Linux,Solaris,SunOS,HP-UX,DigitalUNIX(OSF1,Tru64),Irix,FreeBSD,BSDOS,SCO,AIX,OS390,QNX等等。
2.面向对象
Qt的良好封装机制使得Qt的模块化程度非常高,可重用性较好,对于用户开发来说是非常方便的。
Qt提供了一种称为signalsslots的安全类型来替代callback,这使得各个元件之间的协同工作变得十分简单。
3.丰富的API
Qt包括多达250个以上的C++类,还替供基于模板的collections,serialization,file,IOdevice,directorymanagement,datetime类。
甚至还包括正则表达式的处理功能。
4.支持2D3D图形渲染,支持OpenGL
5.大量的开发文档
6.XML支持
Qt把下面这些特性添加到了C++当中:
♦一种关于无缝对象通讯被称为信号和槽的非常强大的机制,
♦可查询和可设计的属性,
♦强大的事件和事件过滤器,
♦根据上下文进行国际化的字符串翻译,
♦完善的时间间隔驱动的计时器使得在一个事件驱动的图形界面程序中很好地集成许多任务成为可能。
♦以一种自然的方式组织对象所有权的分层次和可查询的对象树。
♦被守护的指针,QGuardedPtr,当参考对象被破坏时,可以自动地设置为无效,不像正常的C++指针在它们的对象被破坏的时候变成了“摇摆指针”。
Qt的授权是分为两条线,商业版和开源版。
如果使用商业版的Qt,那么开发出的程序可以是私有的和商业的;
如果使用的是开源版的Qt,由于其使用的是GPL协议(不是LGPL),那么可发出的程序也必须是GPL的。
Qt自由版是Qt仅仅为了开发自由和开放源码软件
提供的UnixX11版本。
在Q公共许可证和GNU通用公共许可证
下,它是免费的。
Qt嵌入式自由版是Qt为了开发自由软件提供的嵌入式版本。
在GNU通用公共许可证下,它是免费的。
Qt-embedded和Qtopia:
Qt在刚出现的时候,对于Linux和Unix系统,只有构建于Xlib之上的X11版。
但随着Linux操作系统在嵌入式领域的应用日渐广泛,Qt推出了嵌入式的版本Qt-embedded(Qte)。
由于嵌入式受限的硬件环境往往难以运行庞大的X服务器,Qt的嵌入式版跳过了Xlib和XServer直接操作帧缓冲,可以在速度和体积上有很大的提高。
Qtopia最初是上的一个开源项目,全称是QtPalmtopEnvironment,是构建于Qte之上一个类似桌面系统的应用环境,包括了PDA和手机等掌上系统常见的功能如电话簿、日程表等。
现在Qtopia已经成为了Trolltech的又一个主打产品,为基于Linux操作系统的PDA和手机提供了一个完整的图形环境。
值得特别注意的是Qte和Qtopia之间的关系。
在版本4之前,Qte和Qtopia是不同的两套程序,Qte是基础类库,Qtopia是构建于Qte之上的一系列应用程序。
但从版本4开始,Trolltech将Qte并入了Qtopia,并推出了新的Qtopia4。
在该版中,原来的Qte被称为QtopiaCore,作为嵌入式版本的核心,既可以与Qtopia配合,也可以独立使用。
原来的Qtopia则被分成几层,核心的应用框架和插件系统被称为QtopiaPlatform,上层的应用程序则按照不同的目标用户分为不同的包,如QtopaiPDA,QtopiaPhone。
1.2定义
界面:
直接和用户交互的软件结构。
内核:
完成核心功能的,与界面无关的软件结构。
硬件:
嵌入式系统中各种设备的总称。
嵌入式系统:
根据IEEE(国际电机工程师协会)的定义,嵌入式系统是“控制、监视或者辅助装置、机器和设备运行的装置”(原文为devicesusedtocontrol,monitor,orassisttheoperationofequipment,machineryorplants)。
国内一个普遍被认同的定义是:
以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
Qt:
SQLite:
SQLite是D.RichardHipp用C语言编写的开源嵌入式数据库。
2系统需求分析
2.1功能需求
1.建筑定位:
Ø
地图上标示广州主要建筑的位置,实现主要建筑搜索功能,显示与建筑相关信息(简介、历史、用途;
所在区、街道、公交地铁情况),显示附近主要建筑情况(包括附近银行、停车场)。
2.交通定位(公交;
客运站;
码头;
地铁;
火车站):
公交:
查询各路车的行车路线,同时显示行车路线的站点。
点击站点,能在地图上标出该站点的位置,并显示该站点的附近建筑情况;
地铁:
地铁经过的各路线,地铁各出口,附近建筑。
客运站:
显示该客运到省内外的线路;
码头:
显示航班信息;
火车站:
显示该火车站到省内外的线路。
3.道路定位:
在地图上标示出该道路。
4.酒店餐饮定位:
地图上标示酒店店餐的位置,显示附近主要建筑情况,提供该目标的联系方式、服务性质等信息。
5.二级地图的显示:
校园、公园等都有相关建筑分布地图,系统能显示其相关建筑分布地图,即二级地图。
6.地图的缩放:
放大和缩小地图。
7.声音提示功能:
能报读出查询的主要建筑的名称。
8.计算查询所需时间:
显示一次查询所用的时间。
2.2开发环境
2.2.1硬件平台
pc机CPUinterP3赛扬1G内存128+64M
pc机CPUAthlon3000+1.8G内存1G
嵌入式开发板EmbestS3CEB2410(arm9)开发板+仿真器
2.2.2软件开发平台
操作系:
LinuxFedoraCore6,LinuxRedhat9.0
WindowsXP,Windows2000
工具:
EmbestIDE
Cygwin
Arm-Linux-gcc-2.95.3
linux-2.4.18
qtopia-free-1.7.0
qt-embedded-2.3.7
2.2.3开发语言
C
C++
QtEmbedded
2.3运行环境
嵌入式机器+Linux操作系统(包含手机、MP4等)
PC机+Linux操作系统
2.4性能需求
2.4.1时间特性要求
系统稳定,算法效率高,对用户的操作实时响应。
3总体设计
3.1基本设计概念和处理流程
系统数据流图:
0层数据流图
1层数据流图
4系统GUI编程设计
4.1地图移动
4.1.1开始状态
开始的时候,地图转载图片的状态。
在(图一)中,图片处理模块用于处理图片的显示、移动、隐藏。
紫色区域为5×
5个图片处理模块,每个图片处理模块存放有地图图片。
而这5×
5个图片处理模块用一个数组存放着,这数组用图
(二)表示。
浅蓝色区域为地图显示区,显示地图给用户。
在图
(二)中,这表示一个5×
5的数组,用于存放图片处理模块。
白色部分存放着中心地图,浅蓝色表示中心地图的左边部分,绿色表示中心地图的右边部分。
一开始填充5×
5幅图片到有5×
5个图片处理模块的数组上,而用户只能看到地图显示区里面的图片。
片段代码:
变量说明:
centermapnum当前中心地图的编号
MapImage预先定义好的用于存放图片数据的数组指针
m_PictureItem预先定义的图片处理模块数组(5×
5)
m_banck存储一幅白色图片
m_ImageWidth图片的宽度
m_ImageHeight图片的高度
canvas画布
m_vertical保存中心地图在5×
5个图片处理模块数组的行
∙m_--多边形。
∙QCanvasPolygonalItem--非矩形形状的基类。
大多数画布项都派生于此类。
∙QCanvasRectangle--矩形。
此类矩形不能被倾斜或旋转。
绘制可旋转的矩形使用QCanvasPolygon。
∙QCanvasSpline--多重贝塞尔曲线。
∙QCanvasSprite--活动的图片。
∙QCanvasText--文本字符串。
然而“数字城市查询系统”利用了QCanvasRectangle项作为装载图片的基类。
装载图片类的头文件:
#ifndefCPICTUREITEM_H_
#defineCPICTUREITEM_H_
#include<
qcanvas.();
地图向下滚动时,图片项目向上移动
voidup();
地图向上滚动时,图片项目向下移动
voidleft();
voidright();
intQStringtoint(QStringMapName);
QStringinttoQString(intnum);
voidLoadImage(QStringCenterMap);
voidresetItemPosition();
voidShowTheArrowhead(QString&
map,intx,inty,QString&
text,boolflag);
显示箭头
voidSplitTheName(int&
mapnum,int&
leftborder;
}
intgetrightborder(){returnrightborder;
intgettopborder(){returntopborder;
intgetdownborder(){returndownborder;
intgetlefttotal(){returnlefttotal;
intgetrighttotal(){returnrighttotal;
intgettoptotal(){returntoptotal;
intgetdowntotal(){returndowntotal;
intgetimagewidth(){returnm_ImageWidth;
in