news 2026/8/31 5:05:46

Qt官方示例AnalogClockWindow源码阅读并理解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Qt官方示例AnalogClockWindow源码阅读并理解

1. RasterWindow 运行结果

2. AnalogClockWindow 运行结果

3. 最重要是这个工程管理 , 将已有得工程代码的类引入新工程


4. 重写render和timerEvent

5. 窗口第一次显示、被遮挡后重新露出来时触发

6. 窗口大小改变,调整缓冲区大小。

7. 统一接收事件,内部分发处理。

8. renderNow 马上重绘, renderLater 走事件

9. 触发时机

  1. 用户拉大窗口 → Qt 触发resizeEvent()m_backingStore->resize()重新分配画布内存。
  2. 窗口暴露,触发exposeEvent(),直接调用renderNow(),立刻画出第一帧时钟。
  3. 定时器每 1 秒触发:调用renderLater()
    • 只是调用requestUpdate()投递事件,函数马上返回;
    • 事件循环空闲,收到UpdateRequest,调用renderNow()刷新时钟画面。

10 . 两种方式处理

10.1 延时绘图

业务代码调用 renderLater()

requestUpdate() → 往事件队列扔 QEvent::UpdateRequest
↓(函数立刻返回,不画图,等待事件循环)
Qt事件循环分发事件 → RasterWindow::event()捕获UpdateRequest

调用 renderNow() 【进入真正绘制】

renderNow内部调用 render(painter) 【执行你的绘图代码:画时钟、指针、刻度】

绘制完成 flush(),画面出现在屏幕

10.2 立即绘图

窗口暴露/重新显示 → exposeEvent

直接调用 renderNow() (不走事件队列,同步立刻画)

renderNow()内部调用 render(painter)

flush上屏

总结

总结

1. 工程管理,子工程

  • Qt中可以使用subdirs模板管理多个子工程,一个pro主项目管理多个子pri/pro模块。
  • 子工程可以把功能拆分,实现代码模块化,方便复用,例如示例中rasterwindow作为基础模块给时钟示例调用。

2. 绘图和事件(QWindow底层光栅绘图 RasterWindow)

核心类

  1. QWindow:底层原生窗口,非QWidget,本身不能直接QPainter绘图。
  2. QBackingStore:离屏光栅缓冲区,所有绘制先画在内存,最后flush刷新到屏幕,防止闪烁。

三个绘图函数关系

  1. renderLater():异步重绘,调用requestUpdate()投递UpdateRequest事件;只发请求,不执行绘图,等价QWidget的update()
  2. renderNow():同步立即绘制;管理QBackingStore缓冲区、创建QPainter,内部调用虚函数render(),最后flush上屏;等价QWidget的repaint()
  3. render(QPainter *):虚回调钩子函数,子类重写,只写业务绘图代码(translate、rotate、绘制图形),不管理缓冲区。

调用链路:
renderLater()→ 投递更新事件 → event捕获事件 →renderNow()render(painter)→ flush屏幕

窗口事件

  • resizeEvent:窗口大小变化,调整QBackingStore缓冲区内存大小,不负责绘图
  • exposeEvent:窗口显示、解除遮挡,调用renderNow()立刻绘制第一帧画面。
  • event():捕获QEvent::UpdateRequest事件,触发renderNow()执行绘制。

坐标系关键点

  • QWindow绘图Y轴向下;
  • painter.rotate(正数)坐标系逆时针旋转,视觉上图形顺时针偏转
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/31 5:04:46

Spark电商用户行为分析系统:源码拆解与生产实践

简介:本资源是一套基于Spark构建的电商用户行为分析系统完整实现,面向计算机专业本科生、毕业设计学生及大数据初学者,解决电商场景下海量用户行为数据的采集、清洗、分析与可视化问题。资源包共286个文件,含40个核心Java业务逻辑…

作者头像 李华
网站建设 2026/8/31 4:58:47

网易2023校招移动端笔试全解析:考点分布与备考策略

这场笔试过去有一段时间了,但直到现在我还能想起考场里那种"题量不少、范围很杂、编程题一上来就是模拟题"的感觉。网易2023校招笔试的移动端开发工程师正式第二批,整体难度不算离谱,但它对知识面的要求,明显和纯后端、…

作者头像 李华
网站建设 2026/8/31 4:58:42

DLLM实践:基于llama.cpp和GGUF构建极简本地coding agent

如果你最近在关注 AI 编程助手,应该已经感受到 coding agent 的热度:从云端 IDE 到各种 Agent 框架,好像一夜之间所有工具都在往“自动写代码”方向走。但落到实际开发里,很多人会遇到一个尴尬局面——本地想跑一个真正可控、真正…

作者头像 李华
网站建设 2026/8/31 4:57:16

互联网经济学家笔试备考:从经济学思维到商业分析能力

第一次看到“快手2019春季校园招聘笔试试题-经济学家试卷B”这个标题时,我的第一反应是“赶紧把宏微观经济学教材翻出来背一遍”。但真正刷完这类试卷后,我才意识到一个反直觉的事实:互联网公司招“经济学家”,笔试考的从来不是课…

作者头像 李华
网站建设 2026/8/31 4:56:42

STM32步进电机控制系统:状态机与加减速算法实战解析

简介:本资源是一套基于STM32F103的步进电机闭环控制完整开发套件,面向嵌入式初学者、课程设计学生及单片机实践开发者,解决电机控制中启停抖动、加减速不平滑、多指令切换卡顿等典型工程痛点。压缩包共131个文件,含KEIL5源代码&am…

作者头像 李华
网站建设 2026/8/31 4:55:39

贝壳找房2023届开发类试卷深度拆解:考点与备考策略

如果你正在准备2023届校招,看到“贝壳找房2023届开发类试卷”这个关键词,大概率会下意识地去搜“能不能找到原题”“有没有答案”“题型是什么”。我帮几位学弟学妹做过校招复盘,也从招聘流程、岗位要求、面试反馈里反推过这类试卷的设计逻辑…

作者头像 李华