嵌入式qt中的qws

来源:互联网 发布:耐克官网抢鞋软件 编辑:程序博客网 时间:2024/04/27 15:07

QT编程和文档中的术语QWS的全称是Qt windows system,是QT自行开发的窗口系统,体系结构类似X Windows,是一个C/S结构,由QWS Server在物理设备上显示,由QWS Client实现界面,两者通过socket进行彼此的通讯。在很多嵌入式系统里,QT程序基本上都是用QWS来实现,这样保证程序的可移植性。

另外在运行QT程序时添加-qws参数,表示这个程序时QWS Server,否则是QWS Client。任何一个基于QT的application都可以做QWS Server。当然QWS Server一定先于QWS Client启动,否则QWS Client将启动失败。在实际应用中,会指定某个特殊的application做QWS Server,这个application一般还会管理一些其它的系统资源。

QWS Server是如何管理QWS Client的? 
      QWS Server是一个server socket,QWS Client是一个client socket。QWS Client启动时会主动向QWS Server的server socket建立连接。而后就QWS Server通过这个socket传递QWSCommand和QWSEvent来管理QWS Client。

 在嵌入式平台,我们使用的QT会是以QWS方式运行,即会先运行QWSServer,再运行实际的窗体,在该情况下,默认QWS背景会是绿色的,而在嵌入式上,很多方案都会将video和graphic层分开,两层的层叠也是可调的,当需要在video上面做一些控制图标等,此时就需要将gfx调到vid之上,此时就需要将运行于gfx的qt程序设置背景透明,共需要设置两处:一处是QWS,一处是窗体。对此,我们使用qtcreator创建一个基于widget的程序(即继承于QWidget类),在构造函数中添加如下代码:

    setAttribute(Qt::WA_TranslucentBackground);
    此时可以将窗体背景设置为透明,而要使QWS背景透明,则需添加如下代码:
    1、添加头文件#include <QWSServer>;
    2、在上面的构造函数中添加:QWSServer::setBackground(QColor(0,0,0,0));
    至此,就可以达到目标功能需求了,上面的代码是在QT4.5环境下的,而使用到QWS时,只能在qvfb或嵌入式平台上运行才可以使用,而且使用到的framebuffer要设置为ARGB8888,而不是ARGB1555,这样才能使功能生效,我们QT编译使用的是32位的framebuffer,故使用ARGB8888。
    参考网址:http://mypyg.blog.51cto.com/820446/172661
              http://blog.csdn.net/fh400/archive/2010/05/17/5600458.aspx
              http://blog.csdn.net/goodlixueyong/archive/2010/10/18/5948486.aspx
              http://blog.csdn.net/lbsljn/archive/2009/12/29/5099590.aspx

QT Embeded应用没有来严格的区分server和client进程,如果一个QT进程的启动参数中有-qws,那么这个进程就具有server管理功能,被称为QWS server,当然这个进程同样可以和其它的QT进程一样可以创建并显示widget,只有兼做server的功能而已。

这个所谓的server功能主要是由QWSServer对象来实现的。

1.QWSServer的管理对象

 (1)keyboard设备和mouse设备 keyboard和mouse是一个display系统的输入设备,在QT Embedded中,QWSServer会初始化keyboard和mouse设备,并对其管理。读取key事件和mouse事件,并传送给相应的应用程序。 至于diplay系统中的显示设备screen,这不是由QWSServer统一管理的,为了提高效率,每个QT Client都可以打开这个设备,并向screen读写,以实现显示功能。但是每个QT client都向screen读写,屏幕会不会写乱了? 在QT中,这部分工作是由一个叫做QWSRegionManager的对角来管理的,以后再详细说明。

 (2)QWSClient 看上去,QWSServer QWSClient这两个类应该组成一个c/s结构,实际上QWSServer代表一个server socket. 当QT Client连接到QWSServer的server socket时,QWSServer会产生一个client socket与QT Client的socket进行通讯。QWSClient看上去像一个stub对象,代表一个QT client进程。每个QT Client进程在QWS server进程都有相应的QWSClient。

(3)QWSWindow QWSWindow对应于QT Client的toplevel widget。nontoplevel widget由于每个QT Client自行管理。所有toplevel widget需要接受QWS Server的管理,包括widget的focus,altitude,region等。

 (4)其它 QWSServer管理的其它全局对象,还有QWSScreenSaver,QWSSoundServer等。

2.QWSServer的初始化 QWSServer的初始化是在QApplication的初始化过程中完成的,具体的流程如下: QApplication::construct-->qt_init-->QWSServer::startup QWSServer::startup是一个static函数,创建全局对象qwsServer.QWSServer的构造函数会依次初始化所管理的对象。