下图是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即可,这样所有的应用程序都不能改变屏幕显示内容了
应该说有非常多的工作只能在服务器进程中进行,暂时就想到这么多,先写这几个吧。