×

Qt/Embedded开发入门

消耗积分:1 | 格式:rar | 大小:0.3 MB | 2017-10-18

分享资料个

 12.2 Qt/Embedded开发入门
  12.2.1 Qt/Embedded介绍
  1.架构
  Qt/Embedded以原始Qt为基础,并做了许多出色的调整以适用于嵌入式环境。Qt/Embedded通过Qt API与Linux I/O设施直接交互,成为嵌入式Linux端口。同Qt/X11相比,Qt/Embedded很省内存,因为它不需要一个X服务器或是Xlib库,它在底层抛弃了X lib,采用framebuffer(帧缓冲)作为底层图形接口。同时,将外部输入设备抽象为keyboard和mouse输入事件。Qt/Embedde的应用程序可以直接写内核缓冲帧,这避免开发者使用繁琐的Xlib/Server系统。图12.1所示比较了Qt/Embedded与Qt/X11的架构区别。
  Qt/Embedded开发入门
  使用单一的API进行跨平台的编程可以有很多好处。提供嵌入式设备和桌面计算机环境下应用的公司可以培训开发人员使用同一套工具开发包,这有利于开发人员之间共享开发经验与知识,也使得管理人员在分配开发人员到项目中的时候增加灵活性。更进一步来说,针对某个平台而开发的应用和组件也可以销售到Qt支持的其他平台上,从而以低廉的成本扩大产品的市场。
  (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字体文件的大小为1300字节,这个文件可以直接从物理存储格式映射成为内存存储格式。
  Qt/Embedded的字体通常包括Unicode字体的一部分子集,ASCII和Latin-1。一个完整的16点阵的Unicode字体的存储空间通常超过1MB,我们应尽可能存储一个字体的子集,而不是存储所有的字,例如在一个应用中,仅仅需要以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视频卡的硬件加速的驱动例子,同时可以按照协议编写其他的驱动程序。
  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–qws。
  3.Qt的支撑工具
  Qt包含了许多支持嵌入式系统开发的工具,有两个最实用的工具是qmake和Qt designer(图形设计器)。
  n qmake是一个为编译Qt/Embedded库和应用而提供的Makefile生成器。它能够根据一个工程文件(.pro)产生不同平台下的Makefile文件。qmake支持跨平台开发和影子生成,影子生成是指当工程的源代码共享给网络上的多台机器时,每台机器编译链接这个工程的代码将在不同的子路径下完成,这样就不会覆盖别人的编译链接生成的文件。qmake还易于在不同的配置之间切换。
  n Qt图形设计器可以使开发者可视化地设计对话框而不需编写代码。使用Qt图形设计器的布局管理可以生成能平滑改变尺寸的对话框。
  qmake和Qt图形设计器是完全集成在一起的。
  12.2.2 Qt/Embedded信号和插槽机制
  1.机制概述
  信号和插槽机制是Qt的核心机制,要精通Qt编程就必须对信号和插槽有所了解。信号和插槽是一种高级接口,应用于对象之间的通信,它是Qt的核心特性,也是Qt区别于其他工具包的重要地方。信号和插槽是Qt自行定义的一种通信机制,它独立于标准的C/C++语言,因此要正确地处理信号和插槽,必须借助一个称为moc(Meta Object Compiler)的Qt工具,该工具是一个C++预处理程序,它为高层次的事件处理自动生成所需要的附加代码。
  所谓图形用户接口的应用就是要对用户的动作做出响应。例如,当用户单击了一个菜单项或是工具栏的按钮时,应用程序会执行某些代码。大部分情况下,是希望不同类型的对象之间能够进行通信。程序员必须把事件和相关代码联系起来,这样才能对事件做出响应。以前的工具开发包使用的事件响应机制是易崩溃的,不够健壮的,同时也不是面向对象的。
  以前,当使用回调函数机制把某段响应代码和一个按钮的动作相关联时,通常把那段响应代码写成一个函数,然后把这个函数的地址指针传给按钮,当那个按钮被单击时,这个函数就会被执行。对于这种方式,以前的开发包不能够确保回调函数被执行时所传递进来的函数参数就是正确的类型,因此容易造成进程崩溃。另外一个问题是,回调这种方式紧紧地绑定了图形用户接口的功能元素,因而很难进行独立的开发。
  信号与插槽机制是不同的。它是一种强有力的对象间通信机制,完全可以取代原始的回调和消息映射机制。在Qt中信号和插槽取代了上述这些凌乱的函数指针,使得用户编写这些通信程序更为简洁明了。信号和插槽能携带任意数量和任意类型的参数,它们是类型完全安全的,因此不会像回调函数那样产生core dumps。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !