QT的顯示機制

2021-07-23 16:45:49 字數 4200 閱讀 4617

1、qt圖形框架資料01---- 2、

了解qt顯示機制,最重要的就是要了解qt是如何管理窗體的顯示區域的,這裡有個重要的類:qregion, 在qt中可以通過qregion定義乙個窗體的顯示區域,也可以通過qregion定義窗體的可修改區域,比如在qpainter()中通過qpainter::setcliprect設定乙個區域,我們繪圖則只能在這個區域,此區域外繪圖都是無效的。通過qregion可以作一系列的邏輯運算,如兩個區域相加,相減等。qregion定義的區域不一定是連續的,但一定是由封閉的區域組成的,我們常會碰到乙個窗體的顯示區域被其他窗體分割為幾塊的情況。qt對這些顯示區域的管理,類似於對窗體的管理,也是通過伺服器與客戶端的方式。參照以前的說法server表示為全域性的global ,客戶端為本地得local。那麼windowsserver管理乙個全域性的顯示區域即所有的top-level widget顯示區域。而其他的child windget 的管理則在每乙個qt應用程式中由qwsregionmanager管理,top_level widget 顯示區域也會載入在其中,這個不難理解,因為server只是負責將窗體事件傳送到客戶端,具體處理還是由客戶端來操作。具體的流程還是來看**吧。  

顯示區域管理者qwsregionmanager的初始化  

伺服器:  

通過呼叫opendisplay()。  

客戶端:     

在qwsdisplaydata類的建構函式中通過呼叫qwsdisplaydata::init()完成。  

考慮乙個比較簡單的情況,我們要顯示的widget 是乙個top_leverl widget。在呼叫show()函式中,這個widget將通過showwindows()向伺服器請求做三件事:(以下窗體是指在global windows statck 中的top_level widget)  

1:呼叫qwsdisplay::requestregion向伺服器請求窗體顯示區域。  

2:呼叫qwsddisplay::setaltitude向伺服器請求設定窗體的優先順序。此優先順序是指在windows statck中的位置,而不是指qwswidow 中的窗體優先順序屬性。windows statck 中的第乙個窗體就是顯示在lcd上最前面的窗體。  

3:呼叫qwsdisplay::requestfocus 向伺服器請求設定窗體為焦點窗體。焦點窗體能接收key, mouse 事件,但不是所有的焦點窗體都能接收key,mouse 事件,如果有窗體設定為grabkey 或則grabmouse 則key, mouse 事件將分別傳遞至此窗體。  

下面將通過**分析winddows server對這三個請求的處理過程:  

一: qwsdisplay::requestregion的處理  

void

qwsserver::invokeregion( qwsregioncommand *cmd, qwsclient *client )  

invokeregion呼叫setwindowregion設定窗體顯示區域,呼叫syncregions通知客戶端 重新整理顯示區域,並產生一些窗體事件如:show, geometry,hide 。  

setwindowregion函式的實現如下:  

qregion qwsserver::setwindowregion( qwswindow* changingw, qregion r )  

else

qregion extra_allocation;  

intwindex = -1;  

bool

deeper = changingw == 0;  

for(uint i=0; i

qwswindow* w = windows.at(i);  

if( w == changingw )  else

if( deeper )  else

if( r.isempty() )   

}  ...................  

if( changingw && !changingw->requested_region.isempty() )  

changingw->addallocation( rgnman, extra_allocation & screenregion );  

//為changingw窗體增加新的可見區域 置modifed標誌為true

else

if( !disablepainting )  

paintserverregion();  

exposeregion( exposed, windex+1 );//增加低階窗體可見區域。

return

exposed;  

}  注:增加新的顯示區域不一定是整個顯示區域的面積增大了,而是顯示區域的塊變多了。 乙個顯示區域可能由多個不連續和連續的region組成。  

void

qwsserver::exposeregion( qregion r, 

intstart )  

dirtybackground |= r; //得到需要重新整理的背景區域 如果r為空 則新增區域為0

}  exposeregion為低等級窗體增加可見區域。  

syncregions:此函式主要是向客戶端傳送regionmodified事件,真正的繪圖也是由客戶端來完成。 還是通過**來分析:  

void

qwsserver::syncregions( qwswindow *active )  

void

qwsserver::notifymodified( qwswindow *active )  

}  void

qwswindow::updateallocation()  

}  客戶端對regionmodifyevent的處理。  

客戶端接收到訊息後會呼叫translateregionmodifiedevent函式來進行處理  

bool

qetwidget::translateregionmodifiedevent( 

const

qwsregionmodifiedevent *event )  

}  qwsdisplay::grab();  

intrevision = *rgnman->revision( alloc_region_index );  

if( revision != alloc_region_revision )  else

if( event->******data.nrectangles )  

//paintevent事件到各窗體

qws_regionrequest = false;  

return

true;  

}  repainthierarchy函式中所有需要重新整理的子窗體都會收到paint事件。在paint事件中,開始繪圖。顯示中只重新整理exposed這個區域而不是將分配的區域alloc_region 全部重新整理一次,這樣做可以提高效率。  

二:qwsddisplay::setaltitude 的處理  

invokesetaltitude(const

qwschangealtitudecommand *cmd,  

qwsclient *client)  

if( alt < 0 )  

lowerwindow( changingw, alt ); //窗體優先順序下降

else

raisewindow( changingw, alt ); // 提公升窗體優先順序

if( !changingw->forclient(client) )   

}  invokesetaltitude通過呼叫lowerwindow,raisewindow來調整窗體的優先順序,如果乙個widget被顯示,即呼叫show此時alt == 0; 如果alt == 1則此窗體應該為最上層,如果alt == 2則窗體位full-screen即全屏顯示的窗體,可以通過setwflags(wstyle_staysontop) 來設定這個屬性。 優先順序較高的窗體將被優先顯示, 在沒有顯式通過setregionpriority命令來改變窗體優先順序的話,在windows stack中窗體將按照後進的優先順序較高為原則。 可以參考 insertprioritizedwindow函式,在qt-embedded-free-3.3.6 可能沒有這個函式,因為在這個版本中不存在窗體優先順序,除了wstyle_staysontop屬性的窗體為第一級優先順序外,其他窗體都按照後進的優先為原則。   

三:qwsdisplay::requestfocus 的處理請參考invokesetfocus函式。 

QT顯示機制 一

qt顯示機制 一 blackdream2 qt顯示機制 albertchen 了解qt顯示機制,最重要的就是要了解qt是如何管理窗體的顯示區域的,這裡有個重要的類 qregion,在qt中可以通過qregion定義乙個窗體的顯示區域,也可以通過qregion定義窗體的可修改區域,比如在qpainte...

QT顯示機制(五)

qt顯示機制 五 blackdream2 繪圖的底層操作 lcd螢幕上的每個點都與顯示緩衝區中的資料有特定的關係,對16位色的顯示緩衝區,每兩個位元組對應lcd上的乙個畫素,因此我們只要修改緩衝區某兩個位址上的資料就可以改變lcd上這個點的色彩,如果我們能夠得到這個顯示緩衝區的位址,應用程式編寫者就...

qt 事件機制

什麼是自發事件?哪些型別的事件可以被propagated 或compressed?posting and sending 事件之間有何不同?什麼時候應該呼叫 accept 或是ignore 如果這些問題你還不是很了解,那麼繼續看下去。事件起源 定製事件型別 到現在為至,我們所說的內容不僅僅適用於ke...