大家好,我是IT文藝男,來自一線大廠的一執行緒式員
上次視頻給大家從原始碼層面剖析了Qt update重繪機制的異步事件投遞程序,這次視頻主要從原始碼層面剖析Qt重繪事件(QEvent::UpdateRequest)的處理程序
我們追蹤QEvent::UpdateRequest事件處理,進入訊息通知流程,即QApplication::notify(QObject *receiver, QEvent *e)函式(沒有對QEvent::UpdateRequest事件進行處理),進一步由QApplicationPrivate::notify_helper(QObject *receiver, QEvent * e)函式處理;如下圖所示::

函式主體內容如下::
1、application的事件過濾器處理,即全域的事件過濾處理
2、receiver的事件過濾器處理,即當前視窗的事件過濾處理
3、呼叫receiver的event函式處理,即當前視窗的事件處理
receiver的event函式不做處理,如下圖所示::

其呼叫父類的event函式,即bool QWidget::event(QEvent *event)函式,該函式中針對事件型別進行處理(switch case),如下圖所示::

對于QEvent::UpdateRequest事件,則呼叫syncBackingStore函式,如下圖所示::

函式主體內容如下::
1、獲取tlw的QWidgetBackingStore
2、呼叫sync函式


QWidgetBackingStore::doSync函式中呼叫tlw->d_func()->drawWidget(store->paintDevice(), dirtyCopy, QPoint(), flags, 0, this);函式進行繪制,函式的第一個引數是獲取繪制設備,各個平臺回傳自己的繪制設備,例如對于Windows平臺

qwindowsbackingstore.cpp檔案位于qtbase\src\plugins\platforms\windows目錄;
今天就講解到這里,總結下整體思路即是從事件處理到繪制的程序分析,很清晰;
下次視頻進行原始碼剖析Qt update重繪機制的繪制程序;謝謝
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/264365.html
標籤:C++
