【QT】Qt for Embedded Linux Architecture

1、简介

Qt for Embedded Linux(Qt4.8),是用于嵌入式设备(Linux)的开发GUI和应用程序的C++框架,提供了一个轻量级的窗口系统(QWS)以及标准的Qt API,基本架构如下图所示。

这里写图片描述

Qt for Embedded Linux程序直接向Framebuffer写数据,Framebuffer设备是图形硬件的一种抽象,使得我们通过定义好的接口就可以访问图形硬件,而不比关心底层更复杂的东西,另外为了调试,还提供了Virtual Framebuffer。VNC是一种通信协议,支持Server-Client程序。

2、Client-Server模型

Client-Server模型如下图所示。

这里写图片描述

Qt for Embedded Linux程序本身可以作为Server,随后启动的其它程序都作为Client。Server和Client职责不同,Server用于共同的pointer handling、character input、screen output、screen cursor、screen saver,对应于QWSServer类,Client用于各自的操作,对应于QWSClient类。系统中产生的事件,如keyboard、mouse等,首先传给Server,然后由Server分发给对应的Client。对于GUI程序来说,Client默认将渲染结果保存到了内存中,然后由Server负责将这些数据传输到屏幕上,不过Client也可以直接操作硬件。

Client端GUI变化时,Server通过QWSWindow对象管理各个Top-level窗口。当Server收到一个事件时,通过Top-level窗口查询事件属主,获取所属ID,然后把封装好的QWSEvent对象传递给对应的Client,使用QWSInputMethod、QWSServer::KeyboardFilter、QApplication::qwsEventFilter()可以过滤事件。Client间通信使用QCopChannel类,即QCOP协议,多对多,通过名字进行识别。

3、Pointer Handling(Mouse)

Pointer Handling结构如下图所示。

这里写图片描述

Mouse驱动(QWSMouseHandler)由Server加载,Mouse驱动收到事件后通过QWSEvent传递给为Server。默认提供了几种Mouse协议,当然也可以以插件形式自定义Mouse驱动,相关类为QMouseDriverFactory、QMouseDriverPlugin、QMouseCalibratedMouseHandler。

4、Character Input(Keyboard)

Character Input结构如下图所示。

这里写图片描述

Keyboard驱动(QWSKeyboardHandler)由Server加载,Keyboard驱动收到事件后通过QWSEvent传递给为Server。默认提供了几种Keyboard协议,当然也可以以插件形式自定义Keyboard驱动,相关类为QKbdDriverFactory、QKbdDriverPlugin。

5、Graphics Rendering

GUI渲染时,Client默认将数据保存到内存中,然后Server将这些数据拷贝到Framebuffer。当Client收到Server传递过来的事件需要更新UI时,程序同时会更新对应的内存缓存区域,如下图所示。

这里写图片描述

Decoration由Client加载,当然也可以自己实现一套Decoration,相关类为QDecoration、QDecorationPlugin、QDecorationFactory,以及QApplication::qwsSetDecoration。

6、Direct Painting

Direct Painting是GUI渲染的另一种形式,Client绕过Server直接接管硬件,即Framebuffer中的一块区域,有两种方法可以实现这一操作,一种是通过设置Qt::WA_PaintOnScreen属性、QT_ONSCREEN_PAINT环境变量,如下图所示。

这里写图片描述

另一种方法是使用QDirectPainter类,如下图所示。

这里写图片描述

7、Drawing on Screen

Screen更新时,Server确保Client更新了内存缓存区域,然后通过Screen驱动(QScreen)拷贝内存缓冲区域中的数据到Framebuffer完成上屏。Screen驱动由Server加载,默认提供了几种Screen协议,当然也可以以插件形式自定义Screen驱动,相关类为QScreenDriverFactory、QScreenDriverPlugin。为了定位内存中的不同区域,Screen驱动提供了与不同区域对应的Top-level窗口列表,每个窗口都有一个QWSWindowSurface实例表示其描画区域,Screen驱动就通过这个QWSWindowSurface实例获得对应的内存区块,最后,Screen驱动还要将所有的QWSWindowSurface合成为一张图片,然后拷贝这张图片的数据到Framebuffer,相关结构如下图所示。

这里写图片描述

8、Accelerated Graphics

在Qt for Embedded Linux中,GUI描画是一个纯软件实现,但从Qt4.2开始,可以添加加速的图像驱动(Accelerated Graphics Driver),以充分利用硬件资源,结构如下图所示。

这里写图片描述

Client通过Qt描画系统把每个Window渲染在对应的Surface上,然后把Surface保存到内存中,Screen驱动访问这个内存把各个Surface合成为一张图片,然后拷贝图片数据到Framebuffer进行显示。添加加速的图像驱动时,需要创建Screen(QScreen),实现光栅描画引擎(QRasterPaintEngine),创建描画设备(QCustomRasterPaintDevice)、Surface(QWSWindowSurface)等,这些都是相关的,一开始的Screen驱动插件创建Screen,Screen创建Surface,Surface创建PaintDevice,PaintDevice创建PaintEngine。

【参考】http://doc.qt.io/qt-4.8/qt-embedded-linux.html
【参考】http://doc.qt.io/qt-4.8/qt-embedded-architecture.html
【参考】http://en.tldp.org/HOWTO/Framebuffer-HOWTO/index.html
【参考】http://doc.qt.io/qt-4.8/qvfb.html
【参考】http://doc.qt.io/qt-4.8/qt-embedded-vnc.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值