Qt update刷新之源碼分析(三)

  • 2021 年 3 月 13 日
  • 筆記

大家好,我是IT文藝男,來自一線大廠的一執行緒序員

上次影片給大家從源碼層面剖析了Qt刷新事件(QEvent::UpdateRequest)的處理流程,這次影片主要從源碼層面剖析對刷新事件的進一步處理,即繪製以及輸出螢幕的過程

回到QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QPoint &offset, int flags,QPainter *sharedPainter, QWidgetBackingStore *backingStore)函數

函數主體內容如下::
1、繪製背景
2、繪製前景(send the paint event)

即Send QPaintEvent事件,觸發virtual void QWidget::paintEvent(QPaintEvent *event)事件處理函數被調用
3、繪製子控制項(paintSiblingsRecursive函數調用)

QWidgetPrivate::paintSiblingsRecursive函數里又會調用QWidgetPrivate::drawWidget函數從而形成樹形繪製

繪製完成之後,怎麼輸出到螢幕上了?

qtbase\src\plugins\platforms\windows目錄中的QWindowsBackingStore::flush函數中會調用BitBlt函數(Windows API函數),如下圖所示::

QWindowsBackingStore::flush函數堆棧如下圖所示::

今天就講解到這裡,總結下整體思路即是繪製、螢幕輸出(Qt Windows插件的API函數調用)過程分析,很清晰; 謝謝

由於這裡不能發布影片,所以我在這發布了文章,在我的微信公眾號(itwenyinan)里同步發布了詳細的PPT以及影片進行詳細解說