大家好,我是IT文艺男,来自一线大厂的一线程序员

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

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

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

分析的过程分解::

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

二、刷新事件的处理流程

三、绘制到内存Image

四、刷新结果输出到屏幕

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

分析void QWidget::update()函数的源码,即调用update没有传递参数,则默认刷新控件的整个区域,调用重载的update函数

  1. 如果控件是隐藏或者刷新被禁用,则直接返回
  2. 参数传递的矩形与控件矩形的交集,如果为空,则直接返回
  3. 如果支持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::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QPoint &offset, int flags,QPainter *sharedPainter, QWidgetBackingStore *backingStore)函数

函数主体内容如下::

1、绘制背景

2、绘制前景(send the paint event)

3、绘制子控件(paintSiblingsRecursive函数调用)

QWidgetPrivate::paintSiblingsRecursive函数里又会调用QWidgetPrivate::drawWidget函数从而形成树形绘制

四、刷新结果输出到屏幕

qtbase\src\plugins\platforms\windows目录中的QWindowsBackingStore::flush函数中会调用BitBlt函数(Windows API函数)

关注我的微信公众号(itwenyinan)下载完整的讲解视频、PPT、Code;

下载后包括如下内容::

Qt update刷新之源码分析总结的更多相关文章

  1. Qt update刷新之源码分析(一)

    在做GUI开发时,要让控件刷新,会调用update函数:那么在调用了update函数后,Qt究竟基于什么原理.执行了什么代码使得屏幕上有变化?本文就带大家来探究探究其内部源码. Qt手册中关于QWid ...

  2. Qt update刷新之源码分析(二)

    大家好,我是IT文艺男,来自一线大厂的一线程序员 上次视频给大家从源码层面剖析了Qt update刷新机制的异步事件投递过程,这次视频主要从源码层面剖析Qt刷新事件(QEvent::UpdateReq ...

  3. Qt update刷新之源码分析(三)

    大家好,我是IT文艺男,来自一线大厂的一线程序员 上次视频给大家从源码层面剖析了Qt刷新事件(QEvent::UpdateRequest)的处理流程,这次视频主要从源码层面剖析对刷新事件的进一步处理, ...

  4. Qt事件分发机制源码分析之QApplication对象构建过程

    我们在新建一个Qt GUI项目时,main函数里会生成类似下面的代码: int main(int argc, char *argv[]) { QApplication application(argc ...

  5. Android8.1 MTK平台 SystemUI源码分析之 网络信号栏显示刷新

    SystemUI系列文章 Android8.1 MTK平台 SystemUI源码分析之 Notification流程 Android8.1 MTK平台 SystemUI源码分析之 电池时钟刷新 And ...

  6. Android8.1 SystemUI源码分析之 电池时钟刷新

    SystemUI源码分析相关文章 Android8.1 SystemUI源码分析之 Notification流程 分析之前再贴一下 StatusBar 相关类图 电池图标刷新 从上篇的分析得到电池图标 ...

  7. Qt源码分析之QObject

    原文:http://blog.csdn.net/oowgsoo/article/details/1529284 我感觉oowgsoo兄弟写的分析相当透彻,赞! 1.试验代码: #include < ...

  8. QT源码分析(从QApplication开始)

    QT源码分析 转载自:http://no001.blog.51cto.com/1142339/282130 今天,在给同学讲东西的时候,谈到了Qt源代码的问题,才发现自己对Qt机制的了解是在太少了,而 ...

  9. Netty源码分析第7章(编码器和写数据)---->第4节: 刷新buffer队列

    Netty源码分析第七章: 编码器和写数据 第四节: 刷新buffer队列 上一小节学习了writeAndFlush的write方法, 这一小节我们剖析flush方法 通过前面的学习我们知道, flu ...

随机推荐

  1. 833A The Meaningless Game

    A. The Meaningless Game time limit per test 1 second memory limit per test 256 megabytes input stand ...

  2. Netty(五)Netty 高性能之道

    4.背景介绍 4.1.1 Netty 惊人的性能数据 通过使用 Netty(NIO 框架)相比于传统基于 Java 序列化+BIO(同步阻塞 IO)的通信框架,性能提升了 8 倍多.事 实上,我对这个 ...

  3. Deep Learning Specialization 笔记

    1. numpy中的几种矩阵相乘: # x1: axn, x2:nxb np.dot(x1, x2): axn * nxb np.outer(x1, x2): nx1*1xn # 实质为: np.ra ...

  4. TS & ES-Next & playground

    TS & ES-Next & playground TS TypeScript: TS Playground - An online editor for exploring Type ...

  5. 什么是 DNS 的 A记录 和 CNAME记录 域名解析 为我的自定义域名创建 CNAME 记录

    # CNAME https://support.google.com/blogger/answer/58317?hl=zh-Hans 为我的自定义域名创建 CNAME 记录 如果您的域名不是在 Blo ...

  6. website SEO all in one

    website SEO all in one SEO 指标量化 https://www.similarweb.com/zh/top-websites/ demo https://www.similar ...

  7. Flutter & QRCode App

    Flutter & QRCode App https://github.com/xgqfrms/qrcode-reader-app how to open android emulator o ...

  8. Union international INC评德意志联邦投入十亿欧元重启文化娱乐产业

    当地时间6月4日,德国联邦政府宣布了一项名为"重启文化"(Neustart Kultur)的计划,将投入总计10亿欧元,用以支持德国文化及创意产业的恢复和重建. Union int ...

  9. uniapp 自定义弹窗组件

    先上效果: 组件源码:slot-modal.vue <template> <view class="modal-container" v-if="sho ...

  10. 【Notes_4】现代图形学入门——光栅化、离散化三角形、深度测试与抗锯齿

    光栅化 Viewport Transform(视口变换) 将经过MVP变换后得到的单位空间模型变换到屏幕上,屏幕左边是左下角为原点. 所以视口变换的矩阵 \[M_{viewport}=\begin{p ...