嵌入式Qt实战教程(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-02 15:00:17

点击下载

作者:本书编辑部

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

嵌入式Qt实战教程

嵌入式Qt实战教程试读:

前言

近年来,Linux操作系统的使用越来越广泛,尤其是嵌入式领域。Linux系统离不开图形应用程序。诺基亚收购的奇趣公司为开发人员提供了一整套跨平台的开发工具包Qt,我们可以用它很好地开发Linux下的图形用户界面程序,而且Qt界面程序也可以顺利地移植到其他系统,甚至是嵌入式操作系统上,并且用Qt开发出的图形用户界面(GUI)程序非常美观,其美观程度甚至可以达到艺术级。由于Qt跨平台的特性,我们可以实现一次编写代码,到处编译,就可以使用。如果客户要求应用程序能同时运行于不同的平台时,Qt的这一优势就非常重要了。总之,Qt具有很大的使用价值和发展潜力。

Qt官方提供了大量的文档,但这些文档由于太详细、太全面,而内容太多,我们通常没有时间详尽地阅读它们,但为了掌握相关知识又不得不查阅这些文档。这些帮助文档以参考性的内容为主,其中的示例程序虽然非常有用,但仅仅通过这些有限的示例程序显然难以正确使用Qt,所以需要一本通俗易懂的介绍Qt的图书。

本书是一本系统地介绍Qt图形界面编程知识的书籍,涵盖了Qt4程序开发中常用的类和API函数,足够广大开发人员参考使用。

国内关于讲解Qt图形界面编程知识的书籍比较少,国外相关著作虽然全面系统,但讲解风格却依照西方的思维方式,过于专业和深奥,这与中国人的思维方式有些不同,所以我们在阅读那些书难免会感到不习惯,影响学习效果。因此,国内读者需要一本按照国人容易接受的方式去讲解Qt编程知识的参考书。本书正是按照这种思维方式来编写的,其讲解清晰易懂,内容科学合理,有助于初学者迅速掌握知识体系和精髓。在相同的学习时间下,可以收到更好的学习效果。

本书适合广大的计算机编程人员学习,只要读者具备一定的C++语言编程基础即可。即使没进行过图形用户界面(GUI)程序设计的人,阅读本书也会迅速入门。本书知识点的顺序和示例程序都是精心安排的,清晰地表达出了重点,其内容涵盖面广,语言简练而清晰,能让读者迅速掌握Qt基础知识和精髓,适合读者自学。

本书首先介绍了常用GUI,Qt开发工具的安装及其优点;然后讲述了Qt入门,窗口的布局,信号和槽机制,常见对话框的使用,主窗口的使用,菜单和工具条的实现,鼠标和键盘事件,Qt进程与线程,网络编程,互斥锁等常见内容;最后还详细讲解了Qt的一些应用小项目,并列出了全部的源代码,如图片浏览器、MP3播放器、网络视频播放器、门禁机项目等,让读者很容易上手,初学者和专业开发人员都能从中获益。

本书的出版,离不开深圳信盈达电子有限公司所有同事们的支持和帮助,尤其是牛乐乐和陈志发、黄英涌等工程师,在此向他们表示衷心的感谢。另外,感谢我的父母亲人和朋友,是他们给予我精神上的支持和鼓励。感谢电子工业出版社,是他们认真专业的审核,让本书由粗糙的初稿变成了精美的图书。

由于时间仓促,编者水平有限,书中难免有不恰当的地方,希望广大读者批评指正,联系邮箱:niusdw@163.com,欢迎来信交流。陈志发2015年3月第1章嵌入式GUI简介与Qt概述1.1 常用GUI介绍

所谓GUI(Graphics User Interface),就是指图形用户界面。图形用户界面的广泛流行是当今计算机技术的重大成就之一,它极大地方便了非专业用户的使用,人们不再需要死记硬背大量的命令,而可以通过窗口、菜单方便地操作。它的主要特征有四点:WIMP。其中,W(Windows)指窗口,是用户或系统的一个工作区域,一个屏幕上可以有多个窗口;I(Icons)指图图标,是形象化的图形标志,易于人们隐喻和理解;M(Menu)指菜单,可供用户选择的功能提示;P(Pointing Devices)指鼠标等,便于用户直接对屏幕对象进行操作。GUI采用了不少Desktop桌面办公的隐喻,让使用者共享一个直观的界面框架。由于人们熟悉办公桌的情况,因而对计算机显示的图标的含义容易理解,诸如文件夹、收件箱、画笔、工作簿、钥匙及时钟等。过去的界面不仅需要记忆大量命令,而且需要指定操作对象的位置,如行号、空格数、X及Y的坐标等。采用GUI后,用户可直接对屏幕上的对象进行操作,如拖动、删除、插入,以及放大和旋转等。用户执行操作后,屏幕能立即给出反馈信息或结果,称为所见即所得(What You See Is What You Get,WYSIWYG)。用视、点(鼠标)代替了记、击(键盘),给用户带来了方便。通常所见的GUI都是位于PC上的,但是在PC上GUI并不适合嵌入式系统。嵌入式设备有严格的资源要求(如十分有限的存储空间)。同时嵌入式系统经常有一些特殊的要求,而普通的PC上的图形窗口系统是不能满足这些要求的,比如特殊的外观效果,控制提供给用户的函数,提高装载速度,特殊的低层图形或输入设备,因此可见嵌入式系统必定要有自己的GUI。

综上所述,嵌入式GUI就是在嵌入式系统中为特定的硬件设备或环境而设计的图形用户界面系统,所以嵌入式GUI不但要具有以上有关GUI的特征,而且在实际应用中,嵌入式系统对它来说还有如下的基本要求:● 体积小;● 运行时耗用系统资源少;● 上层接口与硬件无关,高度可移植;● 高可靠性;● 在某些应用场合应具备实时性。

UNIX环境下的图形视窗标准为X Window System,Linux是类UNIX系统,所以顶层运行的GUI系统是兼容X标准的XFree86系统。X标准大致可以划分为X Server、Graphic Li-brary(底层绘图函数库)、Toolkits、Window Manager等几大部分,其好处是具有可扩展性、可移植性等优点,但对于嵌入式系统而言无疑太过庞大、累赘、低效。目前流行的嵌入式GUI与X思路不同,这些GUI一般不局限于X标准,更强调系统的空间和效率。

下面我们就目前市场上常用的嵌入式GUI做一个简单的介绍。1.1.1 MiniGUI

由北京飞漫软件技术有限公司开发的MiniGUI(http://www.minigui.org),是国内为数不多的几大国际知名自由软件之一。MiniGUI是面向实时嵌入式系统的轻量级图形用户界面支持系统,1999年初遵循GPL条款发布第一个版本以来,已广泛应用于手持信息终端、机顶盒、工业控制系统及工业仪表、彩票机、金融终端等产品和领域。目前,MiniGUI已成为跨操作系统的图形用户界面支持系统,可在Linux/μCLinux、eCOS、μC/OS-II、VxWorks、等操作系统上运行;已验证的硬件平台包括Intel x86、ARM(ARM7/AMR9/StrongARM/xS-cale)、PowerPC、MIPS、M68K(DragonBall/ColdFire)等。

MiniGUI的良好体系结构及优化的图形接口,可确保最快的图形绘制速度。在设计之初,就充分考虑到了实时嵌入式系统的特点,针对多窗口环境下的图形绘制开展了大量的研究及开发,优化了MiniGUI的图形绘制性能及资源占有。MiniGUI在大量实际系统中的应用,尤其在工业控制系统的应用,证明MiniGUI具有非常好的性能。1.1.2 MicroWindows

MicroWindows(http://microwindows.censoft.com)是一个开放源码的项目,目前由美国Century Software公司主持开发。该项目的开发一度非常活跃,国内也有人参与了其中的开发,并编写了GB2312等字符集的支持。但在Qt/Embedded发布以来,该项目变得不太活跃了,并长时间停留在0.89Pre7版本。可以说,以开放源码形式发展的MicroWindows项目,基本停滞。

MicroWindows是一个典型的基于客户端/服务器体系结构的GUI系统,基本分为三层:最底层是面向图形输出和键盘、鼠标或触摸屏的驱动程序;中间层提供底层硬件的抽象接口,并进行窗口管理;最高层分别提供兼容于X Window和Windows CE(Win32子集)的API。该项目的主要特色在于提供了类似X的客户端/服务器体系结构,并提供了相对完善的图形功能,包括一些高级的功能,如Alpha混合、三维支持、True Type字体支持等。Mi-croWindows采用MPL(mozilla public license)条款发布。1.1.3 DinX

DinX非常适合在很小的系统上运行多窗口程序,它简单、轻巧并且快速。DinX并不是X,它使用Linux核心的framebuffer视频驱动,采用Client/Server模式,为此,系统提供了两个界面:/dev/dinxsvr和/dev/dinxwin。

一个服务器程序连接到/dev/dinxsvr,并决定来自各程序窗口的request各占有视屏的各个部分,它也负责给各窗口发送像鼠标移动这样的事件消息。Clinet程序连接到/dev/di-nxwin,与Server进行消息通信等。Server进程还负责处理事件、窗口管理、调色板配置等功能。DinX是一个实验性的窗口系统,它处在发展阶段中,还存在一些缺陷和问题。DinX的license属于MPL,也可以转化为GPL。这样,DinX核心模块可以集成到Linux中,DinX库可以链接到其他的GPL程序中。1.1.4 OpenGUI

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

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

Qt是Nokia公司(Trolltech)的一个C++图形库,可以跨平台使用,与Windows下的MFC在同一个层次,但比MFC更好用。主要特点是比MFC要庞大,很多Qt是可以移植的。Qt最初主要是为跨平台的软件开发者提供统一的、精美的图形用户编程接口。Qt在Linu-xX86上通过Qt lib访问Linux下的x-server与x-lib,x-server与底层硬件相连。Qt在Windows上通过Qt lib访问win api.

Qt的嵌入式版本叫作Qt/Embedded,不需要x-server与x-lib的支持,可以直接写framebuffer,所以很节省内存。

表1.1归纳了Qt/Embedded的一些优缺点。表1.1 Qt/Embedded的优缺点分析

表1.2总结了常见GUI的参数比较。表1.2 常见GUI参数比较1.2 Qt简史

Qt工具包最初是在1995年5月变为公众可用的。它最初由Haavard Nord(Trolltech的CEO)和Eirik Chambe-Eng(Trolltech的总裁)开发。Haavard和Eirik是在位于挪威特隆赫姆的挪威科技学院相识的,他们都在那里获得了计算机科学的硕士学位。

Haavard对C++图形用户界面开发的兴趣始于1988年,当时他被一家瑞典公司委托设计并且开发一个C++图形用户界面工具包。

几年后,在1990年夏天,Haavard和Eirik因为一个超声波图像方面的C++数据库应用程序在一起工作。这个系统要求能够在UNIX、Macintosh和Windows上都能运行。那个夏天中的一天,Haavard和Eirik出去散步享受阳光。当他们坐在公园的一个长椅上,Haavard说:“我们需要一个面向对象的显示系统。”由此引发的讨论奠定了他们即将创建的面向对象的多平台图形用户界面工具包的智力基础。

Haavard于1991年开始和Eirik合作设计、编写最终成为Qt的这些类。随后的一年,Eirik提出了“信号和槽”的设想——一个简单并且有效的强大的图形用户界面编程范例。Haavard实践了这个想法,并且建立了一个手写代码实现。到1993年,Haavard和Eirik当时已经开发出了Qt的第一个图形核心并且能够实现他们自己的窗口部件。同年末,Haavard提议他们一起开展并且创建“世界上最好的C++图形用户界面工具包”的业务。

1994年成为两个程序员不幸的一年,他们没有客户,没有资金,只有一个未完成的产品,却希望闯入一个稳定的市场。非常幸运的是他们的妻子都有工作并且愿意支持他们的丈夫。在这两年Haavard和Eirik认为需要继续开发他们的产品并且开始盈利。

他们选择“Q”作为类的前缀,是因为该字母在Haavard的Emacs字体中看起来非常漂亮。“t”代表“工具包(toolkit)”,是从“Xt”,X工具包中获得的灵感。公司于1994年3月4日创立,最初名为“Quasar Technologies”,后更名为“Troll Tech”,现在改为“Trolltech”。

1995年5月,通过Haavard大学时的一个教授的联系,挪威Metis公司与他们签订了一份基于Qt进行软件开发的合同。大约同一时间,Trolltech雇佣了Arnt Gulbrandsen,正是他设计并实现了一套有独创性的文档系统,并且对Qt的代码也做出了贡献。

1995年5月20日,Qt 0.90被上传到sunsite.unc.edu。6天后,在comp.os.linux-an-nounce上发布,这是Qt的第一次公开发布。Qt可以被同时用于Windows和UNIX开发,它在两种平台上提供了相同的应用程序编程接口。从第一天起,Qt就提供两种许可版本:一种是进行商业开发所需的商业许可版本,另一种是进行开源开发的自由软件版本。Metis的合同确保了Trolltech的发展,在10个月之内没有人购买Qt的商业许可。

1996年,European Space Agency购买了10份Qt商业许可,成了第2个Qt客户。凭着坚定的信念,Eirik和Haavard又雇佣了另外一个开发人员。Qt 0.97在5月底发布,并且在1999年9月24日,Qt1.0面世。在这一年底,Qt已经发展到了1.1的版本,共有来自8个不同国家的客户,他们购买了18份商业许可。这一年,在Matthias Ettrich的带领下,创立了KDE项目。

Qt1.2在1997年4月发布。Matthias Ettrich利用Qt建立KDE的决定使得Qt成为在Linux环境下开发C++图形用户界面的实际标准。Qt1.3在1997年9月发布。

Matthias Ettrich本人也在1998年离开学术界加入TrollTech,当年9月最后一个1系列的版本1.40发布。1999年6月Qt2.0发布。Qt2.0有很多架构上的改变,比它的前几个版本功能更为强大,更为成熟。它还具备了40个新类和Unicode支持。Qt2有了一个新的开源许可,Q公共许可(Q Public License,QPL),它遵循了开源定义。在1999年8月,Qt赢得了LinuxWorld的最佳库/工具奖。大约在这个时候,Trolltech Pty Ltd(澳大利亚)建立了。

Trolltech在2000年发布了Qt/Embedded。它被设计为可以运行在嵌入式Linux设备上,并且提供了它自己的窗口系统作为X11的轻型替代品。现在Qt/Embedded和Qt/X11除了提供商业许可之外,还可以提供被广泛使用的GNU通用许可(GNU General PublicLicense,GPL)。到2000年年底,Trolltech已经创建了Trolltech Inc. (美国),并发布了第一个Qtopia版本,一个手持设备环境。Qt/Embedded在2001年和2002年两次获得LinuxWorld“Best Embedded Linux Solution”(最佳嵌入式Linux解决方案)奖。

Qt3.0在2001年发布。现在Qt可以用于Windows、UNIX、Linux、嵌入式Linux和Ma-cOS X。Qt3.0提供了42个新类和超过50万行的代码。Qt3.0在2002年赢得了Software De-velopment Tools的“Jolt Productivity Aword(震撼生产力奖)”。

2005年夏,Qt4.0发布,它大约有500个类和9 000多个函数,Qt4比以往的任何一个版本都要全面和丰富,并且它已经裂变成多个函数库,从而使开发人员可以根据自己的需要只链接所需要的Qt部分。相对于以前的所有Qt版本,Qt4的进步是巨大的,它彻底地对高效易用的模板容器、高级的模型/视图功能、快速而灵活的二维绘图框架和强大的统一字符编码标准的文本查看和编辑类进行了大量改进,更不必说对那些贯穿整个Qt类中的成千上万个小的改良了。现如今,Qt4具有如此广泛的特性,以至于Qt已经超越了作为图形用户界面工具包的界限,逐渐成长为一个成熟的应用程序开发框架。Qt4也是第一个能够在其所有可支持的平台上既可用于商业开发又可用于开源开发的Qt版本。

同样在2005年,奇趣公司在北京开设了一家办事处,以便为中国及其销售区域内的用户提供服务和培训,并且为Qt/Embedded Linux和Qtopia提供技术支持。

通过获取一些非官方的语言绑定件(Langauge Binding),非C++程序员也已早就开始使用Qt,特别是用于Python程序员的PyQt语言绑定件。2007年,公司发布了用于C#程序员的非官方语言绑定件Qyoto。同年,Qt Jambi投放市场,它是一个官方支持的Java版Qt应用程序编程接口。

自奇趣公司(现已被Nokia收购)诞生以来,Qt的声望经久不衰,而且至今仍然保持高涨。取得这样的成绩不但说明了Qt的质量,而且也说明了人们都喜欢使用它。在过去的10年中,Qt已经从一个只被少数专业人士所熟悉的“秘密”产品,发展到了如今遍及全世界拥有数以千计的客户和数以万计的开源开发人员的产品。1.3 Qt程序设计简介

Qt是Trolltech公司开发的给予标准框架的图形应用程序,它是一种高效与跨平台的应用程序的解决方案,Qt支持的平台有微软操作系统、苹果OS和Linux操作系统,并支持了大部分商业的UNIX操作系统和Linux嵌入式操作系统。

Qt提供给应用程序开发者大部分的功能,来完成建立适合的、高效率的图形面程序与后台执行的应用程序,它提供的是一种面向对象的可扩展性能和真正基于组件的编程模式。建议读者在学习这本书之前最好首先熟悉官方所提供的白皮书。

Qt的第一次商业版本发行是在1996年,发展到现在,Qt已经提供了成千上万的应用程序,包括Google地图、Photoshop的一些元素和Skype软件,同时还支持Linux桌面系统KDE的开发环境,KDE是Linux发行版最广泛的一种图形作业界面。

Qt支持以下的平台:Windows 98、WindowsNT 4.0、Windows ME、Windows 2000、Win-dowsXP、UNIX/X11-Linux、SunSolaris、HP-UX、HPTru64UNIX、IBMAIX、SGIIRIX、Ma-cOSX、MacOSX10.3+,以及其他的一些版本的UNIX。在EmbeddedLinux-Linux嵌入式平台上需要使用Framebuffer帧缓冲的支持。1.4 Qt版本介绍

在Qt发行版本中将要涉及两个版本:Qt商业版本和Qt开源版本。1. Qt商业版本

Qt商业版本是设计商业软件的开发环境,这些商业软件使用了传统的商业来发布,它包含了一些更新的功能、技术上的支持和大量的解决方案,开发了使用于行业的一些特定的组件,有一些特殊的功能只在商业用户中使用。2. Qt开源版本

Qt开源版本是用来开发开源的软件,它提供了一些免费的支持,并遵循QPL协议。

开放源代码是免费的软件,不牵涉用户的某些权益。任何人都有使用开源软件和参与它的修改的机会,这就意味着其他的人同样可获得你开发的代码。

开源软件应该较多地谈论软件自由,而不是金钱。在自由软件基金会的许可背景下,讲究软件自由,而不是不计成本地去使用软件。

Trolltech公司提供了Qt的开源版本,让大部分人可以使用开源的Qt来开发自由的开源软件,所有在Qt开源版本下开发的软件都需要遵守GNU的公共许可。

自从Qt开源以来已经成功地完成了很多优秀的项目,如KDE。全世界有相当部分的程序员在使用Qt的开源版本,它们没有被告知要缴纳使用费用。在Qt4X以上的版本,Qt开源主要面向的UNIX/X11、MacOS及Windows用户。

开源版本的Qt可以在原TrollTech公司的网站上进行下载。当然程序员在开发程序的时候也可以使用Qt的商业版本,但这样就需要购买一个商业的许可,才可以将你的软件作为商业的软件进行发布。

这样的运作模式是很优秀的,开源软件不断地使用最小的成本增加了软件的功能,商业软件符合了商业软件的发行模式。许多大型的公司因需要保护软件的许可权益,所以愿意购买原TrollTech的商业许可权,使得原TrollTech公司保证了盈利的来源。

如果你选择了Qt的开源版本,GNU的权益也就强加给了你,也就是说你要遵守自由的理念,将你开发的开源代码分享给其他的朋友。总之,在GNU的协议下你需要将软件的源代码共享到底。1.5 怎样学习Qt1.5.1 从C++到Qt的跨越

C++程序语言是一个成功的典范,虽然它有很多不足的地方(如快速开发,对程序员质量的要求很高)。但在Qt当中不需要计较这么多,Qt的出色表现让C++语言蓬荜生辉。

在Qt中我们不需要关心底层的类怎样工作,而着重于图形的开发、美工的修饰、功能的扩展及接口的形成。当链接数据库的时候,C++语言会提供接口,SQL的提供商也会开发这方面的包,以满足各种程序设计条件下的需要。

当试图链接一个服务器的时候,程序员需要对于网络协议和套接字的构造有充分的经验,这些在Qt中都被涉及,并且很好地提供了丰富的类。

从C到C++是机制的升华,而从C++到Qt,则是在内容和方便性上的变革。如果选择C++开发一个大型的图形程序,就需要对XWindow和显卡硬件有所了解,编写大量的代码,还需要掌握很多知识,如各种显卡参数。而Qt从上到下都为用户做了这些,用户只需要负责对它调用就能完成工作,用户只要活动鼠标,就可以构造出美观的窗口。1.5.2 C语言和其他程序设计的关系

C语言是一种通用的程序设计语言,它包含了紧凑的表达式、丰富的运算符数据类型,以及用户自定义的数据结构。C语言功能丰富,可扩展性很强。本书的重点是讲解Qt的编程,但有必要涉及部分C语言的内容。这是因为Linux内核是用C语言写成的,C++也是由C语言继承和扩展而来,Qt则是一组C++的工具包。

在C语言中使用的一种特殊的数据结构,即结构体,例如:struct stu{ unsigned long number; char * name; char * sex;};

C++对C进行了扩展,例如:struct stu_info{ unsigned long number; char * name; char * sex;public : void set_name(); void get_number();};

定义类的模式:class stu_info{ unsigned long number; char * name; char * sex;public : void set_name(); void get_number();}

类与结构体十分相似,上面的例子展示了从结构体到类的演变过程。在面向对象设计中,可以将结构体看作类的一种特殊变体。本书的主要内容是Qt类的操作,这就要求读者要有一定的C++的基础。Qt是建立在C++基础之上的,要学好它就必须掌握C++。这样用户才能很顺利地去研究Qt的例子,分析各种类的功能,熟练地使用它们。使用Qt编写程序时,主要面向的对象就是类的操作。虽然大部分类的属性可以在属性编辑框中操作,但是有些信号与槽是必须要个人自定义设计的,程序往往要完成不同的操作,而Qt这个工具在适用更大范围的操作的时候会显得力不从心。

大量的槽和信号的编写可以帮助用户完成很多事情。最好的学习方式还是阅读源代码,在国外有很多的软件都是使用Qt编写的,它们都有源码包,可以帮助用户熟悉Qt工具。本书也是由大量的实例构成的,也是为了让大家能够在学习中侧重于应用,分析并了解源代码的作用。1.6 Qt开发工具的优点1. 面向对象

良好的封装机制使得Qt的模块化程度非常高,可重用性较好,非常有利于用户的开发。Qt提供了一种称为信号/槽的安全机制来替代回调,这使得各个部件之间的协同工作变得十分简单,另外Qt还提供了信号/槽的编译器,具有可视化的编辑功能。2. 丰富的API

Qt有多达250个以上的C++类,还有基于模板的集合、串行、文件、I/O设备、目录管理和日期/时间类,甚至还包括正则表达式的处理功能。3. 大量的开发文档

Qt提供了丰富的开发文档,有利于方便地查找有用的信息,Qt在许多类当中提供了相似的接口支持,以便于使用Qt的官方文档编写程序。

XML是可扩展标识语言(Extensible Markup Language)的简写,目前推荐遵循的是W3C组织于2000年10月6日发布的XML1.0版本,具体请参考(www.w3.org/TR/2000/RECXML-20001006)。Qt还包含了大量的关于XML的接口。1.7 Qt/Embedded介绍1.7.1 架构

Qt/Embedded以原始Qt为基础,并做了许多出色的调整以适用于嵌入式环境。Qt/Embedded通过Qt API与Linux I/O设施直接交互,成为嵌入式Linux端口。同Qt/X11相比,Qt/Embedded很省内存,因为它不需要一个X服务器或者Xlib库,它在底层抛弃了Xlib,采用framebuffer(帧缓冲)作为底层图形接口;同时,将外部输入设备抽象为keyboard和mouse输入事件。Qt/Embedded的应用程序可以直接写内核缓冲帧,这避免开发者使用烦琐的Xlib/Server系统。图1.1比较了Qt/Embedded与Qt/X11的架构区别。使用单一的API进行跨平台的编程可以有很多好处,提供嵌入式设备和桌面计算机环境下应用的公司可以培训开发人员使用同一套工具开发包,这有利于开发人员之间共享开发经验与知识,也使得管理人员在分配开发人员到项目中的时候增加灵活性。更进一步来说,针对某个平台而开发的应用和组件也可以销售到Qt支持的其他平台上,从而以低廉的成本扩大产品的市场。图1.1 Qt/Embedded与Qt/X11的Linux版本的比较1. 窗口系统

一个Qt/Embedded窗口系统包含了一个或多个进程,其中的一个进程可作为服务进程,该服务进程会分配客户显示区域,以及产生鼠标和键盘事件,还能够给运行起来的客户应用程序提供输入方法和一个用户接口。该服务进程其实就是一个有某些额外权限的客户进程,任何程序都可以在命令行上加上“-qws”的选项来把它作为一个服务进程运行。

客户端与服务器之间的通信是使用共享内存的方法实现的,通信量应该保持最小,例如客户进程直接访问帧缓冲来完成全部的绘制操作,而不会通过服务器,客户程序需要负责绘制它们自己的标题栏和其他式样。这就是Qt/Embedded库内部层次分明的处理过程。客户可以使用QCOP通道交换消息。服务进程简单地将QCOP消息广播给所有监听指定通道的应用进程,接着应用进程把一个槽连接到一个负责接收的信号上,从而对消息做出响应。消息的传递通常伴随着二进制数据的传输,这是通过一个QDataStream类的序列化过程来实现的,有关这个类的描述,请读者参考相关资料。

QProcess类提供了另外一种异步的进程间通信机制,它用于启动一个外部的程序并且通过写一个标准的输入和读取外部程序的标准输出和错误码来和它们通信。2. 字体

Qt/Embedded支持4种不同的字体格式:True Type字体(TTF)、Postscript Type1字体、位图发布字体(BDF)和Qt的预呈现(Pre-rendered)字体(QPF)。Qt还可以通过增加Qfont-Factory的子类来支持其他字体,也可以支持以插件方式出现的反别名字体。

每个TTF或者TYPE1类型的字体首次在图形或者文本方式的环境下被使用时,这些字体的字形都会以指定的大小被预先呈现出来,呈现的结果会被缓冲。根据给定的字体尺寸(如10或12点阵)预先呈现TTF或者TYPE1类型的字体文件并把结果以QPF的格式保存起来,这样可以节省内存和CPU的处理时间。QPF文件包含了一些必要的字体,这些字体可以通过makeqpf工具取得,或者通过运行程序时加上“-savefonts”选项获取。如果应用程序中使用到的字体都是QPF格式,那么Qt/Embedded将被重新配置,并排除对TTF和TYPE1类型的字体的编译,这样就可以减少Qt/Embedded的库的大小和存储字体的空间。例如,一个10点阵大小的包含所有ASCII字符的QPF字体文件的大小为1 300B,这个文件可以直接从物理存储格式映射成为内存存储格式。

Qt/Embedded的字体通常包括Unicode字体的一部分子集、ASCII和Latin-1。一个完整的16点阵的Unicode字体的存储空间通常超过1 MB,我们应尽可能存储一个字体的子集,而不是存储所有的字。例如,在一个应用中,仅仅需要以Cappuccino字体、粗体的方式显示产品的名称,但是却有一个包含了全部字形的字体文件。3. 输入设备及输入法

Qt/Embedded 3.0支持几种鼠标协议:BusMouse、IntelliMouse、Microsoft和MouseMan。Qt/Embedded还支持NECVr41XX和iPAQ的触摸屏。通过从QWSMouseHandler或者Qcalibra-tedMouseHandler派生子类,开发人员可以让Qt/Embedded支持更多的客户指示设备。

Qt/Embedded支持标准的101键盘和Vr41XX按键,通过子类化QWSKeyboardHandler可以让Qt/Embedded支持更多的客户键盘和其他的非指示设备。

对于非拉丁语系字符(如阿拉伯、中文、希伯来和日语)的输入法,需要把它写成过滤器的方式,并改变键盘的输入。输入法的作者应该对全部的Qt API的使用有完整的认识。在一个无键盘的设备上,输入法成了唯一的输入字符的手段。Qtopia提供了4种输入方法:笔迹识别器、图形化的标准键盘、Unicode键盘和基于字典方式提取的键盘。4. 屏幕加速

通过子类化QScreen和QgfxRaster可以实现硬件加速,从而为屏幕操作带来好处。Troll-tech提供了Mach64和Voodoo3视频卡的硬件加速的驱动例子,同时可以按照协议编写其他的驱动程序。1.7.2 Qt的开发环境

Qt/Embedded的开发环境可以取代那些我们熟知的UNIX和Windows开发工具,它提供了几个跨平台的工具使得开发变得迅速和方便,尤其是它的图形设计器。UNIX下的开发者可以在PC或者工作站使用虚拟缓冲帧,从而可以模仿一个和嵌入式设备的显示终端大小、像素相同的显示环境。

嵌入式设备的应用可以在安装了一个跨平台开发工具链的不同的平台上编译,最通常的做法是在一个UNIX系统上安装跨平台的带有libc库的GNU C++编译器和二进制工具。在开发的许多阶段,一个可替代的做法是使用Qt的桌面版本,如通过Qt/X11或是Qt/Windows来进行开发。这样开发人员就可以使用他们熟悉的开发环境,如微软公司的Visual C++或者Borland C++。在UNIX操作系统下,许多环境也是可用的,如Kdevelop,它也支持交互式开发。

如果Qt/Embedded的应用是在UNIX平台下开发的话,那么它就可以在开发的机器上以一个独立的控制台或者虚拟缓冲帧的方式来运行,对于后者来说,其实是有一个X11的应用程序虚拟了一个缓冲帧。通过指定显示设备的宽度、高度和颜色深度,虚拟出来的缓冲帧将和物理的显示设备在每个像素上保持一致。这样每次调试应用时开发人员就不用总是刷新嵌入式设备的Flash存储空间,从而加速应用的编译、链接和运行周期。运行Qt的虚拟缓冲帧工具的方法是在Linux的图形模式下运行以下命令:qvfb(回车)

当Qt嵌入式的应用程序要把显示结果输出到虚拟缓冲帧时,我们在命令行运行这个程序,并在程序名后加上-qws的选项。例如: $>hello–qws1.7.3 Qt的支撑工具

Qt包含了许多支持嵌入式系统开发的工具,有两个最实用的工具是qmake和Qt designer(图形设计器)。(1)qmake是一个为编译Qt/Embedded库和应用而提供的Makefile生成器,它能够根据一个工程文件(.pro)产生不同平台下的Makefile文件。qmake支持跨平台开发和影子生成,影子生成是指当工程的源代码共享给网络上的多台机器时,每台机器编译链接这个工程的代码将在不同的子路径下完成,这样就不会覆盖别人的编译链接生成的文件。qmake还易于在不同的配置之间切换。(2)Qt图形设计器可以使开发者可视化地设计对话框而不需编写代码。使用Qt图形设计器的布局管理可以生成能平滑改变尺寸的对话框。

qmake和Qt图形设计器是完全集成在一起的。1.8 Qt的安装

Qt是跨平台的开发工具,可以在多个系统上使用。不管是Linux还是Windows环境下,Qt的安装过程都比一般的软件安装麻烦一些,还要配置一些环境变量。下面分别介绍Linux和Windows下Qt的安装配置方法。1.8.1 Linux下Qt的安装1. 说明

运行环境为“Red Had Enterprise Linux 5”。

Qt Creator版本为“qt-sdk-linux-x86-opensource-2010.05”。2. 安装步骤(1)安装需要库文件“libstdc++.so.6.0.10”。把库“libstdc++.so.6.0.10”复制到“/usr/lib/”目录下,并删除“libstdc++.so.6”的软链接。在“/usr/lib/”目录中打开终端,在终端输入“rm-rf/usr/lib/libstdc++.so.6”后按回车键,然后重做“libstdc++.so.6”软链接,在终端输入“ln-s/usr/lib/libstdc++.so.6.0.10/usr/lib/libstdc++.so.6”。(2)安装主程序“qt-sdk-linux-x86-opensource-2010.05”。双击,按照如图1.2到图1.11所示的步骤,即可完成主程序的安装。图1.2 安装主程序界面(一)图1.3 安装主程序界面(二)图1.4 安装主程序界面(三)图1.5 安装主程序界面(四)图1.6 安装主程序界面(五)图1.7 安装主程序界面(六)图1.8 安装主程序界面(七)图1.9 安装主程序界面(八)图1.10 安装主程序界面(九)图1.11 安装主程序界面(十)3. Qt Creator测试

双击Linux桌面上的快捷方式图标,将进入到IDE集成开发环境中,Qt Creator测试界面如图1.12到图1.16所示。图1.12 Qt Creator测试界面(一)图1.13 Qt Creator测试界面(二)图1.14 Qt Creator测试界面(三)图1.15 Qt Creator测试界面(四)图1.16 Qt Creator测试界面(五)

发现编译错误,这是因为当前的Linux系统中缺少Qt的需要用到的字体工具:fontcon-fig2.4.1以上的版本,但是这个库安装要依赖freetype字体库,所以先下载安装freetype2.4.4,这里总共下载了所需要的两个软件源码包——freetype-2.4.4.tar.bz2和fontconfig2.8.0.tar.gz。安装步骤如下。(1)安装freetype-2.4.4.tar.bz2。

① 解压freetype-2.4.4.tar.bz2软件包:在终端输入“tar-jxvffreetype-2.4.4.tar.bz2”。

② 配置软件包:在解压出来的文件夹中打开终端并输入“./configure--sysconfdir=/etc--prefix=/usr--mandir=/usr/share/man”。

③ 编译源码:在终端输入“make”。

④ 安装软件:在终端输入“make install”。(2)安装“fontconfig-2.8.0.tar.gz”。

① 解压“fontconfig-2.8.0.tar.gz”软件包:在终端输入“tar-xvf fontconfig2.8.0.tar.gz”。

② 配置软件包:在解压出来的文件夹中打开终端并输入“./configure--sysconfdir=/etc--prefix=/usr--mandir=/usr/share/man”。

③ 编译源码:在终端输入“make”。

④ 安装软件:在终端输入“make install”。(3)再次编译例子程序的效果如图1.17所示。

可以发现在可以编译通过,也能运行Qt程序了。4. Qt Creator中配置ARM版本交叉编译环境(1)首先编译好ARM版本的库。例如,编译源码包“qt-everywhere-opensource-src-4.6.3”安装在“/opt/qt-embedded-arm9/”目录中。(2)配置Qt Creator,按照图1.18到图1.21所示的界面加入ARM版本的Qt编译器。图1.17 再次编译后的程序效果图1.18 加入ARM版本的Qt编译器的界面(一)图1.19 加入ARM版本的Qt编译器的界面(二)图1.20 加入ARM版本的Qt编译器的界面(三)图1.21 加入ARM版本的Qt编译器的界面(四)(3)按照图1.22到1.27所示的界面测试打开的一个Qt Creator工程。图1.22 测试Qt Creator工程界面(一)图1.23 测试Qt Creator工程界面(二)图1.24 测试Qt Creator工程界面(三)

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载