文档章节

Inside Qt Series (十三):Qt/e体系结构概述

For_MGP
 For_MGP
发布于 2015/08/28 16:53
字数 1150
阅读 54
收藏 0
QTE

从本节(Inside Qt Series 十三)开始,本专栏文章的内容开始转向Qt for Embedded Linux的技术内幕介绍。在后续内容中,我对Qt for Embedded Linux一律简称为Qt/e,不再对这个term做更多的解释。需要您注意的一点是,在本系列文章中的任何部分,这个term都是指Qt for Embedded Linux,而不是指Qt for Windows CE。

这些内容所适用的软件版本是:Qt for Embedded Linux 4.5.1, Open Source edition



首先,让我们来看看Qt/e的系统结构介绍:

Qt for destop Linux 和 Qt for Embedded Linux最大的区别就在于他们所依赖的底层显示基础的不同,这也就导致了他们在体系结构上的差异。对于Qt for desktop Linux来说,底层的显示技术构建在X Window System之上,完全依赖于X System,他们在下层完全是调用了X Lib的系统方法来把界面上的东西显示出来。

Qt for embedd linux在这方面则完全不同,它并没有构建在X Window之上,而是构建在Linux的Framebuffer之上,把在界面上需要显示的内容直接写入了framebuffer。因为在嵌入式系统上 把X System给省略了,这样会节省许多的系统开销。而直接写framebuffer,又会加快显示速度。这种区别如图所示:

但就是这一个改变,导致了在Qt/E凭空多出了一个Server这么一层,这一层负责监听系统事件,尤其是键盘和鼠标事件,屏幕输出,管理 region, 管理顶层窗口,管理光标和屏幕保护程序等等诸多功能。系统产生的键盘鼠标事件,首先就传给了这个server application,然后server在根据具体的情况把这些事件分发给相应的应用程序。

每一个Qt/e应用程序,都需要这样一个server存在。一个程序运行起来后,如是自己成为Server进程,就是连接到一个已经存在的Server进 程。所以,第一个运行起来的Qt/E应用程序就会启动这个server让自己成为这个Server进程,后续运行的程序就会连接到这个Server来管理 自己。

在Server端,每一个连接到QWSServer的client都有一个QWSClient对象与之对应,这个对象主要记录了client ID。在应用程序中每创建一个顶层窗口,那么在server端就会有创建一个QWSWindow实例来与之对应。

每一个Server实例都是由一个QWSServer类来实现的。

每当Server收到一个event的时候,它需要判断应该发送给那一个窗口,这时候,它就会从QWSWindow列表中去找,然后根据这个窗口去找对应 的client application,然后用一个QWSEvent对象来包装这个event,通过socket机制发送给具体的client application。如果当前系统安装了一个输入法,那么每一次键盘事件产生的时候,都会去调用输入法的相应方法。
如图所示(取自Qte文档):

鼠标事件的处理和键盘事件的处理也符合上面的流程。鼠标驱动由一个QWSMouseHandler对象封装,键盘驱动由一个 QWSKeyboardHandler封装。这两个驱动程序对象都会通过Qt的plugin机制加载。具体的鼠标和键盘事件发生之后,都会封装成为一个 QWSEvent对象并发送给具体的client。如图所示(取自Qte文档):

图形输出,Qte的缺省行为是每一个widget会把自己画在一块内存中,然后由Server负责把这快内存copy到Linux的Framebuffer上去,如图所示(取自Qte文档):

但是对于大多数嵌入式系统来说,其中的显示子系统都是确定的,这样对于client应用程序来说,就可以直接输出到Framebuffer上面去。 有两种 方法可以实现这一点,第一种是为每一个Widget都设置Qt::WA_PaintOnScreen属性,另一种是QDirectPainter来在 Framebuffer中保留一块区域,如图所示(取自Qte文档):

====================================
声明:
《Inside Qt Series》专栏文章是Qt核心技术论坛(InsideQt.com)原创技术文章。
本系列专栏文章可随意转载,但必须保留本段声明和每一篇文章的原始地址。
作者保留版权,未经作者同意,不得用于任何商业用途


本文转载自:InsideQt.com

For_MGP
粉丝 2
博文 66
码字总数 20576
作品 0
深圳
程序员
私信 提问
QML官方系列教程——QML Applications

附网址:http://qt-project.org/doc/qt-5/qmlapplications.html 假设你对Qt的官方demo感兴趣,能够參考本博客的另一个系列Qt5官方demo解析集 每一个绿色字体均是一篇博文连接。请收藏本文,本...

太空堡垒
03/03
467
0
Qt源码分析之概述

现代的代码项目都使用git管理,qt也不例外,如果一个项目由很多子项目组成,可以使用git的submodule机制. git官方的发布仓库在http://code.qt.io,这是一个只读的仓库镜像,作为一个具有规模的项目...

心翔
2016/06/22
231
0
Qt动画框架The Animation Framework

一个网友翻译的,没有翻译完,我把剩下的那部分翻译出来贴出来 动画框架是Kinetic(运动)项目的一部分,它的目标是提供一中简单的方法创建动画的和流畅的GUI。借助Qt动画属性,可以提供非常...

晨曦之光
2012/04/13
2.9K
0
深圳技达/giveda_linux_gui_engine

简介和概述 Qt是芬兰人做的一个优秀的图形引擎,API简单易用、远远超越了那些还在使用win32API&callback的同类产品;但Qt实在太庞大了。 2018年,Qt公司内部立项了一个将Qt移植到MCU的研发新...

深圳技达
01/05
0
0
【C/C++】qt库结构及示例

QT库结构   Qt图形库是一个组织严谨的C++类库,其结构如图所示 细说Qt库   Qt类库中包含了上百个类,结构十分复杂,上图展示了Qt_3.2类库的基本结构。   Qt类库中的类可以分成两种类型...

wbf961127
2017/11/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
5
0
学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
今天
8
0
VMware vSphere的两种RDM磁盘

在VMware vSphere vCenter中创建虚拟机时,可以添加一种叫RDM的磁盘。 RDM - Raw Device Mapping,原始设备映射,那么,RDM磁盘是不是就可以称作为“原始设备映射磁盘”呢?这也是一种可以热...

大别阿郎
今天
12
0
【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
16
0
Linux 内核的五大创新

在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大...

阮鹏
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部