所有的Qt图形应用程序要运行就必须连接到Qt 服务器,Qt服务器负责管理鼠标,键盘,屏幕这些输入输出设备,同时还进行窗口管理,处理窗口重叠,移动,焦点转换,字体管理,输入法管理等。而Client端则是在窗口内部进行Widget的管理,绘制,以及文件,网络等其他操作,等待服务器端传递过来的用户输入事件,然后在绘制完毕以后发消息通知服务器,由服务器进程控制显示(对于支持Direct Painting的设备,是直接绘制到显示设备上)。
下图是Qt/E的客户端服务器架构:
由于Qt设计时出于资源节省的考虑以及灵活性,服务器进程并不是一个单独的进程,而是第一个启动的Qt图形应用程序,它既是客户端进程,也是服务器端进程,从程序设计的角度来说它可以和正常的客户端进程表现完全一致,但是它却掌管着对所有的设备的访问,这样的设计会导致Qt架构内部不是那么清晰,但是好处也是非常明显的,因为服务器端进程同时也是一个客户端进程,可以直接和用户进行一些特殊的交互,比如像Qt/E中的输入法设计等等。
服务器进程管理着底层的各种设备,因此有许多工作只能放在Qt/E服务器进程中进行,下面列举一些:
1.键盘过滤:
void QWSServer::addKeyboardFilter ( KeyboardFilter * filter ) [static]
这个是QWSServer的一个静态函数,不需要实例化QWSServer即可访问,这个只是从c++语法角度而言,实际上还是要访问其实例的,只不过因为QWSServer只有一个实例,因此没必要暴露给用户而已。并且QWSServer显然在客户端进程中是没有实例化的,所以要进行键盘过滤只能在QT/E服务器进程中进行。Qt/E不支持全局热键也是这个原因,不过我们可以借助服务器进程实现一种伪全局热键。
2.输入法:
输入法只能放在服务器进程中,是因为其设计架构,用到了很多服务器进程中的内部信息。要通过继承QWSInputMethod来实现输入法的话,只能放在服务器进程 。3屏幕保护: QWSScreenSaver提供了屏幕保护的基本操作接口,其内部状态由QWSSErver来维护,和输入法一样,Qt/E的内部代码中处处是将其放在了服务器端,只能如此。
3.屏幕保护
QWSScreenSaver提供了屏幕保护的基本操作接口,其内部状态由QWSSErver来维护,和输入法一样,Qt/E的内部代码中处处是将其放在了服务器端,只能如此。
4.控制屏幕是否显示
void QWSServer::enablePainting ( bool enable )
这个函数非常有用,当要控制所有的应用程序的屏幕显示时,让屏幕保持当前内容,那么就将enable设为false即可,这样所有的应用程序都不能改变屏幕显示内容了
应该说有非常多的工作只能在服务器进程中进行,暂时就想到这么多,先写这几个吧。