Qt的绘制是如何发生的

QEvent::WindowDeactivate

当用户鼠标在应用之外时,会触发QEvent::WindowDeactivate事件,

     Qt5Widgetsd.dll!QApplication::setActiveWindow(QWidget * act) Line 2072    C++
     Qt5Widgetsd.dll!QApplicationPrivate::notifyActiveWindowChange(QWindow * previous) Line 2133    C++

对应的父类QWidget的响应事件方法,会先调用自己的update,再遍历所有儿子,并传播该事件给可见儿子

    case QEvent::WindowDeactivate: {if (isVisible() && !palette().isEqual(QPalette::Active, QPalette::Inactive))update();QList<QObject*> childList = d->children;for (int i = 0; i < childList.size(); ++i) {QWidget *w = qobject_cast<QWidget *>(childList.at(i));if (w && w->isVisible() && !w->isWindow())QApplication::sendEvent(w, event);}break; }

而update函数会把自己加到QWidgetBackingStore的dirtyWidgets列表中去

QEvent::UpdateRequest

QEvent::UpdateRequest会调用d->syncBackingStore();

QWidgetBackingStore::sendUpdateRequest函数会调用这个函数

QApplication::postEvent(widget, new QEvent(QEvent::UpdateRequest), Qt::LowEventPriority);

这是一个异步函数

而UpdateRequest很多时候是通过

     Qt5Cored.dll!QCoreApplicationPrivate::sendPostedEvents(QObject * receiver, int event_type, QThreadData * data) Line 1825    C++

调过来的

syncBackingStore会调用doSync

     Qt5Widgetsd.dll!QWidgetBackingStore::doSync() Line 1426    C++
>    Qt5Widgetsd.dll!QWidgetBackingStore::sync() Line 1210    C++
     Qt5Widgetsd.dll!QWidgetPrivate::syncBackingStore() Line 1953    C++

doSync里会调用

QWidgetPrivate::drawWidget函数

Layout::Resize会调用

     Qt5Widgetsd.dll!QToolBarAreaLayout::apply(bool animate) Line 936    C++

调用栈如下:

     Qt5Widgetsd.dll!QWidgetBackingStore::sendUpdateRequest(QWidget * widget, QWidgetBackingStore::UpdateTime updateTime) Line 502    C++
     Qt5Widgetsd.dll!QWidgetBackingStore::markDirty(const QRect & rect, QWidget * widget, QWidgetBackingStore::UpdateTime updateTime, QWidgetBackingStore::BufferState bufferState) Line 675    C++
     Qt5Widgetsd.dll!QWidgetPrivate::invalidateBuffer(const QRect & rect) Line 1635    C++
     Qt5Widgetsd.dll!QWidgetPrivate::invalidateBuffer_resizeHelper(const QPoint & oldPos, const QSize & oldSize) Line 1529    C++
     Qt5Widgetsd.dll!QWidgetPrivate::setGeometry_sys(int x, int y, int w, int h, bool isMove) Line 7363    C++
     Qt5Widgetsd.dll!QWidget::setGeometry(const QRect & r) Line 7261    C++
     Qt5Widgetsd.dll!QWidget::qt_static_metacall(QObject * _o, QMetaObject::Call _c, int _id, void * * _a) Line 514    C++
     Qt5Widgetsd.dll!QWidget::qt_metacall(QMetaObject::Call _c, int _id, void * * _a) Line 611    C++
     Qt5Widgetsd.dll!QToolBar::qt_metacall(QMetaObject::Call _c, int _id, void * * _a) Line 297    C++
     VkWidgets.dll!ToolbarWidget::qt_metacall(QMetaObject::Call _c, int _id, void * * _a) Line 103    C++
     Qt5Cored.dll!QMetaObject::metacall(QObject * object, QMetaObject::Call cl, int idx, void * * argv) Line 317    C++
     Qt5Cored.dll!QPropertyAnimationPrivate::updateProperty(const QVariant & newValue) Line 133    C++
     Qt5Cored.dll!QPropertyAnimation::updateCurrentValue(const QVariant & value) Line 240    C++
     Qt5Cored.dll!QVariantAnimationPrivate::setCurrentValueForProgress(const double progress) Line 285    C++
     Qt5Cored.dll!QVariantAnimationPrivate::recalculateCurrentInterval(bool force) Line 270    C++
     Qt5Cored.dll!QVariantAnimationPrivate::setDefaultStartEndValue(const QVariant & value) Line 332    C++
     Qt5Cored.dll!QPropertyAnimation::updateState(QAbstractAnimation::State newState, QAbstractAnimation::State oldState) Line 278    C++
     Qt5Cored.dll!QAbstractAnimationPrivate::setState(QAbstractAnimation::State newState) Line 989    C++
     Qt5Cored.dll!QAbstractAnimation::start(QAbstractAnimation::DeletionPolicy policy) Line 1358    C++
     Qt5Widgetsd.dll!QWidgetAnimator::animate(QWidget * widget, const QRect & _final_geometry, bool animate) Line 114    C++
     Qt5Widgetsd.dll!QToolBarAreaLayout::apply(bool animate) Line 936    C++

markDirty会调用QWidgetBackingStore::sendUpdateRequest

该方法会判断updateNow还是updateLater

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/651143.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一篇文章带你了解C++中隐含的this指针

文章目录 一、this指针的引出二、this指针的特性【面试题】 一、this指针的引出 我们先来定义一个日期类Date&#xff0c;下面这段代码执行的结果是什么呢&#xff1f; class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}v…

2024新版68套Axure RP大数据可视化大屏模板及通用组件+PSD源文件

Axure RP数据可视化大屏模板及通用组件库2024新版重新制作了这套新的数据可视化大屏模板及通用组件库V2版。新版本相比于V1版内容更加丰富和全面&#xff0c;但依然秉承“敏捷易用”的制作理念&#xff0c;这套作品也同样延续着我们对细节的完美追求&#xff0c;整个设计制作过…

【PythonRS】Rasterio库安装+基础函数使用教程

Rasterio是一个Python库&#xff0c;专门用于栅格数据的读写操作。它支持多种栅格数据格式&#xff0c;如GeoTIFF、ENVI和HDF5&#xff0c;为处理和分析栅格数据提供了强大的工具。RasterIO适用于各种栅格数据应用&#xff0c;如卫星遥感、地图制作等。通过RasterIO&#xff0c…

Two-factor authentication (2FA) is required for your GitHub account解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

SkyWalking介绍与使用docker-compose部署服务

一、Skywalking概述 1、Skywalking介绍 Skywalking是分布式系统的应用程序性能监视工具,专为微服务,云原生架构和基于容器(Docker,K8S,Mesos)架构而设计,它是一款优秀的APM(Application Performance Management)工具,包括了分布式追踪,性能指标分析和服务依赖分析等…

gitee仓库使用中的警告

当 Git 执行 git pull 命令时&#xff0c;有时候会出现类似下面的警告信息&#xff1a; warning: ----------------- SECURITY WARNING ---------------- warning: | TLS certificate verification has been disabled! | warning: ------------------------------------------…

Python退出主程序

import sys sys.exit(1) exit函数的使用方法 Exit the interpreter by raising SystemExit(status).If the status is omitted or None, it defaults to zero (i.e., success). If the status is an integer, it will be used as the system exit status. If it is another kin…

网络安全03---Nginx 解析漏洞复现

目录 一、准备环境 二、实验开始 2.1上传压缩包并解压 2.2进入目录&#xff0c;开始制作镜像 2.3可能会受之前环境影响&#xff0c;删除即可 ​编辑 2.4制作成功结果 2.5我们的环境一个nginx一个php 2.6访问漏洞 2.7漏洞触发结果 2.8上传代码不存在漏洞 2.9补充&#…

ubuntu 编译使用 liblas 读取点云

在ubuntu上使用las读取点云 1、环境配置 1.1、安装libgeotiff 下载依赖 sudo apt-get install libtiff-dev //安装libtiff sudo apt-get install libproj-dev //安装libproj下载源码&#xff0c;编译 如下该是libgeotiff-1.3.0版本安装包 wget https://download.osgeo.o…

【蓝桥杯冲冲冲】旅行计划

蓝桥杯备赛 | 洛谷做题打卡day18 文章目录 蓝桥杯备赛 | 洛谷做题打卡day18旅行计划题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示题解代码我的一些话 旅行计划 题目描述 Kira酱要去一个国家旅游。这个国家有 N N N 个城市&#xff0c;编号为 1 1 1 至 N N…

计算机网络(第六版)复习提纲11

二、CSMA/CD协议 1.广播信道上的一对一通信 2.以太网的两个措施 a)采用无连接的方法&#xff0c;不可靠 b)发送的数据都是用曼彻斯特编码 3.CSMA/CD协议&#xff08;先听后说&#xff0c;边听边说&#xff09; a)前身是ALOHA协议&#xff0c;想发就发&#xff0c;冲突时随机等待…

SpringSecurity(16)——OAuth2客户端授权模式

工作流程 基本使用 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId><version>2.3.12.RELEASE</version> </dependency> <dependency><groupId>…

大数据Doris(五十九):SQL函数之字符串函数(三)

文章目录 SQL函数之字符串函数(三) 一、​​​​​​​NULL_OR_EMPTY (VARCHAR str)

力扣1312. 让字符串成为回文串的最少插入次数

动态规划 思路&#xff1a; 通过插入字符构造回文串&#xff0c;要想插入次数最少&#xff0c;可以将字符串 s 的逆序 s 进行比较找出最长公共子序列&#xff1b;可以先分析&#xff0c;字符串 s 通过插入得到回文串 ps&#xff0c;其中间的字符应该不会变化&#xff1a; 若 s…

IO复用之epoll模型

什么是epoll epoll 是 Linux 操作系统提供的一种高性能的事件通知机制&#xff0c;用于处理大量文件描述符上的事件。它是一种 I/O 事件通知机制&#xff0c;通常用于处理网络编程中的并发连接。 在传统的 I/O 模型中&#xff0c;程序通常使用 select 或 poll 函数来等待多个…

基于springboot+vue的校园资料分享平台(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

数据灾难恢复:应对._locked勒索病毒的有效方法

导言&#xff1a; 近年来&#xff0c;网络犯罪愈发猖獗&#xff0c;其中一种威胁备受关注——._locked勒索病毒。这种恶意软件的攻击方式主要通过加密用户的数据文件&#xff0c;随后勒索受害者以解密密钥为代价。在这篇文章中&#xff0c;我们将介绍._locked勒索病毒的特点、…

qt学习:实战 http请求获取qq的吉凶

目录 利用的api是 聚合数据 的qq号码测吉凶 编程步骤 配置ui界面 添加头文件&#xff0c;定义网络管理者和http响应槽函数 在界面的构造函数里创建管理者对象&#xff0c;关联http响应槽函数 实现按钮点击事件 实现槽函数 效果 利用的api是 聚合数据 的qq号码测吉凶 先…

2024 高级前端面试题之 CSS 「精选篇」

该内容主要整理关于 CSS 的相关面试题&#xff0c;其他内容面试题请移步至 「最新最全的前端面试题集锦」 查看。 CSS模块精选篇 1. 盒模型2. BFC3. 层叠上下文4. 居中布局5. 选择器权重计算方式6. 清除浮动7. link 与 import 的区别8. CSS3的新特性9. CSS动画和过渡10. 有哪些…

LabVIEW继电器触点接触电阻自动测试

继电器作为工业中的重要组件&#xff0c;其性能直接影响着整个生产线的可靠性和安全性。触点接触电阻是衡量继电器性能的重要参数&#xff0c;传统的测试方法效率低下且成本高昂。为了解决这些问题&#xff0c;采用LabVIEW软件&#xff0c;结合专业的硬件平台&#xff0c;实现了…