文档库 最新最全的文档下载
当前位置:文档库 › 第 7 章 基于QT的嵌入式GUI程序设计

第 7 章 基于QT的嵌入式GUI程序设计

第 7 章 基于QT的嵌入式GUI程序设计
第 7 章 基于QT的嵌入式GUI程序设计

第7章基于QT的嵌入式GUI程序设计基础

随着信息技术的迅速发展和芯片制造工艺的不断进步,人类已经进入一个全新的数字时 代, 数字化产品空前繁荣,嵌入式系统被应用于空前广泛的领域:从军事电子设备、现代 武器到工业过程控制,从网络通信、办公自动化到消费电子领域,到处都有嵌入式系统的身 影。嵌入式产品将与人们的生活结合的越来越紧密,嵌入式Linux由于它的开源性、内核的 健壮性和稳定性、可裁减性、有着专业的商业公司和世界顶尖的自由软件开发者的支持和维 护等各方面优势,吸引了嵌入式开发商的目光,成为了嵌入式操作系统的新宠。

在嵌入式Linux 上开发系统软件和应用程序一直缺乏强大的开发环境。普通Linux 有 自己标准的GUI 系统X-Windows,但是由于X-Windows过于庞大和臃肿,极耗系统资源,而 且其中不少功能对于嵌入式系统来说是多余的,不适于资源有限的嵌入式系统使用。嵌入式 系统与传统计算机系统相比更专门化,其软硬件设计直接从具体应用出发,嵌入式Linux 是 应用于嵌入式设备开发上的一种操作系统。通常嵌入式设备中的GUI 系统占据资源较多,因 此对GUI 的筛选显得很重要。嵌入式Linux 需要高性能、轻量级的GUI 系统,于是 Qt/Embedded 的出现,很大程度上解决了在使用嵌入式Linux作为操作系统的移动设备上开 发应用软件的难题。

7.1 嵌入式GUI简介

早期嵌入式系统功能简单,对图形用户界面需求并不是太大。例如,在相对简单的、以单片机为核心的简单工控系统中,人机交互通常以LED和按键相结合的方式,随后才有了简单的屏幕。这些只是简单的输入、输出系统,不能被称为“GUI系统”。另外,图形系统对硬件要求太高,在当时的嵌入式上实现几乎没有可能。

随着嵌入式系统的发展和普及,嵌入式系统越来越复杂,其功能越来越强大,GUI在嵌入式系统中的作用也就显得越来越突出。当智能手机、PDA等系统出现后,嵌入式系统已经不是仅仅给个别专业操作人员所使用的,而需要适用于很广泛的群众。虽然在传统的嵌入式控制领域,人机交互的内容并不是很复杂,但是使用者同样需要更友好的界面。因此,GUI在嵌入式系统中的普及是大势所趋。GUI系统需要最终向用户提供输出和输入两个方面。在输出方面,GUI系统向用户提供一个图形化的界面,在输入方面,GUI系统需要接受用户的操作,从而达到通过界面控制系统的目的。

目前,应市场需求产生了一些高级嵌入式GUI工具包,这使得嵌入式操作系统下的图形开发成为可能,而且易于编写出更好、更漂亮的界面。

7.1.1 嵌入式GUI的特点

嵌入式系统中的GUI就是在嵌入式系统中为特定的硬件设备或环境而设计的图形用户界面系统,它为嵌入式系统提供了一种人机交互接口。由于受到当前嵌入式系统本身特点的影响,并受其发展限制,嵌入式系统中的GUI应该有如下特点:

1. 系统开销少:体积小,占用的存储空间少、运行时耗用的系统资源小。

相对PC系统,嵌入式系统的资源都是相对有限的。系统的资源包括,包括处理器的频率、Flash的空间和RAM空间等几个部分。在嵌入式系统中,不但资源有限,而且通常还运行着一

些比GUI系统更重要的程序。因此,嵌入式GUI系统必须具有开销小的特点,不能抢占系统过多的资源。从编译的角度,GUI子系统代码规模要有限制,避免占用太多的Flash;从运行的角度,GUI子系统的处理器开销和内存开销也是需要严格限制的。如果占用系统资源太多,不但GUI系统将无法正常运行,甚至造成整个系统无法工作。

2. 高度可移植。

相比通用计算机系统统一的软硬件结构,各个不同的嵌入式系统之间相差较大。作为一款成功的嵌入式GUI系统,应该能在不同的嵌入式平台中运行,这就需要嵌入式GUI系统具有较高的可移植性。

GUI系统的可移植性,主要体现在操作系统和硬件结构两个方面。

在操作系统方面,由于嵌入式GUI系统需要建立在操作系统提供的一定机制上面,而不同的操作系统提供的机制完全不同。为了能在不同的操作系统中运行,嵌入式GUI就需要具有一定的可移植层来支持不同的操作系统。

硬件方面又包括了CPU体系结构、输出设备、输入设备等方面:适应不同CPU体系结构,需要嵌入式GUI系统的代码可以在不同的编译器上编译,一般来说C语言实现的系统可以满足这个要求,但使用特定体系结构汇编的实现就不能适应这种需求;输出设备和输入设备在不同的嵌入式系统中相差也很大,这也要求嵌入式GUI系统可以支持不同系统的硬件接口。

3. 可裁减性,以适应不同的功能需求。

在嵌入式应用中,由于不同的系统相差较大,因此嵌入式GUI系统最好具有一定的可裁剪性,从而适应不同系统的需求。成功的嵌入式GUI系统需要适应不同嵌入式应用的需求。

GUI系统可以提供很多的功能,但是在所有的功能并不是都要在某种特定系统上使用,可以根据实际应用区情况去掉不相关的功能来节省系统的开销。

4. 具有高可靠性。

嵌入式系统对稳定性和可靠性有很严格的要求。个人PC的崩溃可以通过重新启动等方式弥补,但是嵌入式系统的崩溃就可能导致无法挽回的严重后果。因此嵌入式GUI系统,需要具有更强的稳定性。

事实上,在一些嵌入式系统中,缺少了不同任务的保护机制,整个系统运行在一个内存空间内,因此,由于一个子系统的问题导致整个系统崩溃的概率更高。对于嵌入式GUI系统,一方面需要有较高的稳定性,减少崩溃的概率;另一方面,在GUI系统已经崩溃的情况下,也需要确保尽量较少影响其它子系统的工作,将问题控制在一定范围内。

5. 在某些应用场合应具备实时性。

嵌入式系统一般来说也是实时系统,要求系统能够在限定的响应时间内提供所需服务,因而,嵌入式GUI要求是轻量级的、实时的。

7.1.2 常用嵌入式GUI系统

目前,市场占有率较高嵌入式GUI系统有MicroWindows、MiniGUI、OpenGUI、Qt/Embedded。下面对这几种GUI系统进行简单的介绍、分析和比较。

1.MicroWindows

MicroWindows是一个开放源码的GUI项目,基本上用C语言实现,由美国Century Software 公司主持开发。MicroWindows支持Intel 16位和32位CPU、MIPS R4000以及ARM芯片。该项目的开发一度非常活跃,国内也有人参与了其中的开发,并编写了GB2312 等字符集的支持。但在Qt/Embedded 发布以来,该项目变得不太活跃,并长时间停留在0.89Pre7 版本。可以说,以开放源码形势发展的MicroWindows 项目,基本停滞。

MicroWindows 是一个基于典型客户/服务器体系结构的 GUI 系统,基本分为三层。最底

层是面向图形输出和键盘、鼠标或触摸屏的驱动程序;中间层提供底层硬件的抽象接口,并进行窗口管理;最高层分别提供兼容于 X Window 和 Windows CE(Win32 子集)的 API。 该项目的主要特色在于提供了类似 X 的客户/服务器体系结构,并提供了相对完善的图形功能,包括一些高级的功能,比如 Alpha 混合,三维支持,TrueType 字体支持等。但需要注意的是,MicroWindows也有一些通用的窗口控件,MicroWindows 的图形引擎存在许多问题,可以归纳如下:

1)无任何硬件加速能力。

2)图形引擎中存在许多低效算法,同时未经任何优化。比如在直线或者圆弧绘图函数中,

存在低效的逐点判断剪切的问题。

3)代码质量较差。由于该项目缺少一个强有力的核心代码维护人员,因此代码质量参差

不齐,影响整体系统稳定性。这也是 MicroWindows 长时间停留在 0.89Pre7 版本上

的原因。

其主要特色:

1)跨平台

2)不需 X Server

3)采用 FLTK Toolkits

4)支援 TrueType 字型

2.MiniGUI

MiniGUI是由北京飞漫软件技术有限公司主持的一个自由软件项目(遵循GPL条款),是国内最早出现的几个自由软件项目之一。其目标是为基于Linux的实时嵌入式系统提供一个轻量级的图形用户界面支持系统。该项目自1998 年底开始,到目前为止,已经非常成熟和稳定。它可以运行在任何一种具有POSIX线程支持的POSIX兼容系统上,主要运行于Linux 控制台。

MiniGUI分为底层的GAL(图形抽象层)和IAL(输入抽象层),向上为基于标准POSIX 接口中pthread库的Mini-Thread架构和基于Server/Client的Mini-Lite架构。其中Mini-Thread 受限于Thread模式。进程中某个Thread的意外错误可能导致整个进程的崩溃,从而对于整个系统的可靠性影响较大,因而,该架构主要应用于系统功能较为单一的场合。Mini-Lite应用于多进程的应用场合,采用多进程运行方式设计的Server/Client架构能够较好地解决各个进程之间的窗口管理、Z序剪切等问题。MiniGUI-Lite上的每个程序是单独的进程,每个进程也可以建立多个窗口。

MiniGUI的GAL层技术是基于SVGA Lib、LibGDI库、FrameBuffer的native图形引擎。IAL层则支持Linux标准控制台下的GPM鼠标服务、触摸屏及标准键盘等。

MiniGUI为应用程序定义了一组轻量级的窗口和图形设备接口。利用这些接口,每个应用程序可以建立多个主窗口,然后在这些主窗口中创建按钮、编辑框等控件。MiniGUI还为用户提供了丰富的图形功能,帮助你显示各种格式的位图并在窗口中绘制复杂图形。

MiniGUI利用GAL和IAL,MiniGUI可以在许多图形引擎上运行,并且可以非常方便地将MiniGUI移植到其他系统上,而这只需要根据抽象层接口实现新的图形引擎即可。MiniGUI 借鉴著名的跨平台游戏和多媒体函数库SDL的新GAL接口即NEWGAL。提供了更快、更强的位块操作,视频加速支持及Alpha混合等功能。

MiniGUI提供了完备的多窗口机制和消息传递机制,提供了常用的控件类,包括静态文本框、按钮、单行和多行编辑框、列表框、组合框、进度条、属性页、工具栏、拖动条和树型控件等。支持各种流行图像文件,包括JPEG、GIF、PNG、TGA、BMP等;支持汉字输入法,包括内码、全拼、智能拼音等。用户还可以从飞漫软件获得五笔、自然码等输入法支持;另外,支持Windows兼容的资源文件,如位图、图标、光标等。

3.OpenGUI

OpenGUI最初的名字叫FastGL,当时,只支持256 色的线性显存模式,但目前也支持其他显示模式,并且支持多种操作系统平台,比如MS-DOS、QNX 和Linux 等等,不过目前只支持x86 硬件平台。OpenGUI 也分为三层。最低层是由汇编编写的快速图形引擎;中间层提供了图形绘制API,包括线条、矩形、圆弧等,并且兼容于Borland 的BGI API。第三层用C++ 编写,提供了完整的GUI 对象集。

OpenGUI基于一个用汇编实现的x86图形内核,实现了一个高层的C/C++图形/窗口接口,提供了二维绘图原语、消息驱动的API及BMP文件格式支持。OpenGUI功能强大,使用方便,支持鼠标和键盘的事件,在Linux上基于Framebuffer或者SVGALib实现绘图。由于其基于汇编实现的内核并利用MMX指令进行了优化,OpenGUI运行速度非常快。由于其内核用汇编实现,可移植性受到了影响。通常在驱动程序一级,性能和可移植性是相互矛盾的。

OpenGUI 采用 LGPL 条款发布, 比较适合于基于 x86 平台的实时系统,可移植性稍差,目前的发展也基本停滞。

4.Qt/Embedded

Qt/Embedded 是著名的Qt库开发商TrollTech开发的基于frame buffer 的、面向嵌入式系统的Qt 版本。因其面向对象、跨平台和界面设计更美观而得到广泛的应用。现在,Qt/Embedded 被广泛地应用于各种嵌入式产品和设备中,从消费电器(如智能手机、机顶盒)到工业控制设备(如医学成像设备、移动信息系统等)。

Qt/Embedded 是一个跨平台的C++图形用户界面应用程序框架,其对象容易扩展,可移 植性好。并且,由于KDE 等项目使用 Qt 作为支持库,所以由许多基于Qt 的X Windows程序可以非常方便地移植到Qt / Embedded 版本上。

美中不足是其C++接口对某些应用来讲比较臃肿,而且如果在商品化产品中使用这个库,对硬件的性能要求比较高。

关于Qt / Embedded的技术细节将在后面详细介绍。

7.2 Qt概述

7.2.1 Qt版本

目前包括Qt、基于Framebuffer 的Qt Embedded和嵌入式桌面平台Qtopia。

1. Qt

Qt泛指Qt的所有桌面版本,比如Qt/X11,Qt Windows,Qt Mac等。是一个跨平台的C++图形用户界面应用程序开发框架,是开发源代码KDE 桌面环境的基础。Qt 以工具开发包的形式提供给开发者,这些开发包包括了图形设计器,Makefile制作工具、字体国际化工具和Qt 的C++类库等。

Qt无须“虚拟器”,模拟层或大容量的运行时间环境。它如本地化的应用程序一样,直接写入低级的图形函数,因而Qt程序能以源代码速度执行。

Qt API在所有支持的平台上都是相同的,Qt工具在这些平台上的使用方式也一致,因而Qt应用的开发和部署与平台无关,具有显著的跨平台特性。

Qt 支持下列平台:

?Qt/Windows (Microsoft Windows XP, 2000, NT 4, Me/98)

?Qt/Mac (Mac OS X)

?Qt/X11 (Linux, Solaris, HP-UX, IRIX, AIX, 与其它许多Unix 变式)

图7.1 为Qt/ X11和Qt/Windows 版本在各自对应的操作系统之上的系统架构框图。从图中可以看出,Qt 针对不同操作系统发布的不同版本,它们所提供的Qt API 是相同的。从开发角度,程序员不必关心当前的操作系统是哪一种,只需要调用同一套API 来实现他们的应用即可。

图7.1 Qt/ X11和Qt/Windows 的系统架构框

2. Qt/Embedded

Qt/Embedded 是Qt 的嵌入式版本(简称QtE ),它提供的API 与Qt 桌面版本的API 相同,经过编译使用Qt 创建的应用程序即可运行在Qt/Embedded 上。Qt/Embedded 采用帧缓冲(Frame Buffer )作为底层图形接口。它包括一组完备的GUI 类、操作系统封装、数据结构类、功能类和组合类。它还包含一个虚拟帧缓冲器,使得开发人员可以在桌面系统上进行编写测试和调试。大部分Qt 的应用程序可以经过简单的编译与重设窗口大小移植到Qt/Embedded 。Qt/Embedded 类库完全采用C++封装,并且有着丰富的控件资源以及较好的可移植性。

Qt/Embedded 与Qt/ X11的的系统架构对比如图7.2 所示。从图中可以看出,Qt/Embedded 不依赖于X Server 和X lib ,或者说不需要X Windows 系统,从而无需建立这一个软件层。Qt/E 直接访问Frame Buffer ,只需要一个Qt/E 的动态库就足以替代X Server 、X lib 和其他嵌入式解决方案的图形工具包,这样做的最显著效果是减少了内存消耗。

图7.2 Qt/Embedded 与Qt/ X11的的系统架构对比

3. Qtopia

Qtopia 是基于QT/Embedded 开发的一个嵌

入式的窗口系统和应用程序集。Qtopia 平台包含

在Qt/Embedded 基础上构建消费电子产品所需要

的所有功能,它包括具有整套窗口操作系统的应

用程序启动程序、快速应用程序启动、包装系统

应用程序安装、红外线/蓝牙通讯、本地化框架、

基于通用插件的框架、警报服务器、PIM 数据API

游戏和多媒体、输入法以及工作辅助应用程序。

Qtopia是基于Qt的一个桌面程序,往其中安装应用程序需要一个桌面文件,图标文件以及相应的可执行文件。图7.3是一个Qtopia桌面系统的例子。

Qtopia是一个面向嵌入式Linux的全方位应用程序开发平台,同时也是用于基于Linux 的PDA(个人数字助理),智能电话(Smartphone)以及其他移动设备的用户界面。简单地说,Qtopia实质上是一组关于PDA和智能电话的应用程序结合,如果需要开发这类产品可以在这组程序的基础上迅速构建出PDA或者智能电话。Qtopia实质上依赖Qt/Embedded。

Qtopia是一个构建于Qt/E之上的类似桌面系统的应用环境。相比之下,Qt/E是基础类库。

4. Qtopia Core

就是原来的Qt/E,从Qt 4.1开始改名,把Qtopia Core并到Qtopia的产品线中去了。但实际上Qtopia Core就相当于原来的Qt/E,仍然作为基础类库。最近ThrollTech又把Qtopia Core改名叫做Qt for Embedded Linux了。

7.2.2 Qt/E的特点

1. 跨平台

如前所述,Qt支持Windows、Unix/Linux、Mac OS等多种平台。这种跨平台特性为基于Qt的GUI应用程序的开发提供了极大的便利性。开发人员可以先在宿主机上开发Qt GUI应用程序,开发完成后直接将代码移植到相应版本的Qt/Embedded上进行编译。因而,Qt 是一个以“一次编码,处处编译”的方式开发跨平台GUI应用程序的综合框架。

注意:Qt 的“一次编码,处处编译”的跨平台特性与JAVA所谓的“一次编译,处处执行”的跨平台特性从本质上是不同的。

2. 工具丰富

提供了构建(qmake)、可视化设计(uic和qt designer)、国际化(linguist)、文档系统(assistant)等一系列非常好用的工具。

3. 丰富的API函数

?Qt/Embedded 也可以看成是一组用于访问嵌入式设备的Qt C++ API;

?Qt/Embedded 的Qt/X11,Qt/Windows 和Qt/Mac版本提供的都是相同的API和工

具。

4. 运行需要资源少、功能强大

相对X窗口下的嵌入解决方案而言,Qt/Embedded只要求一个较小的存储空间(Flash)和内存。Qt/Embedded可以运行在不同的处理器上部署的Linux系统,只要这个系统有一个线性地址的缓冲帧并支持C++的编译器。

5. 功能可裁剪

Qt/Embedded 提供了大约200个可配置的特征。

7.2.3 Qt主要工具

Qt/Embedded的应用程序也可以使用标准工具在用户熟悉的环境下的工具开发,如Window平台下的Visual C++和Borland C++ Builder,Unix平台下的KDevelop等。Qt/Embedded 提供了许多支持嵌入式开发的工具,如:qmake、Qt Designer、uic、moc、QT Linguist、QT Assistant 等。

1. Qmake

qmake是Trolltech公司创建的用来为不同的平台和编译器书写Makefile的工具。

手写Makefile是比较困难并且容易出错的,尤其是在需要给不同的平台和编译器组合写几个Makefile的情况下。开发者使用qmake -project创建一个简单的“项目”文件;进而运行qmake生成所需的Makefile。qmake考虑了所有的编译器和平台的依赖性,可以把开发者解放出来只关心他们的代码。Trolltech公司使用qmake作为Qt库和Qt所提供的工具的主要连编工具。

qmake也注意了Qt的特殊需求,可以自动的包含moc和uic的连编规则。

2. QT Designer

是一个功能强大的GUI 布局与窗体构造器,能够在所有支持平台上,以本地化的视图外观与认知,快速开发高性能的用户界面。通过QT Designer,可以用拖拽的方式将控件排布在界面上,支持layout,支持signal/slot编辑。生成的文件保存为ui格式,ui是xml格式的普通文本文件,默认编码为utf8,所以界面上还可以直接写中文。

3. QT Linguist

被称为Qt语言家的Linguist是用于界面国际化的重要工具,使用QT Linguist,开发小组可把应用程序的翻译转换外包给非技术性翻译人员,从而可增加精确度,大大加快本地化处理过程。要注意的是,其实它并不能帮你翻译,它的主要任务只是读取翻译文件、为翻译人员提供友好的翻译界面。

4. QT Assistant

类似MSDN的文档查看工具,支持html的子集(图片、超链、文本着色),支持目录结构、关键字索引和全文搜索,可以很方便的查找Qt的API帮助文档,所以是编程必备、使用率最高的工具。

5. uic

uic是从XML文件生成代码的用户界面编译器,用来将file.ui文件生成file.h和file.cpp文件(命令如:uic -o file.h file.ui uic -o file.cpp file.ui),但生成的这两个文件不是标准的纯C++代码,通常称为Qt的C++扩展,因为Qt的对象间运用了信号和插槽的通信机制,在文件中用Q_OBJECT宏来标识。

6. moc(元对象编译器)

moc用来解析一个C++文件中的类声明并且生成初始化对象的C++代码,moc在读取C++源文件,如果发现其中一个或多个类的声明中含有Q_OBJECT宏,就给出这个使用Q_OBJECT 宏的类生成另外一个包含元对象代码的C++元文件;元对象代码对信号插槽机制、运行时的类型信息和动态属性系统是需要的。

7.qtdemo

Qt例子和演示程序的加载器,也可以看作是Qt提供的一个有用的工具。有了这个工具,用户可以很方便的查看Qt提供的多姿多彩的例子程序,从中选择自己需要的,不仅可以看到程序运行的情况,还可以查看源码和文档。

7.3 Qt/E开发环境的搭建

一般来说,基于Qt/Embedded开发的应用程序最终会发布到安装有嵌入式Linux操作系统的小型设备上,所以使用装有Linux操作系统的PC机或者工作站来完成Qt/Embedded开发当然是最理想的环境,尽管Qt/Embedded也可以安装在Unix和Windows系统上。

在搭建基于Linux的Qt/Embedded开发环境之前,我们先来了解Qt/E应用程序开发流程,如图7.4所示。

7.3.1 Qt/E应用程序开发流程

从开发流程中可以看出,Qt/Embedded开发环境包括两部分:Qt开发环境,即x86编程调试环境;Qt/E开发环境,即Arm编译调试环境。首先在Qt开发环境下使用Qt designer等工具设计、编写、调试应用程序;然后,在确认没有问题后使用Qt/E开发环境(其实,主要就是包括Qt/E的qmake、库和arm-linux-gcc、arm-linux-g++编译器)重新编译Qt应用程序。由于Qt跨平台的特性,这个过程一般不会出报错。最后将交叉编译生成的应用程序用NFS或其他方式调试应用程序,直至开发完成。

因而,Qt/Embedded开发环境的搭建主要包括搭建Qt开发环境和Qt/E开发环境。

图7.4 Qt/E应用程序开发流程

搭建Qt/X11环境和Qt/E环境先要准备好Qt、Qt/E源代码及相关编译器。一般来说,发布一个Qt版本的同时也会发布一个相应的Qt/E版本。在搭建开发环境的时候,一般来说要求Qt 和Qt/E的版本号是相同的。目前正在使用的有Qt2、Qt3和Qt4三大类Qt版本,每大类下有很多子版本,目前的最新版本是Qt4.6.2。Qt和Qt/E的编译和具体的Linux环境(比如GNU工具链)有关,对于某一Linux环境,有些Qt和Qt/E版本的源程序编译可能通不过。另外,Qt2、Qt3的编译比较快,Qt4则很耗时,因每台机器配置不同,一般需要2-12小时。

本教材实验使用的版本是Qt4.4.0,包括两个文件:

qt-embedded-linux-opensource-src-4.4.0.tar.bz2

qt-x11-opensource-src-4.4.0.tar.gz

使用的交叉编译器版本是:gcc-3.4.6-glibc-2.3.6

7.3.2 搭建Qt/X11环境

安装之前先从Trolltech公司主页上下载qt-x11-opensource-src-4.4.0.tar.gz文件包,并保存在某一目录下(不妨为/root/qt4/for_pc/)。接下去就可以解压缩进行安装了。

1. 解压缩qt-x11-opensource-src-4.4.0.tar.gz软件包

cd /root/qt4/for_pc/

tar xzvf qt-x11-opensource-src-4.4.0.tar.gz

cd qt-x11-opensource-src-4.4.0

解压缩后会生成/root/qt4/for_pc/qt-x11-opensource-src-4.4.0目录,编译、安装Qt所需

要的脚本文件、源程序和说明文档等其他资料全在这个目录及其子目录下。如下所示:

[root@vm-dev qt-x11-opensource-src-4.4.0]# ls

bin examples LICENSE.GPL3 qmake

changes-4.4.0 GPL_EXCEPTION_ADDENDUM.TXT LICENSE.QPL README

config.status GPL_EXCEPTION.TXT Makefile src

config.tests include mkspecs tools

configure INSTALL OPENSOURCE-NOTICE.TXT translations

demos lib plugins

doc LICENSE.GPL2 projects.pro

2. 运行configure配置脚本

./configure -prefix /usr/local/Trolltech/Qt-x11-4.4.0

这时会出现一个询问是不是同意GPL/QPL协议的问题,回答yes就可以继续进行下去了。

-prefix /usr/local/Trolltech/Qt-x11-4.4.0设置Qt的安装目录。该脚本运行后的最后

结果是生成编译、安装所需的Makefile文件。

3. 编译Qt源程序

[root@vm-dev qt-x11-opensource-src-4.4.0]#gmake

Qt源程序的编译需要很长的时间,根据机器的配置不同而不同。

4. 安装Qt

[root@vm-dev qt-x11-opensource-src-4.4.0]#gmake install

这一步完成后可以在目录/usr/local/Trolltech/Qt-x11-4.4.0/下看到Qt的库文件、头文件、工

具等,如下:

[root@vm-dev qt-x11-opensource-src-4.4.0]# ls /usr/local/Trolltech/Qt-x11-4.4.0

bin doc include mkspecs plugins translations

demos examples lib phrasebooks q3porting.xml

5. 设置环境变量

安装目录/usr/local/Trolltech/Qt-x11-4.4.0/bin里有Qt的常用工具,比如:qmake、uic、designer

等。为方便使用这些工具,还需要设置环境变量(否则,使用这些工具需要使用绝对路径)。

打开/root/.bash_profile文件,修改PATH值如下:

PATH=/usr/local/Trolltech/Qt-x11-4.4.0/bin:$HOME/bin:/opt/crosstools/gcc-3.4.6-glibc-2.3.6/bin: $PATH

export PATH

修改完成后需要用source命令重新运行修改的脚本,是设置立即生效;当然,也可以重新启动系统。

source /root/.bash_profile

这样就可以直接使用qmake、uic、designer等Qt工具了。如运行which qmake命令就可以找到qmake工具了:

[root@vm-dev qt-x11-opensource-src-4.4.0]# which qmake

/usr/local/Trolltech/Qt-x11-4.4.0/bin/qmake

7.3.3 搭建Qt/E环境

准备好Qt/E软件包qt-embedded-linux-opensource-src-4.4.0.tar.bz2,并保存在某一目录下(不妨为/root/qt4/for_arm/)。如果Qt应用程序要支持触摸屏,还需要安装触摸屏库,准备好触摸屏库tslib-1.4.tar.bz2(同样保存在/root/qt4/for_arm/下),先安装接tslib1.4触摸屏库。

1、编译、安装tslib1.4触摸屏库

cd /root/qt4/for_arm/

tar xjvf tslib-1.4.tar.bz2

cd tslib-1.4

vi build.sh

#/bin/sh

export CC=arm-linux-gcc

./autogen.sh

echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache

./configure --host=arm-linux --cache-file=arm-linux.cache

--prefix=$PWD/../tslib1.4-install

make

make install

这样,在/root/qt4/for_arm/tslib1.4-install下安装了tslib1.4触摸屏库。

[root@vm-dev qt-embedded-linux-opensource-src-4.4.0]# ls ../tslib1.4-install/

bin etc include lib

2、编译、安装QT/E库

cd /root/qt4/for_arm/

tar xjvf qt-embedded-linux-opensource-src-4.4.0.tar.bz2

cp -a tslib1.4-install/lib/* qt-embedded-linux-opensource-src-4.4.0/lib/

cp -a tslib1.4-install/include/ts* qt-embedded-linux-opensource-src-4.4.0/include/

cd qt-embedded-linux-opensource-src-4.4.0

./configure -embedded arm -xplatform qws/linux-arm-g++ -depths 16 -little-endian

-no-mouse-linuxtp -qt-mouse-tslib -I/root/qt4/for_arm/tslib1.4-install/include

-L/root/qt4/for_arm/tslib1.4-install/lib -qt-kbd-tty -qt-kbd-usb -prefix

/mnt/nfs/Trolltech/qt-embedded-4.4.0

make

make install

从上面的命令中可以看到,为支持触摸屏,需要先将编译出来的触摸屏库和头文件拷贝到Qt/E相应的库目录和头文件目录中。

这里的configure配置是:

?-embedded arm :指定处理器平台是arm

?-xplatform qws/linux-arm-g++:目标平台为arm-linux

?-little-endian:目标平台为小端存储格式

?-depths 16 :指定每像素的位数

?-no-mouse-linuxtp-qt-mouse-tslib:触摸屏协议不支持linuxtp,支持tslib,并在后

面添加上刚才编译的tslib的头文件和库。

?-qt-kbd-usb :键盘支持tty和usb协议。

?-prefix :指定安装路径是/mnt/nfs/Trolltech/qt-embedded-4.4.0。-prefix 选

项要特殊注意,该指定目录必须要与实际NFS目录对应,否则字体会出现错误。

这一步完成后可以在目录/mnt/nfs/Trolltech/qt-embedded-4.4.0/下看到Qt/E的库文件、头文件、工具等,如下:

ls /mnt/nfs/Trolltech/qt-embedded-4.4.0/

bin demos examples include lib mkspecs plugins translations

使用这些工具需要输入绝对路径,比如编译Qt/E的应用程序使用/mnt/nfs/Trolltech/

qt-embedded-4.4.0/bin/qmake。由于Qt/X11也有qmake工具,因而不能在设置PATH环境变量来查找Qt/E的qmake了,只好使用绝对路径。

关于Qt触摸屏的支持,需要触摸屏驱动模块,并对触摸屏进行标定,本教程不再讲述,读者可参考相关的参考资料。

至此,完成了Qt/E开发环境的搭建。

7.4 Qt/E应用程序的编译和运行

下面通过一个Qt小程序(只有一个主程序hello.cpp)说明Qt/E应用程序的编译和运行。本节只介绍Qt/E应用程序的编译和运行,不讲解Qt的编程。关于Qt程序设计,将在后面来深入学习。

程序如下:

#include

#include

int main(int argc, char *argv[])

{

QApplication app(argc,argv);

QPushButton hello("Hello World !");

hello.show();

QObject::connect(&hello,SIGNAL(clicked()),&app,SLOT(quit()));

return app.exec();

}

7.4.1 宿主机上编译运行

将以上程序代码保存为hello.cpp ,并存放在/root/qt/hello 目录下。

程序编译步骤如下:

1.生成工程文件

查看发现多了一个工程文件hello.pro 。该工程文件对当前目录下的源程序和资源进行了分析和组织,为下一步生成Makefile 文件奠定了基础。

2.生成Makefile

查看发现又多了一个Makefile 文件。

3.编译

生成了中间文件和目标程序hello 。

运行hello 程序:

[root@vm-dev hello]# ls hello.cpp [root@vm-dev hello]# qmake -project [root@vm-dev hello]# ls hello.cpp hello.pro [root@vm-dev hello]# qmake [root@vm-dev hello]# ls hello.cpp hello.pro Makefile [root@vm-dev hello]# make [root@vm-dev hello]# ls hello hello.cpp hello.o hello.pro Makefile [root@vm-dev hello]# ./hello 图7.5 Hello World

结果如图7.5所示。

7.4.2 目标机上编译运行

1. Qt/E应用程序的编译

目标机上的Qt/E应用程序的编译过程与宿主机Qt/X11程序的编译过程一模一样,只是编译工具不一样而已。编译过程重写如下:

[root@vm-dev hello]# /mnt/nfs/Trolltech/qt-embedded-4.4.0/bin/qmake –project

[root@vm-dev hello]#/mnt/nfs/Trolltech/qt-embedded-4.4.0/bin/qmake

[root@vm-dev hello]# make

2. 目标机运行环境的设置

主要是要指定Qt/E的库(包括字体)和设置目标机的Qt/E环境变量。我们采用NFS的方式来调试和运行Qt/E程序。

(1)建立NFS共享目录/up-techpxa270

cd /up-techpxa270

mkdir Trolltech

cd Trolltech

mkdir qt-embedded-4.4.0

cd qt-embedded-4.4.0

cp /root/qt4/for_arm/qt-embedded-linux-opensource-src-4.4.0/lib/ ./ -arf (2)ARM端挂载NFS共享目录

mount -o nolock,rsize=4096,wsize=4096 192.168.1.111:/up-techpxa270 /mnt/nfs

(3)设置环境变量

cd /mnt/nfs/Trolltech/qt-embedded-4.4.0

export QTDIR=$PWD

export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH

export LANG=zh_CN

export QWS_MOUSE_PROTO=MouseMan:/dev/input/mouse0

最后一个环境变量是支持鼠标的,该设备也可能是/dev/mice需要通过ls /dev查看。如果是/dev/mice的话,就要用下面的一句来替换。

export QWS_MOUSE_PROTO=MouseMan:/dev/mice

4、执行Qt/E程序

在宿主机端拷贝编译好的ARM端可执行程序:

cp /root/test/hello /up-techpxa270/Trolltech/qt-embedded-4.4.0/

ARM端执行该程序:

./hello –qws

运行结果与图7.5一样。

本章小结

嵌入式系统GUI具有系统开销少、可移植好、可裁减性、具有高可靠性等特点。常用的嵌入式系统GUI有MicroWindows、MiniGUI、OpenGUI、Qt/Embedded等几种。Qt/E因其具有跨平台、工具丰富、运行需要资源少、功能强大、功能可裁剪、API丰富等优点成为嵌入式系统GUI应用的热点。

Qt/Embedded提供了许多支持嵌入式开发的工具,如:qmake、Qt Designer、uic、moc、QT Linguist、QT Assistant等。

Qt/Embedded开发环境包括两部分:Qt开发环境和Qt/E开发环境两部分。首先在Qt开发环境下使用Qt designer等工具设计、编写、调试应用程序;然后,在确认没有问题后使用Qt/E 开发环境重新编译QtE应用程序进行调试。

Qt/E应用程序编译的一般分三步:1)“qmake –project”生成工程文件;2)“qmake”生成Makefile;3)“make”编译。

习题

1.简述嵌入式系统GUI的特点。

2.常用嵌入式GUI有哪些,各有什么特点?

3.Qt/E有哪些特点?

4.Qt/Embedded提供了有哪些重要的开发工具?

5.简述Qt/E应用程序开发流程,画出开发流程。

6.简述Qt/E应用程序编译的步骤。

相关文档