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

Qt官方示例AnalogClockWindow源码阅读并理解 1. RasterWindow 运行结果2. AnalogClockWindow 运行结果3. 最重要是这个工程管理 将已有得工程代码的类引入新工程4. 重写render和timerEvent5. 窗口第一次显示、被遮挡后重新露出来时触发6. 窗口大小改变调整缓冲区大小。7. 统一接收事件内部分发处理。8. renderNow 马上重绘 renderLater 走事件9. 触发时机用户拉大窗口 → Qt 触发resizeEvent()m_backingStore-resize()重新分配画布内存。窗口暴露触发exposeEvent()直接调用renderNow()立刻画出第一帧时钟。定时器每 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核心类QWindow底层原生窗口非QWidget本身不能直接QPainter绘图。QBackingStore离屏光栅缓冲区所有绘制先画在内存最后flush刷新到屏幕防止闪烁。三个绘图函数关系renderLater()异步重绘调用requestUpdate()投递UpdateRequest事件只发请求不执行绘图等价QWidget的update()。renderNow()同步立即绘制管理QBackingStore缓冲区、创建QPainter内部调用虚函数render()最后flush上屏等价QWidget的repaint()。render(QPainter *)虚回调钩子函数子类重写只写业务绘图代码translate、rotate、绘制图形不管理缓冲区。调用链路renderLater()→ 投递更新事件 → event捕获事件 →renderNow()→render(painter)→ flush屏幕窗口事件resizeEvent窗口大小变化调整QBackingStore缓冲区内存大小不负责绘图。exposeEvent窗口显示、解除遮挡调用renderNow()立刻绘制第一帧画面。event()捕获QEvent::UpdateRequest事件触发renderNow()执行绘制。坐标系关键点QWindow绘图Y轴向下painter.rotate(正数)坐标系逆时针旋转视觉上图形顺时针偏转。