首页| 论坛| 消息

标题:Qt update刷新之源码分析总结
作者:it文艺男
日期:2021-03-13 12:58
内容:

大家好,我是IT文艺男,来自一线大厂的一线程序员
经过前面几次的Qt源码讲解,我相信大家对Qt update刷新机制从底层原理上有了一个深刻的理解;这次做一个收尾总结,来复盘前面几次所讲解的内容;

分析的切入点、思考点::

在做GUI开发时,要让控件刷新,会调用update函数;那么在调用了update函数后,Qt究竟基于什么原理、执行了什么代码使得屏幕上有变化?

分析的过程分解::

一、刷新事件异步投递过程
二、刷新事件的处理流程
三、绘制到内存Image
四、刷新结果输出到屏幕

一、刷新事件异步投递过程

分析void QWidget::update()函数的源码,即调用update没有传递参数,则默认刷新控件的整个区域,调用重载的update函数如果控件是隐藏或者刷新被禁用,则直接返回参数传递的矩形与控件矩形的交集,如果为空,则直接返回如果支持BackingStore(默认支持),则标脏该控件所属的顶层窗口(TLW:: topLevelWidget缩写)区域,即调用tlwExtra->backingStoreTracker->markDirty(r, this);函数
a、把控件加入到dirtyWidgets容器中(addDirtyWidget函数)
b、通知tlw进行刷新(sendUpdateRequest函数)
sendUpdateRequest函数Post一个QEvent::UpdateRequest事件,即放入事件队列中,立即返回;QEvent::UpdateRequest事件的接受者为tlw;


二、刷新事件的处理流程

追踪QEvent::UpdateRequest事件处理,进入消息通知流程,即QApplication::notify(QObject *receiver, QEvent *e)函数(没有对QEvent::UpdateRequest事件进行处理),进一步由QApplicationPrivate::notify_helper(QObject *receiver, QEvent * e)函数处理;
receiver的event函数不做处理,其调用父类的event函数,即bool QWidget::event(QEvent *event)函数,该函数中针对事件类型进行处理(switch case);
对于QEvent::UpdateRequest事件处理,QWidgetBackingStore::doSync函数中调用tlw->d_func()->drawWidget(store->paintDevice(), dirtyCopy, QPoint(), flags, 0, this);函数进行绘制,函数的第一个参数是获取绘制设备,对于Windows平台,绘制目的设备为内存Image

三、绘制到内存Image

回到QWidgetPrivate:: ..


#1 [liudianwu 03-14 11:40]
大佬开始进军公众号和培训了
#2 回 liudianwu 的帖子 [liulin188 03-14 18:24]
liudianwu:大佬开始进军公众号和培训了 (2021-03-14 11:40) 
培训来钱快,一割一大把
#3 回 liulin188 的帖子 [it文艺男 03-14 21:37]
liulin188:培训来钱快,一割一大把 (2021-03-14 18:24) 
不割韭菜;例如买本喜欢的书籍,相当于为知识付费

回复 发表
主题 版块