小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

通過鼠標事件來看QT/Embedded 窗體事件是如何派發(fā)的

 guitarhua 2012-02-10

通過鼠標事件來看QT/Embedded 窗體事件是如何派發(fā)的

分類: Qt 154人閱讀 評論(0) 收藏 舉報

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 SIGNALmouseChanged)與SLOTsetMouse)(目前這個平臺與新的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ù)便會傳遞到此窗體(消息放入到QApplicationincoming消息隊列中,由QApplication負責派發(fā))然后通過Client Socket將此消息傳遞到相應的application的消息隊列里。

 Windows List是如何建立的?
我們在創(chuàng)建每一個QWidget對象時,系統(tǒng)會調用 QWidget::create函數(shù),如果我們創(chuàng)建的這個QWidget為TOP-LEVEL則將發(fā)送消息到QWSSever在這里創(chuàng)建一個 GlobalWinowsID(參看QWSServer中get_object_id()調用),如果QWidget為Child widget則在這個應用中創(chuàng)建了一個LocaWindowslId,(參看takeLocalId())不管得到的winodwsId在哪兒被創(chuàng)建,在 每個獨立的Application中都會通過QWidget::setWinId保存。GlobalWindows與LocalWindows的區(qū)別是: 在QWSServer中創(chuàng)建的GlobalwindowsID用于全局QApp即:按鍵,鼠標等事件通過QWSSever傳遞至相應的應用。按鍵,鼠標事 件則在獲得這些事件的QApp的Focus Widget中處理,這些Focus Widget可以是GlobalWindows 也可以是LocalWindows。在這個窗口沒有show之前,我們還只是得到了WindowsId,當窗口被顯示時,在QWSServer中將創(chuàng)建一 個基于GlobalWindowsID的QWSWindow對象并將此對象保存在QWSServer的windows List中。
 
QApplicationMouse Event的傳遞與處理
當application的消息隊列不空時調用 processEvents來處理消息隊列。如果應用沒有模式對話框,并且沒有綁定Mouse Event的widget,則在Application中遍歷GlobalWindow(對用戶而言是可以鼠標所在的那個窗體)所對應的Widget所有 子QWidget對象,也就是說首先從他的child widget開始查找響應Mouse Event的Widget,如果這個窗口沒有被優(yōu)先級更高的窗口被遮蓋,便會調用raise函數(shù),將窗體調整到windows list的最上層。

QWSSeverApplication之間通信管道的建立

QT支持多進程,對一個嵌入式設備而言,存在一個獨立的GuiServer類型的應用,這個應用作為服務器,其他的應用作為客戶端。服務器與客戶端的連接在應用初始化的時候完成。

服務器:

Server Application進程通過調用QWSServer::startup完成Server的建立。

 客戶端:

         Application 調用QWSDisplayData::init創(chuàng)建QWSSocket對象并通過connectToLocalFile建立與服務器的連接。

 

 

歡迎交流。

Xiongzhichen  English name: albertChen

blackdream2@sina.com

from: http://www./Html/Article/embedt/Class89/911320080121202301.html

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多