通過鼠標事件來看QT/Embedded 窗體事件是如何派發(fā)的QT的窗體系統(tǒng)可以包含多個進程,對于Linux上的應用,一個進程可以對應一個應用程序,每個應用程序都有自己的MainWindow,也可以有自己的Widget stack.。假設一種情況:同時打開多個應用,并且各個應用之間的Windows不存在完全覆蓋,當我們用鼠標點擊某個應用的窗體,這個應用的窗體便會出現(xiàn)在屏幕的最上層。對于了解windows窗體服務器的同行來說,理解這個并不難,可能有一個類似于Windows XP X-Windows Sever的進程負責管理鼠標、鍵盤、與LCD顯示的操作。對于智能手機的GUI我是第一次接觸,非智能手機的窗體管理是比較簡單的,以我以前從事的一個手機平臺為例,手機只存在一個dialog Stack, 把這個stack 看成一個Z坐標,棧底位于坐標原點,顯示一整屏幕完整的畫面就是從棧頂沿Z坐標向下找到沒有被完全覆蓋的windows直到整個屏幕數(shù)據(jù)被完全填充,按鍵事件傳入到ui_task(ui_task 負責初始化其他應用,所有windows event都由dialogstack 應用負責分發(fā))?;貧w正卷,QT是如何管理窗體的呢?下面詳述。
QApplication如何取得Mouse Event? 查看QApplication的代碼,存在一個GuiSever類型的應用,GuiServer類型的應用與其他類型的應用有什么區(qū)別的呢?最大的區(qū)別就在于通過qt_init初始化函數(shù)調用QWSServer::startup這個應用建立了一個窗體服務器。在QWSServer的構造函數(shù)中: openDisplay(); //初始化顯示、屏幕參數(shù),打開LCD。 openMouse(); //打開鼠標設備 openKeyboard(); //打開鍵盤設備 openMouse() :QWSMouseHandler* h = newMouseHandler(ms)打開鼠標設備,打開鼠標設備后,通過QSocketNotifier接口監(jiān)聽打開的鼠標設備文件描述符,在QWSMouseHandler構造函數(shù)中通過調用setMouseHandler 建立了window Server與鼠標設備之間的通信即:在QWSServer中 connected SIGNAL(mouseChanged)與SLOT(setMouse)(目前這個平臺與新的QT開發(fā)包有出入,在qt-embedded-free-3.3.6中 鼠標與windows Server之間通訊是通過在qmouse_ws.cpp中直接調用QWSServer::sendMouseEvent 來實現(xiàn)的)。走到這,我們已經能夠獲取鼠標數(shù)據(jù)了。這些數(shù)據(jù)最終會傳遞到哪個窗體,在sendMouseEvent中通過調用window.At(pos)查找windows List所有應用的TOP-LEVEL windows保存在此鏈表中,(TOP-LEVEL窗體是指無parent或者style為:WType_TopLevel的窗體)中請求響應區(qū)域包含鼠標坐標的窗體(requested-region: 窗體顯示的區(qū)域),一旦找到數(shù)據(jù)便會傳遞到此窗體(消息放入到QApplication的incoming消息隊列中,由QApplication負責派發(fā))然后通過Client Socket將此消息傳遞到相應的application的消息隊列里。
QWSSever與Application之間通信管道的建立 QT支持多進程,對一個嵌入式設備而言,存在一個獨立的GuiServer類型的應用,這個應用作為服務器,其他的應用作為客戶端。服務器與客戶端的連接在應用初始化的時候完成。 服務器: Server Application進程通過調用QWSServer::startup完成Server的建立。 客戶端: Application 調用QWSDisplayData::init創(chuàng)建QWSSocket對象并通過connectToLocalFile建立與服務器的連接。 歡迎交流。 Xiongzhichen English name: albertChen from: http://www./Html/Article/embedt/Class89/911320080121202301.html |
|
|