第五章 嵌入式系统图形开发
5.1 常用的几种嵌入式GUI 图形开发软件
5.1.1 Microwindows
Microwindows Open Source Project 这个图形开发软件主要针对体积比较小的系统,而且在Linux 操作系统的环境下可以使用交叉编译工具编写出简单的Microwindows 程序;Microwindows 能够对所有的裸显示设备直接进行操作,也就是说即便没有任何操作系统或其他图形系统的支持,Microwindows 的程序仍然可以正常的运行[12]。所以Microwindows 编译出来的程序占用系统的空间很小,这就方便用户对它进行移植。虽然有上述这些优点,Microwindows 的免费版本非常难以到,尤其是在国内还没有对Microwindows 提供全面技术支持的专业公司,这就使得Microwindows 的发展十分缓慢。
5.1.2 TinyX
Tiny X Server 由Keith Pachard 发展起来的,该图形开发软件的作者是XFree86 Project 这个项目的核心成员之一。之后Keith Packard 就以XFree86为基础将比较庞大的X Server 的精简到了几百KB ,于是就形成了Tiny X Server 。针对Tiny X Server 运行在纯XWindow System 的架构下的最大的优点就是具有很好的弹性开发机制,并能大大提高开发速度;因为Tiny X Server 与桌面的传统X Server 架构相同,因此其移
植性要比很多以Qt 、FLTK 、GTK+等为基础开发的软件更加的方便和容易是[13]。虽然Tiny X Server 非常方便移植,但是它的体积还是比较大并且由于它是针对桌面环境开发的,所以在使用时对于桌面环境中的每个复杂功能都要进行“校准和调校”,而往往就是这个时候是最花费时间的,并且有时候还要进行重新改写,这无疑更加浪费时间。
5.1.3 OpenGUI
OpenGUI 最初的名字叫FastGL ,很长时间一来就一直存在于Linux 操作系统上。最开始它仅仅支持256的线性显存模式,由于不断地发展目前也可以支持其他很多显示模式;尽管对于硬件的支持却不是十分强大,目前为止仅仅能支持
X86硬件平台,但是OpenGUI现在支持MS-DOS、Linux和QNX等多种操作系统平台。OpenGUI的结构主要分为三层:最低层是快速图形引擎,该层主要是通过汇编语言的代码实现的;中间层提供了兼容于Borland的BGI API的图形绘制API,包括圆弧、线条、角度、矩形等基本图形;第三层提供了完整的GUI对象集,主要是通过C++实现的。OpenGUI比较适合于X86平台下的实时系统,主要采用LGPL条款发布,但是其可移植性稍差[14]。
5.1.4 MiniGUI
MiniGUI主要是由魏永明先生主持,许多众多自由软件开发志愿者开发的自由软件项目,并且它是面向嵌入式系统或者实时系统的图形用户界面支持系统,主要运行于Linux操作系统的环境下。MiniGUI可以分为GAL层和IAL层,其中前者由于是基于线程结构的,这也就影响了整个系统的可靠性,如果某个进程中某个线程的因为非法反问而造成了意外错误可能导致整个进程收到很大的影响,因此仅仅适合于功能要求单一的场合[15]。
5.1.5 Qt/Embedded
Haavard Nord 和Eirik Chambe-Eng于1991年开始开发了“Qt”,1994年3月4日创立公司,最早名为Quasar Technologies,然后更名为Troll Tech,然后再改为Trolltech,中文名称是“奇趣科技”;但是该公司在2008年6月17日被NOKIA 公司收购,以增强该公司在跨平台软件研发方面的实力,更名Qt Software。
Qt是一个多平台的C++图形用户界面应用程序框架,它是基于面向对象的思想进行相应开发的,支持真正意义上的组件编程,可以为不同用户提供华丽的用户界面[16]。所以,从本质上来说Qt是一个跨平台的C++应用程序开发框架,有时又被称为C++部件工具箱。Qt被用在KDE桌面环境、Opera、Google Earth、Skype、Adobe Photoshop Album和VirtualBox的开发中,是诺基亚(Nokia)的Qt Development Frameworks 部门的产品。使用 Qt只需一次性开发应用程序和用户界面,无须再次重新编写源代码,便可跨不同桌面和嵌入式操作系统部署这些应用程序。
综上所述,本文使用的嵌入式图形开发工具为Qt/Embedded,下文将详细介绍Qt/Embedded的安装、使用和在ARM上的移植。
5.2 Qt的特点和应用领域
5.2.1 Qt的特点
基本上,Qt Windows平台上的MFC、OWL、VCL、ATL是同类型的东西,但是Qt具有下列优点:
(1)优良的跨平台特性
Qt支持下列操作系统: Microsoft Windows 95/98、Microsoft Windows NT、Linux、Solaris、SunOS、HP-UX、Digital UNIX 、Irix、FreeBSD、BSD/OS、SCO、AIX、OS390、QNX等等;
(2)面向对象
Qt 的良好封装机制使得Qt的模块化程度非常高,可重用性较好,对于用户开发来说是非常方便的;
(3)构件支持
Qt提供信号(signal)和槽(slot)概念,并支持对象之间在彼此不知道对方信息的情况下进行合作,这
使得Qt非常适合于真正的构件编程;
(4)友好的联机帮助
Qt提供了大量的联机参考文档,有超文本HTML方式,也有UNIX帮助页Man手册页和补充说明。对于初学者,其中的指南将一步步介绍如何进行Qt编程;
(5)便利性
由于Qt是一种跨平台的GUI工具包,它对编程者隐藏了在处理不同窗口系统时潜在的问题,Qt定义了一些类来隐藏在不同操作系统上不同处理方式下的细节问题;
(6)国际化
Qt为本地化应用提供了完全的支持,所有用户界面文本都可以基于消息翻译表被翻译成各国语言,Qt还支持双字节16bit国际字符标准;
(7)丰富的 API
Qt为专业应用提供了大量的函数,在Qt的API中含有大约250个C++类,大多数的类都是GUI专有的,甚至还包括正则表达式的处理功能;
(8)可用户化外观
Qt支持主题,基于Qt的应用程序能够在Windows外观、Motif外观,以及其它一些用户化外观主题之间切换;
(9)完整的一套组件工具
Qt编程的基本模块称之为组件,组件是用户界面的组成部分,Qt含有用来创建专业外观的用户界面所需要的所有组件;
(10)支持 2D/3D 图形渲染,支持 OpenGL。
5.2.2 Qt的应用领域
有很多出名的例子是都是使用Qt开发的,主要有以下实例:Arora(一款跨平台的开源网页浏览器)、eva(Linux版QQ聊天软件)、FreeMat(一个自由开源的数值计算环境和编程语言)、Gadu-Gadu(即时通信软件)、Google地球(Google Earth——三维虚拟地图软件)、ImageVis3D、KDE(著名的桌面环境)、Elibs(一个许多KDE程序都使用的共享库,如Amarok、K3b、KDevelop、KOffice 等)、Last.fm播放器(著名的互联网音乐社区网站的桌面客户端)、Motorola A760(UI以 Qt/Embedded建构)、MythTV9(开源的数字视频录制软件)、Opera(著名的网页浏览器)、Qterm(跨平台的BBS软件)、Q
t Extended、Quantum GIS、Skype(一个使用人数众多的基于P2P的VOIP聊天软件)、SMPlayer(跨平台多媒体播放器)、TeamSpeak(跨平台的音效通信软件) 、VirtualBox(虚拟机软件)、Xconfig(Linux 的Kernel配置工具)、Chmcreator(开源的chm开发工具)等各种软件或者平台。
5.3 Qt开发详细介绍
5.3.1 Qt/Embedded架构
Qt/Embedded以原始Qt为基础,并做了许多出的调整以使它适用于嵌入式环境。Qt/Embedded与以往的Qt/X11相比,主要是通过Qt API与Linux I/O设施直接交互,来作为嵌入式Linux的端口;因为Qt/Embedded主要采用framebuffer 作为底层图形接口而并不再需要Xlib库,因此非常节省资源。对于外部的输入设备Qt/Embedded均把它们抽象成为鼠标和键盘的输入事件。另外,为了避开繁琐使用Xlib/Server系统,Qt/Embedde支持直接读写内核缓冲帧,从而大大节省了系统的资源。
5.3.2 Qt/Embedded窗口系统
通常情况下每个Qt/Embedded窗口系统都可以包含一个或者多个进程,作为服务器的一个服务进程可以产生鼠标和键盘事件并且可以分配客户显示区域。另外,这个服务进程其实就是一个有某些额外权限的客户进程,因为它可以提供一个用户接口和输入方法给客户端的某个运行起来的应用程序。
客户与服务器之间的通信是使用共享内存的方法实现的,共享内存是进程间通讯的最高效的方式,这样能使得通讯的数据传输能够及时的送达,提高整体速度。它的通信量需保持最小,这便就是Qt/Embedded库内部层次分明的处理过程。客户端的主要工作之一是消息的交换,通过使用QCOP通道来完成,而服务进程的工作则比较简单,仅仅需要做的是广播QCOP消息给所有监听指定通道的应用进程,接着应用进程就可以通过原先设定的将特定的信号与特定的槽想关联,把一个插槽连接到一个负责接收的信号上面了,从而就对消息做出响应并通过调用响应函数进行处理。消息的传递通常伴随着二进制数据的传输,对于二进制数据的传输,本文采用了一个QDataStream类的序列化过程来完成的。同时,QT系统中有这样一个类Qproces类,它为用户提供了另外一种异步的进程间通信机制,用于启动一个外部的程序,同时用户可以通过写一个标准的输入和读取外部程序的标准输出和错误码来和它们进行通信。
5.3.3 Qt/Embedded信号和插槽机制
信号和插槽机制是Qt的核心机制,也是QT的核心特性。 QT有着自身的特点,不同于其他界面开发软件,其中一个重要的地方,便是信号与插槽机制,因此精通Qt编程是基于对信号和插槽机制有着深入的了解;信号和插槽是一种高级接口,很好的解决了对象与对象之间的通信问题,也是Qt区别于其他工具包的重要地方。信号和插槽是Qt自行定义的一种通信机制,QT编程语法是完全符合标准C/C++语言的,但是信号与插槽机制却是独立于标准的C/C++,因此要正确的处理信号和插槽,必须借助一个称为moc
(Meta Object Compiler)的Qt 工具,该工具是一个C++预处理程序,它为高层次的事件处理自动生成所需要的附加代码。
信号与插槽机制是一种强有力的对象间通信机制,因此完全可以取代原始的回调和消息映射机制。能够满足用户需要携带任意数量和任意类型的参数,它们本质上是类型完全安全的,因此就不会像回调函数那样产生core dumps,使用起来方便快捷,在取代了标准C/C++语言中的函数指针后,使得程序不但简洁而且通俗易懂。
server系统和普通系统的区别所有从QObject或其子类(例如Qwidget)派生的类都能够包含信号和槽的机制。一个类对应着一个特殊的对象,当特定的对象状态发生改变时,信号就由该对象发射出去了,这时,这个对象就完成了它的全部工作了,但是这个对象它实际上并不知道这个信号是由谁来接收;这就是所谓的信息封装,用于确保对象被当作一个真正的软件组件来使用。插槽主要用于接收信号,但却通常作为普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接,只是单纯地在

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。