前面提到的伺服器最重要的功能就是對滑鼠,鍵盤,螢幕等資源進行配置設定管理,尤其是要獨占滑鼠,鍵盤等裝置,是以伺服器要把各種底層裝置消息通知到各個用戶端程序,目前主流的GUI平台都無一例外采用事件驅動模型,這些消息正是其事件的主要來源,在其内部表示為QWSEvent,所有具體的消息(事件)都是其子類,下圖給出了所有的消息(事件):

這裡面有很多事件是非常直覺的,比如鍵盤事件,滑鼠事件等,而有一些事件就不那麼直覺了,很難看明白,像QWSConnectedEvent,QWSPropertyReplyEvent等,他們有的是為了用戶端和伺服器之間通信的輔助性事件,比如QWSConnectedEvent,而像QWSPropertyReplyEvent,則是Qt内部管理的需要,與實體裝置像滑鼠,鍵盤,螢幕沒有關系,在移植過程中也不會涉及,并且也很少直接與這些事件打交道,是以就不再深入分析了,但是這些事件的傳遞過程是一樣的。
這裡以滑鼠事件QWSMouseEvent為例來講解,事件如何從伺服器傳遞到用戶端。我們知道伺服器和用戶端的通信和網絡通信是一樣的,必須将資料串行化才能進行傳遞。伺服器程序将QWSEvent串行化(具體過程見前一節分析),然後發送到用戶端程序,而用戶端程序則進行相反的工作,依據串行化的位元組序列,建立起一個QWSEvent對象執行個體。QWSEvent的反串行化的過程,是典型的工廠模式的應用(Qt中有很多典型的設計模式的使用範例),具體流程如下:
Qt中有不少地方用到了工廠模式,這裡使用的模式還是比較典型的,值得學習一下。
QWSEvent *QWSEvent::factory(int type)
{
QWSEvent *event = 0;
switch (type) {
……
case QWSEvent::Mouse:
event = new QWSMouseEvent;
break;
default:
qCritical("QWSEvent::factory() : Unknown event type %08x!", type);
}
return event;
}